解决方案:替代ELK?分布式日志收集 后起之秀 Graylog
优采云 发布时间: 2022-11-12 05:23解决方案:替代ELK?分布式日志收集 后起之秀 Graylog
大家好,我不是蔡晨~
今天给大家介绍另一个分布式日志采集中间件Graylog。作为后起之秀,也是不错的选择~
"
B站搜索:码猿技术专栏,序列化OAuth2.0实战教程~
”| Filebeat工具介绍
服务日志采集方案:Filebeat + Graylog!
Filebeat 日志文件传送服务
Filebeat 是一个日志文件传送工具。在您的服务器上安装客户端后,Filebeat 会自动监控给定的日志目录或指定的日志文件,跟踪并读取这些文件,不断地读取它们,并将信息转发到存储在 Elasticsearch 或 Logstarsh 或 Graylog 中。
Filebeat 工作流程简介
当您安装并启用 Filebeat 程序时,它会启动一个或多个探测器(prospectors)来检测您指定的日志目录或文件。对于probe发现的每一个日志文件,Filebeat都会启动一个收割进程(harvester),每个收割进程读取一个日志文件的最新内容,并将这些新的日志数据发送给处理程序(spooler),处理程序会采集这些事件,最后Filebeat会将采集到的数据发送到你指定的地址。(我们在这里发送到 Graylog 服务)。
Filebeat图看懂内存
我们这里没有应用 Logstash 服务,主要是因为 Filebeat 比 Logstash 更轻量级。当我们需要采集信息的机器配置或者资源不是特别大,也没有那么复杂的时候,推荐使用Filebeat来采集日志。在日常使用中,Filebeat有多种安装部署方式,运行非常稳定。
图形化服务架构理解内存
| 文件节拍配置文件
配置Filebeat工具的核心是如何编写其对应的配置文件!
对应的Filebeat工具的配置主要是通过编写其配置文件来控制的。对于rpm或deb包安装,配置文件默认存放在路径/etc/filebeat/filebeat.yml下。Mac或Win系统请查看解压后的相关文件,均涉及。
Filebeat工具的主要配置文件如下图所示。每个字段的含义在评论信息中有详细解释,这里不再赘述。需要注意的是,我们定义了日志的所有输入源来读取inputs.d目录下的所有yml配置。因此,我们可以针对不同的服务(测试、正式服务)定义不同的配置文件,根据物理机部署的实际情况进行配置。
# 配置输入来源的日志信息<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># 我们合理将其配置到了 inputs.d 目录下的所有 yml 文件<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />filebeat.config.inputs:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> enabled: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> path: ${path.config}/inputs.d/*.yml<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> # 若收取日志格式为 json 的 log 请开启此配置<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> # json.keys_under_root: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># 配置 Filebeat 需要加载的模块<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />filebeat.config.modules:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> path: ${path.config}/modules.d/*.yml<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> reload.enabled: false<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />setup.template.settings:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> index.number_of_shards: 1<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># 配置将日志信息发送那个地址上面<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />output.logstash:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> hosts: ["11.22.33.44:5500"]<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># output.file:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># enable: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />processors:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> - add_host_metadata: ~<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> - rename:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> fields:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> - from: "log"<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> to: "message"<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> - add_fields:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> target: ""<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> fields:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> # 加 Token 是为了防止无认证的服务上 Graylog 服务发送数据<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> token: "0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX "<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
下面展示了inputs.d目录下一个简单的yml配置文件的具体内容。它的主要功能是配置独立服务的独立日志数据,并附加不同的数据标签类型。
# 收集的数据类型<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />- type: log<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> enabled: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> # 日志文件的路径地址<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> paths:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> - /var/log/supervisor/app_escape_worker-stderr.log<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> - /var/log/supervisor/app_escape_prod-stderr.log<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> symlinks: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> # 包含的关键字信息<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> include_lines: ["WARNING", "ERROR"]<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> # 打上数据标签<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> tags: ["app", "escape", "test"]<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> # 防止程序堆栈信息被分行识别<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> multiline.pattern: '^\[?[0-9]...{3}'<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> multiline.negate: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> multiline.match: after<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># 需要配置多个日志时可加多个 type 字段<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />- type: log<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> enabled: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> ......<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
需要注意的是,针对不同的日志类型,filebeat还提供了不同的模块来配置不同的服务日志及其不同的模块特性,比如我们常见的PostgreSQl、Redis、Iptables等。
# iptables<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />- module: iptables<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> log:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> enabled: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> var.paths: ["/var/log/iptables.log"]<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> var.input: "file"<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># postgres<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />- module: postgresql<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> log:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> enabled: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> var.paths: ["/path/to/log/postgres/*.log*"]<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># nginx<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />- module: nginx<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> access:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> enabled: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> var.paths: ["/path/to/log/nginx/access.log*"]<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> error:<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> enabled: true<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> var.paths: ["/path/to/log/nginx/error.log*"]<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
| Graylog服务介绍
服务日志采集方案:Filebeat + Graylog!
Graylog日志监控系统
Graylog 是一个开源的日志聚合、分析、审计、展示和预警工具。在功能上,它与 ELK 类似,但比 ELK 简单得多。凭借更简洁、高效、易于部署和使用的优势,迅速受到了很多人的青睐。当然,在扩展性方面并不比 ELK 好,但也有商业版本可供选择。
Graylog工作流程简介
部署 Graylog 最简单的架构是单机部署,更复杂的部署是集群模式。架构图如下所示。我们可以看到它收录三个组件,分别是 Elasticsearch、MongoDB 和 Graylog。其中,Elasticsearch 用于持久存储和检索日志文件数据(IO 密集型),MongoDB 用于存储有关 Graylog 的相关配置,Graylog 用于提供 Web 接口和外部接口(CPU 密集型)。
最小的独立部署
优化集群部署
| Graylog 组件特性
配置一个 Graylog 服务的核心是了解对应的组件是做什么的以及它是如何工作的!
简单来说,Input 代表日志数据的来源。对于不同来源的日志,可以使用Extractors对日志的字段进行转换,比如将Nginx的状态码改成对应的英文表达。然后,将不同类型的标签分组到不同的流中,将这些日志数据存储在指定的Index库中进行持久化存储。
Graylog 中的核心服务组件
Graylog 通过 Input 采集日志,每个 Input 都配置了 Extractors 进行字段转换。Graylog中日志搜索的基本单位是Stream。每个 Stream 可以有自己的 Elastic Index Set 或共享一个 Index Set。
提取器在系统/输入中配置。Graylog 的一个方便之处是您可以加载日志,根据这个实际示例对其进行配置,并直接查看结果。内置的Extractor基本可以完成各种字段的提取和转换任务,但也有一定的局限性,需要在应用程序中写日志时加以考虑。Input可以配置多个Extractor,依次执行。
系统会有一个默认的Stream,所有的日志都会默认保存到这个Stream,除非匹配到了一个Stream,并且这个Stream被配置为不保存日志到默认的Stream。可以通过菜单 Streams 创建更多 Streams。新创建的 Stream 处于暂停状态,需要在配置完成后手动启动。Stream通过配置条件匹配日志,满足条件的日志添加stream ID标识字段,保存到对应的Elastic Index Set中。
索引集是通过菜单系统/索引创建的。日志存储的性能、可靠性和过期策略都是通过Index Set来配置的。性能和可靠性是配置 Elastic Index 的一些参数。主要参数包括 Shards 和 Replica。
除了上面提到的日志处理流程,Graylog 还提供了一个 Pipeline 脚本来实现更灵活的日志处理方案。此处不赘述,仅介绍是否使用 Pipelines 过滤不需要的日志。下面是一个管道规则的示例,它丢弃所有级别> 6的日志。从数据采集(输入),字段分析(提取器),分流到流,再到管道清理,一次完成,没有需要通过其他方式进行二次加工。
Sidecar 是一个轻量级的日志采集器,通过访问 Graylog 进行集中管理,支持 Linux 和 Windows 系统。Sidecar 守护进程定期访问 Graylog REST API 以获取在 sidecar 配置文件中定义的标签。Sidecar第一次运行时,从Graylog服务器拉取配置文件中指定标签的配置信息,同步到本地。目前 Sidecar 支持 NXLog、Filebeat 和 Winlogbeat。在 Graylog 中都是通过 web 界面统一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等输出类型。 Graylog 最强大的地方是可以在配置文件,并对 Graylog 集群中的多个输入进行负载均衡,
rule "discard debug messages"<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />when<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> to_long($message.level) > 6<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />then<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> drop_message();<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />end<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
日志集中保存到 Graylog 后,可以方便地进行搜索。但是,有时需要进一步处理数据。主要有两种方式,一种是直接访问存储在 Elastic 中的数据,或者通过 Graylog 的 Output 转发给其他服务。
| 服务安装部署
主要介绍了部署Filebeat+Graylog的安装步骤和注意事项!
使用 Graylog 采集日志
部署 Filebeat 工具
官方提供了多种部署方式,包括通过rpm和deb包安装服务,以及通过源码编译安装服务,还包括使用Docker或者kubernetes安装服务。我们可以根据自己的实际需要进行安装:
# Ubuntu(deb)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-amd64.deb<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ sudo dpkg -i filebeat-7.8.1-amd64.deb<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ sudo systemctl enable filebeat<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ sudo service filebeat start<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
# 使用 Docker 启动<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />docker run -d --name=filebeat --user=root \<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> --volume="./filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> docker.elastic.co/beats/filebeat:7.8.1 filebeat -e -strict.perms=false \<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> -E output.elasticsearch.hosts=["elasticsearch:9200"]<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
部署 Graylog 服务
这里主要介绍使用Docker容器部署服务。如需使用其他方式部署,请查看官方文档相应章节的安装部署步骤。在部署服务之前,我们需要为 Graylog 服务生成等相关信息。生成的部署如下:
<p># 生成 password_secret 密码(最少 16 位)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ sudo apt install -y pwgen<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ pwgen -N 1 -s 16<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />zscMb65...FxR9ag<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /># 生成后续 Web 登录时所需要使用的密码<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ echo -n "Enter Password: " && head -1