读书人

Syslog协议引见

发布时间: 2012-09-11 10:49:03 作者: rapoo

Syslog协议介绍

在网上搜的文章,写的很全乎。摘抄如下,供大家参考学习

1、介绍

??? 在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的应用还是很少见的。?
?? 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xcj0535/archive/2009/05/07/4158624.aspx

读书人网 >互联网

热点推荐