概况
syslog是一种工业标准的协议,可用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,藉以追踪掌握与设备和网络有关的状况。
问题
在Unix类操作系统上,syslog广泛应用于系统日志。syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见的应用场景是网络管理工具、安全管理系统、日志审计系统。
但是,长期以来,没有一个标准来规范syslog的格式,导致syslog的格式是非常随意的。最坏的情况下,根本就没有任何格式,导致程序不能对syslog 消息进行解析,只能将它看作是一个字符串。对syslog日志解析一直是比较令人头疼的事情,本篇介绍如何使用LOG DSL中的grok高效快捷的去解析不同格式的syslog日志
解决方案
syslog协议标准
目前业界存在常见两种syslog日志协议,一个是2009年起草协议RFC524,另外一个是2001年的RFC3164协议。以下,为大家介绍这两种协议的不同之处,以便能够在以后实践中能够灵活应用grok解析syslog日志。
RFC5424协议
RFC5424协议包含以下字段信息,具体信息可以参考官方协议(https://tools.ietf.org/html/rfc5424)
PRI VERSION SP TIMESTAMP SP HOSTNAME SP APP-NAME SP PROCID SP MSGID
以下通过几个示例来解释以上字段代表信息:
"""
Example1:
<34>1 2019-07-11T22:14:15.003Z aliyun.example.com ali - ID47 - BOM'su root' failed for lonvick on /dev/pts/8
"""
PRI -- 34
VERSION -- 1
TIMESTAMP -- 2019-07-11T22:14:15.003Z
HOSTNAME -- aliyun.example.com
APP-NAME -- ali
PROCID -- 无
MSGID -- ID47
MESSAGE -- 'su root' failed for lonvick on /dev/pts/8
"""
Example-2:
<165>1 2019-07-11T22:14:15.000003-07:00 192.0.2.1 myproc 8710 - - %% It's time to make the do-nuts.
"""
PRI -- 165
VERSION -- 1
TIMESTAMP -- 2019-07-11T05:14:15.000003-07:00
HOSTNAME -- 192.0.2.1
APP-NAME -- myproc
PROCID -- 8710
STRUCTURED-DATA -- “-”
MSGID -- “-”
MESSAGE -- "%% It's time to make the do-nuts."
"""
Example3: - with STRUCTURED-DATA
<165>1 2019-07-11T22:14:15.003Z aliyun.example.com
evntslog - ID47 [exampleSDID@32473 iut="3" eventSource=
"Application" eventID="1011"] BOMAn application
event log entry...
"""
PRI -- 165
VERSION -- 1
TIMESTAMP -- 2019-07-11T22:14:15.003Z
HOSTNAME -- aliyun.example.com
APP-NAME -- evntslog
PROCID -- "-"
MSGID -- ID47
STRUCTURED-DATA -- [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"]
MESSAGE -- An application event log entry...
RFC3164协议
RFC3164协议包含以下字段信息,具体信息可以参考官方协议(https://tools.ietf.org/html/rfc3164)
PRI HEADER[TIME HOSTNAME] MSG
以下通过几个示例来解释以上字段代表信息:
"""
<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
"""
PRI -- 30
HEADER
- TIME -- Oct 9 22:33:20
- HOSTNAME -- hlfedora
MSG
- TAG -- auditd[1787]
- Content --The audit daemon is exiting.
grok解析syslog常见格式
以上内容介绍了syslog,接下来进入实践解析阶段。在syslog配置文件中为用户定制了几种常用格式的syslog,以下使用grok一一解析。此外,syslog采集到logstore上要使用文本格式采集。
具体的grok规则可参考grok模式参考:
TraditionalFormat格式
日志内容形式如下:
May 5 10:20:57 iZbp1a65x3r1vhpe94fi2qZ systemd: Started System Logging Service.
LOG DSL编排规则处理:
"""
处理前日志格式:
receive_time: 1558663265
__topic__:
content: May 5 10:20:57 iZbp1a65x3r1vhpe94fi2qZ systemd: Started System Logging Service.
处理后日志格式:
receive_time: 1558663265
__topic__:
content: May 5 10:20:57 iZbp1a65x3r1vhpe94fi2qZ systemd: Started System Logging Service.
timestamp: May 5 10:20:57
logsource: iZbp1a65x3r1vhpe94fi2qZ
program: systemd
message: Started System Logging Service.
"""
e_regex('content', grok('%{SYSLOGBASE} %{GREEDYDATA:message}'))
FileFormat格式
日志内容形式如下:
2019-05-06T09:26:07.874593+08:00 iZbp1a65x3r1vhpe94fi2qZ root: 834753
LOG DSL编排规则处理:
"""
处理前日志格式:
receive_time: 1558663265
__topic__:
content: 2019-05-06T09:26:07.874593+08:00 iZbp1a65x3r1vhpe94fi2qZ root: 834753
处理后日志格式:
receive_time: 1558663265
__topic__:
content: 2019-05-06T09:26:07.874593+08:00 iZbp1a65x3r1vhpe94fi2qZ root: 834753
timestamp: 2019-05-06T09:26:07.874593+08:00
hostname: iZbp1a65x3r1vhpe94fi2qZ
program: root
message: 834753
"""
e_regex('content',grok('%{TIMESTAMP_ISO8601:timestamp} %{SYSLOGHOST:hostname} %{SYSLOGPROG} %{GREEDYDATA:message}'))
RSYSLOG_SyslogProtocol23Format格式
日志内容形式如下:
<13>1 2019-05-06T11:50:16.015554+08:00 iZbp1a65x3r1vhpe94fi2qZ root - - - twish
LOG DSL编排规则处理:
"""
处理前日志格式:
receive_time: 1558663265
__topic__:
content: <13>1 2019-05-06T11:50:16.015554+08:00 iZbp1a65x3r1vhpe94fi2qZ root - - - twish
处理后日志格式:
receive_time: 1558663265
__topic__:
content: <13>1 2019-05-06T11:50:16.015554+08:00 iZbp1a65x3r1vhpe94fi2qZ root - - - twish
priority: 13
version: 1
timestamp: 2019-05-06T11:50:16.015554+08:00
hostname: iZbp1a65x3r1vhpe94fi2qZ
program: root
message: twish
"""
e_regex('content',grok('%{POSINT:priority}>%{NUMBER:version} %{TIMESTAMP_ISO8601:timestamp} %{SYSLOGHOST:hostname} %{PROG:program} - - - %{GREEDYDATA:message}'))
RSYSLOG_DebugFormat格式
日志内容形式如下:
2019-05-06T14:29:37.558854+08:00 iZbp1a65x3r1vhpe94fi2qZ root: environment
LOG DSL编排规则处理:
"""
处理前日志格式:
receive_time: 1558663265
__topic__:
content: 2019-05-06T14:29:37.558854+08:00 iZbp1a65x3r1vhpe94fi2qZ root: environment
处理后日志格式:
receive_time: 1558663265
__topic__:
content: 2019-05-06T14:29:37.558854+08:00 iZbp1a65x3r1vhpe94fi2qZ root: environment
timestamp: 2019-05-06T14:29:37.558854+08:00
hostname: iZbp1a65x3r1vhpe94fi2qZ
program: root
message: environment
"""
e_regex('content',grok('%{TIMESTAMP_ISO8601:timestamp} %{SYSLOGHOST:hostname} %{SYSLOGPROG} %{GREEDYDATA:message}'))
自此,syslog配置文件常见log日志文件格式解析已解析完成,接下来介绍两种FluentSyslog日志格式。
FluentRFC5424格式
日志内容形式如下:
<16>1 2013-02-28T12:00:00.003Z 192.168.0.1 fluentd 11111 ID24224 [exampleSDID@20224 iut='3' eventSource='Application' eventID='11211] Hi, from Fluentd!
LOG DSL编排规则处理:
"""
处理前日志格式:
receive_time: 1558663265
__topic__:
content: <16>1 2019-02-28T12:00:00.003Z 192.168.0.1 aliyun 11111 ID24224 [exampleSDID@20224 iut='3' eventSource='Application' eventID='11211] Hi, from Fluentd!
处理后日志格式:
receive_time: 1558663265
__topic__:
content: <16>1 2019-02-28T12:00:00.003Z 192.168.0.1 aliyun 11111 ID24224 [exampleSDID@20224 iut='3' eventSource='Application' eventID='11211] Hi, from aliyun!
priority: 16
version: 1
timestamp: 2019-02-28T12:00:00.003Z
hostname: 192.168.0.1
ident: aliyun
pid: 1111
msgid: ID24224
extradata: [exampleSDID@20224 iut='3' eventSource='Application' eventID='11211]
message: Hi, from aliyun!
"""
e_regex('content',grok('%{POSINT:priority}>%{NUMBER:version} %{TIMESTAMP_ISO8601:timestamp} %{SYSLOGHOST:hostname} %{WORD:ident} %{NUMBER:pid} %{USERNAME:msgid} (?P<extradata>(\[(.*)\]|[^ ])) %{GREEDYDATA:message}'))
FluentRFC3164格式
日志内容形式如下:
<6>Feb 28 12:00:00 192.168.0.1 fluentd[11111]: [error] Syslog test
LOG DSL编排规则处理:
"""
处理前日志格式:
receive_time: 1558663265
__topic__:
content: <6>Feb 28 12:00:00 192.168.0.1 aliyun[11111]: [error] Syslog test
处理后日志格式:
receive_time: 1558663265
__topic__:
content: <6>Feb 28 12:00:00 192.168.0.1 aliyun[11111]: [error] Syslog test
priority: 6
timestamp: Feb 28 12:00:00
hostname: 192.168.0.1
ident: aliyun
pid: [1111]
level: [error]
message: Syslog test
"""
e_regex('content', grok('%{POSINT:priority}>%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{WORD:ident}(?P<pid>(\[(\d+)\]|[^:])): (?P<level>(\[(\w+)\]|[^ ])) %{GREEDYDATA:message}'))
对priority做进一步解析
针对,以上解析过后的日志内容还可以对priority进一步解析,并且匹配出解析出来的facility和serverity信息,使用RFC5424协议更多参考e_syslogrfc函数,如下:
"""
处理前日志格式:
receive_time: 1558663265
__topic__:
content: <13>1 2019-05-06T11:50:16.015554+08:00 iZbp1a65x3r1vhpe94fi2qZ root - - - twish
priority: 13
version: 1
timestamp: 2019-05-06T11:50:16.015554+08:00
hostname: iZbp1a65x3r1vhpe94fi2qZ
program: root
message: twish
处理后日志格式:
receive_time: 1558663265
__topic__:
content: <13>1 2019-05-06T11:50:16.015554+08:00 iZbp1a65x3r1vhpe94fi2qZ root - - - twish
priority: 13
version: 1
timestamp: 2019-05-06T11:50:16.015554+08:00
hostname: iZbp1a65x3r1vhpe94fi2qZ
program: root
message: twish
_facility_: 1
_severity_: 5
_severitylabel_: Notice: normal but significant condition
_facilitylabel_: user-level messages
"""
e_syslogrfc("priority","SYSLOGRFC5424")
总结
通过以上内容,覆盖了syslog各种常见日志解析。syslog格式还有很多种,解析方法还是推荐使用LOG DSL的grok解析效率更快更高。grok还可以解析其他类型的log内容,比如Apache、Http错误日志等等。
如果解析出来之后的message或者body. 还需要进一步解析的,有各种方式:grok, 正则或者CSV等等
进一步参考
欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持: