您的位置:首页 > 其它

Syslog 标准介绍

2010-06-04 14:50 176 查看
在Unix类操作系统上,syslog广泛应用于系统日志。syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收
syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见的应用场景是网
络管理工具、安全管理系统、日志审计系统。

完整的syslog日志中包含产生日志的程序模块(Facility)、严重性
(Severity或
Level)、时间、主机名或IP、进程名、进程ID和正文。在Unix类操作系统上,能够按Facility和Severity的组合来决定什么样的日
志消息是否需要记录,记录到什么地方,是否需要发送到一个接收syslog的服务器等。由于syslog简单而灵活的特性,syslog不再仅限于
Unix类主机的日志记录,任何需要记录和发送日志的场景,都可能会使用syslog。

长期以来,没有一个标准来规范syslog的格
式,导致syslog的格式是非常随意的。最坏的情况下,根本就没有任何格式,导致程序不能对syslog 消息进行解析,只能将它看作是一个字符串。


2001年定义的RFC3164中,描述了BSD syslog协议:
http://www.ietf.org/rfc/rfc3164.txt

过这个规范的很多内容都不是强制性的,常常是“建议”或者“约定”,也由于这个规范出的比较晚,很多设备并不遵守或不完全遵守这个规范。接下来就介绍一
下这个规范。

约定发送syslog的设备为Device,转发syslog的设备为Relay,接收syslog的设备为
Collector。Relay本身也可以发送自身的syslog给Collector,这个时候它表现为一个Device。Relay也可以只转发部分
接收到的syslog消息,这个时候它同时表现为Relay和Collector。

syslog消息发送到Collector的UDP
514端口,不需要接收方应答,RFC3164建议
Device
也使用514作为源端口。规定syslog消息的UDP报文不能超过1024字节,并且全部由可打印的字符组成。完整的syslog消息由3部分组成,分
别是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能没有。

2、syslog的格式

下面是一个syslog消息:

<30>Oct
9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.

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

2.1、PRI部分

PRI部分由尖括号包含的一个数字构成,这个数字包含了程序模块(Facility)、严重性
(Severity),这个数字是由Facility乘以 8,然后加上Severity得来。不知道他们为什么发明了这么一种不直观的表示方式。


就是说这个数字如果换成2进制的话,低位的3个bit表示Severity,剩下的高位的部分右移3位,就是表示Facility的值。

十进制
30 = 二进制0001 1110

0001 1... = Facility: DAEMON - system daemons (3)

....
.110 = Severity: INFO - informational (6)

Facility的定义如下,可以看出来
syslog的Facility是早期为Unix操作系统定义的,不过它预留了User(1),Local0~7 (16~23)给其他程序使用:

Numerical             Facility

Code

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.

Severity的定义如下:

Numerical         Severity

Code

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


也就是说,尖括号中有1~3个数字字符,只有当数字是0的时候,数字才以0开头,也就是说00和01这样在前面补0是不允许的。

2.2、HEADER部分

HEADER部分包括两个字段,时间和主机
名(或IP)。

时间紧跟在PRI后面,中间没有空格,格式必须是“Mmm dd
hh:mm:ss”,不包括年份。“日”的数字如果是1~9,前面会补一个空格(也就是月份后面有两个空格),而“小时”、“分”、“秒”则在前面补
“0”。月份取值包括:

Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov,
Dec

时间后边跟一个空格,然后是主机名或者IP地址,主机名不得包括域名部分。

因为有些系统需要将日志长期归档,而时
间字段又不包括年份,所以一些不标准的syslog格式中包含了年份,例如:

<165>Aug 24 05:34:00 CST
1987 mymachine myproc[10]: %% It's

time to make the do-nuts. %%
Ingredients: Mix=OK, Jelly=OK #

Devices: Mixer=OK, Jelly_Injector=OK,
Frier=OK # Transport:

Conveyer1=OK, Conveyer2=OK # %%

这样会导致解析程序将
“CST”当作主机名,而“1987”开始的部分作为MSG部分。解析程序面对这种问题,可能要做很多容错处理,或者定制能解析多种syslog格式,而
不仅仅是只能解析标准格式。

HEADER部分后面跟一个空格,然后是MSG部分。

有些syslog中没有HEADER部分。这个
时候MSG部分紧跟在PRI后面,中间没有空格。

2.3、MSG部


MSG部分又分为两个部分,TAG和Content。其中TAG部分是可选的。

在前面的例子中
(“<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is
exiting.”),“auditd[1787]”是TAG部分,包含了进程名称和进程PID。PID可以没有,这个时候中括号也是没有的。


程PID有时甚至不是一个数字,例如“root-1787”,解析程序要做好容错准备。

TAG后面用一个冒号隔开Content部分,这
部分的内容是应用程序自定义的。

3、RFC3195

BSD
syslog协议使用UDP协议在网络中传递,然而UDP是一个不可靠的协议,并且syslog也没有要求接收方有所反馈。为了解决这个问题,RFC又定
义了一个新的规范来可靠的传递syslog消息,它使用TCP协议:
http://www.ietf.org/rfc/rfc3195.txt

过大多数情况下,使用UDP发送不需要确认的syslog消息,已经能够满足要求了,并且这样做非常简单。因此到目前为止,RFC3195的应用还是很少
见的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: