syslog协议与Rsyslog系统日志软件简介

1. syslog系统日志协议

1.1. syslog协议简介

  • Unix/Linux系统中的绝大部分日志都是通过一种叫做syslog的机制产生和维护的。
  • syslog协议是一个转发系统日志信息的标准,它是在美国加州大学伯克利软件分布研究中心BSD的 TCP/IP 系统实施中开发的,目前已成为一种工业标准协议。
  • syslog协议可根据与日志消息的生产关系分为客户端和服务器端。其中客户端是产生日志消息的一方;服务器端负责接收客户端发送来的日志消息,并进行保存到特定的日志文件中或其他方式的处理。
  • syslog记录着系统中的任何事件,任何希望生成日志的程序都可以向 syslog 发送信息。

1.2. syslog协议的日志信息结构

标准syslog协议的日志信息结构主要由PRI(priority,优先级)、HEADER、MSG三部分组成。下方为某syslog消息示例:

1
<147>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
<147>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
<147> Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
PRI HEADER MSG
<Facility * 8 + Severity> 时间 主机名(或IP) TAG(可选) Content
<18(local2) * 8 + 3(Error)> Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.

其中“<147>”是PRI部分,“Oct 9 22:33:20 hlfedora”是HEADER部分,“auditd[1787]: The audit daemon is exiting.”是MSG部分。

1.2.1. PRI部分

PRI(priority,优先级)部分由尖括号包含的一个数字构成,这个数字包含了程序模块(Facility)、严重性(Severity),这个数字是由 Facility 乘以 8 再加上 Severity 得来。

1
priNum = Facility * 8 + Severity

协议定义了24个日志 程序模块(Facility):

Numerical Code Facility
0 kernel messages
1 user-level messages
2 mail system
3 system daemons
4 security/authorization messages (note 1)
5 messages generated internally by syslogd
6 line printer subsystem
7 network news subsystem
8 UUCP subsystem
9 clock daemon (note 2)
10 security/authorization messages (note 1)
11 FTP daemon
12 NTP subsystem
13 log audit (note 1)
14 log alert (note 1)
15 clock daemon (note 2)
16 local use 0 (local0)
17 local use 1 (local1)
18 local use 2 (local2)
19 local use 3 (local3)
20 local use 4 (local4)
21 local use 5 (local5)
22 local use 6 (local6)
23 local use 7 (local7)

Note 1 - Various operating systems have been found to utilize
Facilities 4, 10, 13 and 14 for security/authorization,audit, and alert messages which seem to be similar.
Note 2 - Various operating systems have been found to utilize
both Facilities 9 and 15 for clock (cron/at) messages.

协议定义了8个日志级别——严重性(Severity):

Numerical Code Severity
0 Emergency: system is unusable
1 Alert: action must be taken immediately
2 Critical: critical conditions
3 Error: error conditions
4 Warning: warning conditions
5 Notice: normal but significant condition
6 Informational: informational messages
7 Debug: debug-level messages

对上述PRI值为147的日志消息示例,syslog协议在:

  • 填充PRI字段时,根据要传入日志消息的程序模块(Facility)和严重性(Severity)参数计算消息的PRI值:

    1
    18(local2) * 8 + 3(Error) = 147
  • 解析时PRI字段时,取 PRI值(10010011B, 147) 的:

    • 低位3位(011B, 3)即可得到Severity的值(Error);
    • 取PRI值的高5位(右移3位后)(10010B, 18)即可得到Facility的值(local2)。

1.2.2. HEADER部分

HEADER部分包括两个字段,时间主机名(或IP)。其格式如下:

Oct 9 22:33:20 hlfedora
时间 主机名(或IP)
Oct 9 22:33:20 hlfedora

格式必须是“Mmm dd hh:mm:ss”,不包括年份。“日”的数字如果是1~9,前面会补一个空格(也就是月份后面有两个空格),而“小时”、“分”、“秒”则在前面补“0”。
月份取值包括:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec

备注:

  • 长期以来,没有一个标准来规范syslog的格式,导致syslog的格式是非常随意
  • 某些不标准的syslog格式中包含了年份,若未做容错处理将会导致解析出错;
  • 大部分syslog都包含PRI和MSG部分,而HEADER可能没有,这个时候MSG部分紧跟在PRI后面,中间没有空格。

1.2.3. MSG部分

MSG由TAG部分(可选)和Content部分构成。其格式如下:

auditd[1787]: The audit daemon is exiting.
TAG(可选) Content
auditd[1787] The audit daemon is exiting.

其中,TAG域的值是产生日志消息的程序或进程的名称,TAG后面用一个冒号隔开Content部分,这部分的内容是应用程序自定义的日志正文。

1.3. 各日志文件的默认意义说明

文件 说明
/var/log/messages 系统主日志文件,记录常见的系统和服务错误信息
/var/log/syslog 只记录警告信息,常常是系统出问题的信息,使用lastlog查看
/var/log/boot.log 记录系统在引导过程中发生的事件,即开机自检中显示信息
/var/log/lastlog 记录最后一次用户成功登陆的时间、登陆IP等信息
/var/log/secure 系统认证/安全日志。记录用户和工作组变坏情况、用户登陆认证情况
/var/log/maillog 邮件postfix相关日志
/var/log/btmp 记录Linux登陆失败的用户、时间以及远程IP地址
/var/log/cron 记录计划任务crond服务执行情况
/var/log/dmesg 记录系统启动相关日志

2. Rsyslog系统日志软件简介

2.1. 系统日志软件简介

  • 系统日志软件可根据当条日志消息的PRI属性值,即对应syslog协议中的程序模块(Facility)严重性级别(Severity),对当条日志消息按配置文件中指定的方式进行处理,如:保存到不同的文件中、发送到远程服务器或数据库等。
  • Syslog 是早期大部分Linux发行版的内置日志记录程序,现已逐渐被 Rsyslog 取代(优势:性能和安全性更高,日志处理规模可达每秒百万条),Red Hat Enterprise Linux 6 之后的系统默认使用了Rsyslog。
  • 系统日志软件转发日志消息时,绝大多数情况下使用UDP协议转发syslog消息,少数情况使用TCP协议(RFC3195协议)转发syslog消息

2.2. 常用的系统日志软件(Syslog、Syslog-ng 与 Rsyslog)对比

Syslog Syslog-ng Rsyslog
诞生时间 1980 1998 2004
守护进程 syslogd
klogd
journald rsyslogd
配置文件 /etc/syslog.conf /etc/syslog.conf /etc/rsyslog.conf
主要特性 * 支持单机模式
* 支持C/S架构
* 支持UDP/TCP协议
* 支持SSL/TLS协议
* 支持输出日志到数据库,如:MySQL、
Oracle、PostgreSQL和SQLite.
* 支持标准的Syslog协议
* 支持Filter、Parse以及Rewrite
* 支持更多的平台和更高的负载能力
* 多线程
* 支持TCP, SSL, TLS, RELP
* 支持输出日志到各种数据库,如:MySQL,PostgreSQL,
MongoDB,ElasticSearch等
* 可通过可靠事件记录协议(Reliable Event Logging Protocol
,RELP) + TCP实现数据的可靠传输
* 可对输出格式进行精细控制
具有强大的消息过滤能力
具有高精度时间戳、队列操作(内存,磁盘以及混合模式等)
支持数据的加密和压缩传输等

常用系统日志软件中,应用最广泛同时性能最强大的是Rsyslog(官网标语:The rocket-fast system for log processing)。

2.3. Rsyslog工作流

支持多线程的Rsyslog工作流示意图(多种输入输出方式并行处理):

Rsyslog工作流

对单个日志消息,日志message先进入主队列再过滤到分支队列,最后在各个processor线程中输出内容,输出到指定的输出方式中(如:写文件、发送远程主机、存数据库等)。

Rsyslog消息处理流程

2.4. Rsyslog日志消息流向

下面从 rsyslogd 进程的输入和输出两个方面概述的日志信息流向。

Rsyslog msg流向

输入

  1. 接收Linux内核进程发送到/dev/klog(特殊的设备,读取内核发出的消息)的日志消息
  2. 接收用户进程(通过进程间通信)发送到/dev/log(UNIX域数据包套接字)的日志消息
  3. 接收UDP协议(TCP/IP网络通信)发送到514端口的日志消息
  4. 监听写入文件的日志消息

输出

  1. 写入本地指定文件
  2. 发送给远程主机(eg. 远程ELK实时日志分析平台)
  3. 输出日志到数据库

3. 参考文档