📚概述
对于日志监控业界常用的有
ELK
、Loki
、Graylog
等系统,最近在做技术选型时,对比了各个系统的情况,Graylog
的一体化方案很符合现有需求。Graylog
算是轻量级的ELK
,也有很多企业在使用Graylog
查看日志和监控业务日志。Graylog
中文资料相对较少,在技术选型和开发过程中对资料进行整理。Graylog
包含了告警、归档(商业版)、面板、日志查看、Rest API
、组管理等功能。本文主要介绍Graylog
的相关组件和基本流程。
📗Graylog简介
Graylog 开源版官网: https://www.graylog.org/Graylog
是一个开源的日志聚合、分析、审计、展现和预警工具。
在功能上来说,和 ELK
类似,但又比 ELK
要简单很多。依靠着更加简洁,高效,部署使用简单的优势很快受到许多人的青睐。
当然,在扩展性上面确实没有比 ELK
好,但是其有商业版本可以选择。
📐Graylog-工作流程
部署 graylog
最简单的架构就是单机部署,复杂的也是部署集群模式,架构图示如下所示。我们可以看到其中包含了三个组件,分别是 Elasticsearch
、MongoDb
和 Graylog
。
其中,Elasticsearch
用来持久化存储和检索日志文件数据(IO 密集
),MongoDb
用来存储关于 Graylog
的相关配置信息,而 Graylog
来提供 Web
界面和对外接口(CPU 密集
)。
数据处理流程:
- 日志消息通过各种
Input
输入到Graylog
中进行处理; - 可以通过
Extractors
进行正则、Json
等形式解析; - 通过
Streams
进行规则匹配分流,对Stream
可以配置Pipeline
进行数据过滤,最终数据会到到不同的index
中; - 根据新建
index
时配置的策略,在elasticsearch
的索引中; - 告警(
Alert
)基于Stream
进行设置。
🖥Graylog部署方案
最小化单机部署:
最优化集群部署:
📘Graylog组件
配置
Graylog
的核心:
- 理解对应组件的功能
- 了解组件的运行方式
🧩Graylog组件全貌图
💡组件简介
Input
表示日志数据的来源,对不同来源的日志可以通过 Extractors
来进行日志的字段转换,比如对Nginx
访问日志进行字段拆分,解析状态码、URL
等数据。然后可以通过pipeline
建立数据过滤规则。最后,通过不同的标签类型分组成不同的 Stream
,并将这些日志数据存储到指定的 Index
库中进行持久化保存。Graylog
的中index
对应elasticsearch
中的多个index
(与graylog
中index
配置的rotation strategy
和retention strategy
有关)。
组件名称 | 功能介绍 | 主要特点 |
Dashboards | 数据面板固定展示 | 主要是用来保存特定搜索条件的数据面板 |
Search | 日志信息条件搜索 | 关键字搜索、时间搜索、搜索保存、创建面板、分组查询、结果导出、查询高亮显示、自定义时间 |
Alerts | 设置告警提示方式 | 支持邮件告警、HTTP回调和自定义脚本触发 |
Inputs | 日志数据抓取接收 | 部署 Sidercar 主动抓取或使用其他服务被动上报 |
Extractors | 日志数据格式转换 | json 解析、k-v 解析、时间戳解析、正则解析 |
Streams | 日志信息分类分组 | 设置日志分类条件并发送到不同的索引文件中去 |
Indices | 持久化数据存储 | 设置数据存储性能 |
Outputs | 日志数据的转发 | 解析的 Stream 发送到其他 Graylog 集群或服务 |
Pipelines | 日志数据的过滤 | 建立数据清洗的过滤规则、字段添加删除、条件过滤、自定义函数等 |
Sidecar | 轻量级的日志采集器 | 相当于 C/S 模式;大规模时使用 |
Lookup Tables | 服务解析 | 基于 IP 的 Whois 查询和基于来源 IP 的情报监控 |
Geolocation | 可视化地理位置 | 实现基于来源 IP 的情报监控 |
❗️注意:
Extractors
是基于input
配置的,Pipeline
基于Stream
配置。- 一个
input
可以配置多个Extractors
,按照顺序依次执行;一个Stream
可以配置多个Pipeline
规则,可以分阶段进行处理。- 一个
index
可以配置多个Stream
,配置过多会影响查询效率。- 告警是基于
Stream
配置。
⛳Graylog中的核心服务组件
input
Graylog
通过Input
搜集日志,每个Input
单独配置Extractors
用来做字段转换。Graylog
中日志搜索的基本单位是Stream
,每个Stream
可以有自己单独的Index Set
,也可以共享一个Index Set
。
Extractor
在 System/Input
中配置。Graylog
中很方便的一点就是可以加载一条日志,然后基于这个实际的例子进行配置并能直接看到结果。内置的 Extractor
基本可以完成各种字段提取和转换的任务,但是也有些限制,在应用里写日志的时候可以指定日志格式来规避这些限制。Input
可以配置多个Extractors
,按照顺序依次执行。Input
的中有一个GELF形式的,在Spring Boot
接入的时候在引入Maven
依赖的时候也有GELF的字样。
这块在官网也有给出对应的解释:The Graylog Extended Log Format (GELF) is a log format that avoids the shortcomings of classic plain syslog
详细资料:https://docs.graylog.org/docs/gelfGELF
是一种日志格式,能避免传统意义上的 syslogs
的一些缺陷:
- 长度限制为1024字节。
- 数据类型无法区分,数字和字符串是无法区分的。
- 无压缩。
Spring Boot
项目引入的Maven
依赖则是把日志格式化成GELF
格式然后append
到GrayLog
上。
Index Set
通过菜单 System/Indices
创建。日志存储的性能,可靠性和过期策略都通过 Index Set
来配置。日志的过期策略,可以通过配置rotation strategy
为Index Time
,retention strategy
配置为Delete index
来实现按天保存日志。性能和可靠性就是配置ElasticSearch Index
的一些参数,主要参数包括Shards
和 Replicas
。
Stream
系统会有一个默认的 Stream
,所有日志默认都会保存到这个 Stream
中,除非匹配了某个 Stream
,并且这个 Stream
里配置了不保存日志到默认 Stream
。
可以通过菜单 Streams
创建更多的 Stream
,新创建的 Stream
是默认是暂停状态,需要在配置完成后手动启动。Stream
通过配置条件匹配日志,满足条件的日志添加 stream ID
标识字段(字段名称为streams
,是一个数组)并保存到对应的 Index Set
中。
pipeline
Graylog
还提供了 Pipeline
脚本实现更灵活的日志处理方案。
主要流程:数据采集(input) ->字段解析(extractor)->分流到 stream->pipeline 清洗
实际使用过程中,分流到Stream
的规则中可能会用到pipeline
清晰后的字段,那么该如何处理呢?Graylog
接收的所有消息最初都会路由到“All messges
”流中。可以将此流用作pipeline
处理的入口点,从而允许将传入消息路由到更多流并随后进行处理。也就是说所有消息的过滤、字段变动可以先针对All messages
进行,然后在到达其他stream
时数据已经被清理一次了。
下面是丢弃 level > 6
的所有日志的 Pipeline Rule
的例子。
rule "discard debug messages"
when
to_long($message.level) > 6
then
drop_message();
end
Sidecar
sidecar
是Graylog 3.0
新增的功能,依旧支持原有的System / Collectors (legacy)
收集器,但是官方推荐使用sidecar
。Sidecar
是一个轻量级的日志采集器,通过访问 graylog
进行集中式管理,支持 linux
和 windows
系统。在主机或设备上,Sidecar
可以作为服务(Windows
)或守护程序(Linux
)运行。
Sidecar
守护进程会定期访问 graylog
的 REST API
接口获取 Sidecar
配置文件,Sidecar
在首次运行或检测到配置更改时,会从 graylog
服务器拉取配置文件中的配置信息同步到本地,实现配置更新。首次配置需要在graylog
上进行配置下发操作。
Sidecar
支持 NXLog
,Filebeat
和 Winlogbeat
。他们都通过 graylog
中的 web
界面进行统一配置,支持 Beats
、CEF
、Gelf
、Json API
、NetFlow
等输出类型。Graylog
最厉害的在于可以在配置文件中指定 Sidecar
把日志发送到哪个 graylog
群集,并对 graylog
群集中的多个 input
进行负载均衡,这样在遇到日志量非常庞大的时候,graylog
也能应付自如。
版本选择
Sidecar version | Graylog server version |
1.2.x | 3.2.5 or higher |
1.1.x | 3.2.5 or higher |
1.0.x | 3.0 or higher |
0.1.x | 2.2.x, 2.3.x, 2.4.x, 2.5.x, 3.0.x, 4.0.x |
0.0.9 | 2.1.x |
官网:https://docs.graylog.org/docs/sidecar
Output
日志集中保存到 Graylog
后就可以方便的使用搜索了。如果需要对日志进行二次处理,主要有两个途径:
- 直接访问 Elastic 中保存的数据,处理数据;
- 通过
Graylog
的Output
转发到其它服务,在进行处理。