一、简介

syslog是一种工业标准的协议,可用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,我们还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,藉以追踪掌握与设备和网络有关的状况。

 

二、进程与配置

守护进程:/etc/syslogd,该程序在启动时查询配置文件。



在客户端/服务器架构的配置下,rsyslog同时扮演了两种角色:



1)作为一个syslog服务器,rsyslog可以收集来自其他设施的日志信息;
2)作为一个syslog客户端,rsyslog可以将其内部的日志信息传输到远程的syslog服务器。



配置文件:/etc/syslog.conf,指明了syslogd守护程序记录日志的行为,可以对生成的日志的位置及其相关信息进行灵活的配置。



配置文件由不同程序或消息分类的单个条目组成,每个条目有一个选择域(由消息类型和优先级组成,指明消息的类型和优先级)和一个动作域(指明所要执行的动作),域间由tab分隔:



android syslog函数 syslog详解_优先级

android syslog函数 syslog详解_限定符_02

android syslog函数 syslog详解_限定符_03

另外,允许通过三种限定符对优先级进行修饰:星号(*)、等号(=)和叹号(!)



1)星号(*)的含义是把本项服务生成的所有日志消息都发送到操作动作指定的地点。就像它在规则表达式里的作用一样,星号代表“任何东西”。在前面给出的例子里,“mail.*”将把所有优先级的消息都发送到操作动作指定的/var/log/mail文件里。使用“*”限定符与使用“debug”优先级的效果完全一样,后者也将把所有类型的消息发送到指定地点。
2)等号(=)的含义是只把本项服务生成的本优先级的日志消息都发送到操作动作指定的地点。比如说,可以用“=”限定符只发送调试消息而不发送其他更紧急的消息(这将为应用程序减轻很多负担)。当你只需要发送特定优先级别的消息时,就要使用等号限定符。
3)叹号(!)的含义是把本项服务生成的所有日志消息都发送到操作动作指定的地点,但本优先级的消息不包括在内。



 

三、syslog协议

RFC3164描述了syslog协议,协议建议:



1)规定syslog消息的UDP报文不能超过1024字节,并且全部由可打印的字符组成。
2)完整的syslog消息由3部分组成,分别是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能没有。
3)syslog消息发送到Collector的UDP 514端口,不需要接收方应答,RFC3164建议 Device 也使用514作为源端口。
4)约定发送syslog的设备为Device,转发syslog的设备为Relay,接收syslog的设备为Collector。
   Relay本身也可以发送自身的syslog给Collector,这个时候它表现为一个Device。Relay也可以只转发部分接收到的syslog消息,这个时候它同时表现为Relay和Collector。



 

四、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部分。


1)PRI部分

PRI部分由尖括号包含的一个数字构成,这个数字包含了程序模块(Facility)、严重性(Severity),这个数字是由Facility乘以 8,然后加上Severity得来,也就是说这个数字如果换成2进制的话,低位的3个bit表示Severity,剩下的高位的部分右移3位,就是表示Facility的值。



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的定义如下,尖括号中有1~3个数字字符,只有当数字是0的时候,数字才以0开头,也就是说00和01这样在前面补0是不允许的。
       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



2)HEADER部分

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



1)时间紧跟在PRI后面,中间没有空格,格式必须是“Mmm dd hh:mm:ss”,不包括年份。“日”的数字如果是1~9,前面会补一个空格(也就是月份后面有两个空格),而“小时”、“分”、“秒”则在前面补“0”。月份取值包括:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
2)时间后边跟一个空格,然后是主机名或者IP地址,主机名不得包括域名部分。



3)MSG部分

HEADER部分后面跟一个空格,然后是MSG部分,有些syslog中没有HEADER部分。这个时候MSG部分紧跟在PRI后面,中间没有空格。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部分,这部分的内容是应用程序自定义的。



 

五、API

在Linux中,提供了四个有关syslog日志系统的系统调用,供用户使用:



openlog:打开日志设备,以供读取和写入,与文件系统调用的open类似; 
syslog:写入日志,与文件系统调用的write类似; 
closelog:关闭日志设备,与文件系统调用的close类似; 
vsyslog:它和syslog功能一样,负责写入日志,只是参数格式不同。



 

六、其他

1)在Linux上配置一个syslog服务器