企业级日志平台新秀Graylog,比ELK轻量多了

分享于2021年11月18日 平台
更多内容关注微信公众号:fullstack888当我们公司内部部署很多服务以及测试、正式环境的时候,查看日志就变成了一个非常刚需的需求了。是多个环境的日志统一收集,然后使用 Nginx 对外提供服务,还是使用专用的日志收集服务 ELK 呢?这就变成了一个问题!而 Graylog 作为整合方案,使用 elasticsearch 来存储,使用 mongodb 来缓存,并且还有带流量控制的 (throttling),同时其界面查询简单易用且易于扩展。所以,使用 Graylog 成为了不二之选,为我们省了不少心。1. Filebeat 工具介绍服务日志收集方案:Filebeat + Graylog![1] Filebeat - 日志文件托运服务Filebeat 是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat 会自动监控给定的日志目录或者指定的日志文件,追踪读取这些文件,不停的读取,并且转发这些信息到 elasticsearch 或者 logstarsh 或者 graylog 中存放。[2] Filebeat - 工作流程介绍当你安装并启用 filebeat 程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat 都会启动一个收割进程(harvester),每一个收割进程读取一个日志文件的最新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后 filebeat 会发送集合的数据到你指定的地址上去(我们这里就是发送给graylog服务了)。[3] Filebeat - 图示理解记忆我们这里不适用 logstash 服务,主要是因为 filebeat 相比于 logstash 更加轻量级。当我们需要收集信息的机器配置或资源并不是特别多时,且并没有那么复杂的时候,还是建议使用 filebeat 来收集日志。日常使用中,filebeat 的安装部署方式多样且运行十分稳定。图示服务架构理解记忆2. Filebeat 配置文件配置 Filebeat 工具的核心就是如何编写其对应的配置文件!对应 Filebeat 工具的配置主要是通过编写其配置文件来控制的,对于通过 rpm 或者 deb 包来安装的情况,配置文件默认会存储在,/etc/filebeat/filebeat.yml 这个路径下面。而对于,对于 MAC 或者 Win 系统来说,请查看解压文件中相关文件,其中都有涉及。下面展示了 Filebeat 工具的主配置文件,注释信息中都对其各个字段含义进行了详细的解释,我这里就不再赘述了。需要注意的是,我们将日志的输入来源统统定义去读取 inputs.d 目录下的所有 yml 配置。所以,我们可以更加不用的服务(测试、正式服务)来定义不同的配置文件,根据物理机部署的实际情况具体配置。# 配置输入来源的日志信息# 我们合理将其配置到了inputs.d目录下的所有yml文件filebeat.config.inputs: enabled: true path: ${path.config}/inputs.d/*.yml # 若收取日志格式为json的log请开启此配置 # json.keys_under_root: true# 配置filebeat需要加载的模块filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: falsesetup.template.settings: index.number_of_shards: 1# 配置将日志信息发送那个地址上面output.logstash: hosts: [\"11.22.33.44:5500\"]# output.file:# enable: trueprocessors: - add_host_metadata: ~ - rename: fields: - from: \"log\" to: \"message\" - add_fields: target: \"\" fields: # 加token是为了防止无认证的服务上Graylog服务发送数据 token: \"0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX \"下面展示一个简单的 inputs.d 目录下面的 yml 配置文件的具体内容,其主要作用就是配置单独服务的独立日志数据,以及追加不同的数据 tag 类型。# 收集的数据类型- type: log enabled: true # 日志文件的路径地址 paths: - /var/log/supervisor/app_escape_worker-stderr.log - /var/log/supervisor/app_escape_prod-stderr.log symlinks: true # 包含的关键字信息 include_lines: [\"WARNING\", \"ERROR\"] # 打上数据标签 tags: [\"app\", \"escape\", \"test\"] # 防止程序堆栈信息被分行识别 multiline.pattern: '^\[?[0-9]...{3}' multiline.negate: true multiline.match: after# 需要配置多个日志时可加多个type字段- type: log enabled: true ......需要注意的是,针对于不同的日志类型,filebeat 还提供了不同了模块来配置不同的服务日志以及其不同的模块特性,比如我们常见的 PostgreSQl、Redis、Iptables 等。# iptables- module: iptables log: enabled: true var.paths: [\"/var/log/iptables.log\"] var.input: \"file\"# postgres- module: postgresql log: enabled: true var.paths: [\"/path/to/log/postgres/*.log*\"]# nginx- module: nginx access: enabled: true var.paths: [\"/path/to/log/nginx/access.log*\"] error: enabled: true var.paths: [\"/path/to/log/nginx/error.log*\"]3. Graylog 服务介绍服务日志收集方案:Filebeat + Graylog![1] Graylog - 日志监控系统Graylog 是一个开源的日志聚合、分析、审计、展现和预警工具。在功能上来说,和 ELK 类似,但又比 ELK 要简单很多。依靠着更加简洁,高效,部署使用简单的优势很快受到许多人的青睐。当然,在扩展性上面确实没有比 ELK 好,但是其有商业版本可以选择。[2] Graylog - 工作流程介绍部署 graylog 最简单的架构就是单机部署,复杂的也是部署集群模式,架构图示如下所示。我们可以看到其中包含了三个组件,分别是 Elasticsearch、MongoDb 和 Graylog。其中,Elasticsearch 用来持久化存储和检索日志文件数据(IO 密集),MongoDb 用来存储关于 Graylog 的相关配置,而 Graylog 来提供 Web 界面和对外接口的(CPU 密集)。最小化单机部署最优化集群部署4. Graylog 组件功能配置 Graylog 服务的核心就是理解对应组件的功能以及其运作方式!简单来讲,Input 表示日志数据的来源,对不同来源的日志可以通过 Extractors 来进行日志的字段转换,比如将 Nginx 的状态码变成对应的英文表述等。然后,通过不同的标签类型分组成不用的 Stream,并将这些日志数据存储到指定的 Index 库中进行持久化保存。编号组件名称功能介绍主要特点1Dashboards数据面板固定展示主要是用来保存特定搜索条件的数据面板2Searching日志信息条件搜索关键字搜索、时间搜索、搜索保存、创建面板、分组查询、结果导出、查询高亮显示、自定义时间3Alert设置告警提示方式支持邮件告警、HTTP 回调和自定义脚本触发4Inputs日志数据抓取接收部署 Sidercar 主动抓取或使用其他服务被动上报5Extractors日志数据格式转换json 解析、kv 解析、时间戳解析、正则解析6Streams日志信息分类分组设置日志分类条件并发送到不同的索引文件中去7Indices持久化数据存储设置数据存储性能8Outputs日志数据的转发解析的 Stream 发送到其他 Graylog 集群或服务9Pipelines日志数据的过滤建立数据清洗的过滤规则、字段添加删除、条件过滤、自定义函数等10Sidecar轻量级的日志采集器相当于 C/S 模式;大规模时使用11Lookup Tables服务解析基于 IP 的 Whois 查询和基于来源 IP 的情报监控12Geolocation可视化地理位置实现基于来源 IP 的情报监控Graylog中的核心服务组件Graylog 通过 Input 搜集日志,每个 Input 单独配置 Extractors 用来做字段转换。Graylog 中日志搜索的基本单位是 Stream,每个 Stream 可以有自己单独的 Elastic Index Set,也可以共享一个 Index Set。Extractor 在 System/Input 中配置。Graylog 中很方便的一点就是可以加载一条日志,然后基于这个实际的例子进行配置并能直接看到结果。内置的 Extractor 基本可以完成各种字段提取和转换的任务,但是也有些限制,在应用里写日志的时候就需要考虑到这些限制。Input 可以配置多个 Extractors,按照顺序依次执行。系统会有一个默认的 Stream,所有日志默认都会保存到这个 Stream 中,除非匹配了某个 Stream,并且这个 Stream 里配置了不保存日志到默认 Stream。可以通过菜单 Streams 创建更多的 Stream,新创建的 Stream 是暂停状态,需要在配置完成后手动启动。Stream 通过配置条件匹配日志,满足条件的日志添加 stream ID 标识字段并保存到对应的 Elastic Index Set 中。Index Set 通过菜单 System/Indices 创建。日志存储的性能,可靠性和过期策略都通过 Index Set 来配置。性能和可靠性就是配置 Elastic Index 的一些参数,主要参数包括,Shards 和 Replicas。除了上面提到的日志处理流程,Graylog 还提供了 Pipeline 脚本实现更灵活的日志处理方案。这里不详细阐述,只介绍如果使用 Pipelines 来过滤不需要的日志。下面是丢弃 level > 6 的所有日志的 Pipeline Rule 的例子。从数据采集(input),字段解析(extractor),分流到 stream,再到 pipeline 的清洗,一气呵成,无需在通过其他方式进行二次加工。Sidecar 是一个轻量级的日志采集器,通过访问 graylog 进行集中式管理,支持 linux 和 windows 系统。Sidecar 守护进程会定期访问 graylog 的 REST API 接口获取 Sidecar 配置文件中定义的标签(tag) ,Sidecar 在首次运行时会从 graylog 服务器拉取配置文件中指定标签(tag) 的配置信息同步到本地。目前 Sidecar 支持 NXLog,Filebeat 和 Winlogbeat。他们都通过 graylog 中的 web 界面进行统一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等输出类型。Graylog 最厉害的在于可以在配置文件中指定 Sidecar 把日志发送到哪个 graylog 群集,并对 graylog 群集中的多个 input 进行负载均衡,这样在遇到日志量非常庞大的时候,graylog 也能应付自如。rule \"discard debug messages\"when to_long($message.level) > 6then drop_message();end日志集中保存到 Graylog 后就可以方便的使用搜索了。不过有时候还是需要对数据进行近一步的处理。主要有两个途径,分别是直接访问 Elastic 中保存的数据,或者通过 Graylog 的 Output 转发到其它服务。5. 服务安装和部署主要介绍部署 Filebeat + Graylog 的安装步骤和注意事项!使用Graylog来收集日志[1] 部署 Filebeat 工具官方提供了多种的部署方式,包括通过 rpm 和 deb 包安装服务,以及源代码编译的方式安装服务,同时包括了使用 Docker 或者 kubernetes 的方式安装服务。我们根据自己的实际需要,进行安装即可。# Ubuntu(deb)$ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-amd64.deb$ sudo dpkg -i filebeat-7.8.1-amd64.deb$ sudo systemctl enable filebeat$ sudo service filebeat start# 使用docker启动docker run -d --name=filebeat --user=root \ --volume=\"./filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro\" \ --volume=\"/var/lib/docker/containers:/var/lib/docker/containers:ro\" \ --volume=\"/var/run/docker.sock:/var/run/docker.sock:ro\" \ docker.elastic.co/beats/filebeat:7.8.1 filebeat -e -strict.perms=false \ -E output.elasticsearch.hosts=[\"elasticsearch:9200\"]使用Graylog来收集日志[2] 部署 Graylog 服务我们这里主要介绍使用 Docker 容器来部署服务,如果你需要使用其他方式来部署的话,请自行查看官方文档对应章节的安装部署步骤。在服务部署之前,我们需要给 Graylog 服务生成等相关信息,生成部署如下所示:# 生成password_secret密码(最少16位)$ sudo apt install -y pwgen$ pwgen -N 1 -s 16zscMb65...FxR9ag# 生成后续Web登录时所需要使用的密码$ echo -n \"Enter Password: \" && head -1