SYSLOG 简介

syslogd是 UNIX 系统的一个常见组件,用于执行系统日志记录活动。syslogd 从一组日志源(如 /dev/log 和 /dev/klog)中读取数据,并按 /etc/syslog.conf 中的说明处理这些日志消息。通过 syslog() 调用,可将应用程序日志消息记录到 syslog 中。由于syslog是以UDP方式传送,个别的日志消息可能会遗失;在网络设备崩溃的情况下,可能不会将最有用的信息发送到syslog服务器 上,这对于排除崩溃故障不是很有用;而且syslog日志服务器容易成为攻击者的目标,对于防范系统方面的攻击比较脆弱,需要特别注意。

SYSLOG 消息格式

syslog消息通常由三部分组成:PRI、HEADER、MSG.
PRI: <priority> (priotity = facility * 8 + severity)
HEADER: a timestamp and an indication of the hostname or IP address of the device
MSG: TAG: CONTENT
具体的格式要求可以参见RFC3164和RFC3165.通常情况下,一般的syslog信息最关注的是它的severity:
define code Facility
LOG_EMERG 0 system is unusable
LOG_ALERT 1 action must be taken immediately
LOG_CRIT 2 critical conditions
LOG_ERR 3 error conditions
LOG_WARNING 4 warning conditions
LOG_NOTICE 5 normal but significant condition
LOG_INFO 6 informational
LOG_DEBUG 7 debug-level messages

完整的syslog日志中包含产生日志的程序模块(Facility)、严重性(Severity或 Level)、时间、主机名或IP、进程名、进程ID和正文。但是syslog的日志格式并没有统一的标准。约定发送syslog的设备为Device,转发syslog的设备为Relay,接收syslog的设备为Collector。Relay本身也可以发送自身的syslog给Collector,这个时候它表现为一个Device。Relay也可以只转发部分接收到的syslog消息,这个时候它同时表现为Relay和Collector

SYSLOG 原理

实际上syslog包含了两的daemon:syslogd以及klogd, 其中klogd负责获取系统所发出的信息,而syslogd部分则是分析信息并将信息按照要求存放在指定的位置。几乎所有的网络设备都可以通过syslog protocol将日志信息以UDP方式传送到远端服务器,远端接收日志服务器必须通过syslogd来监听UDP Port 514,日志大小不能超过1024字节。并且根据syslog.conf中的配置来处理本机和接收访问系统的日志信息,把指定的事件写入特定档案中,供后台数据库管理和响应之用。
系统是靠printk打印出相关的系统信息,然后这些信息就存储在系统的ring buffer(/dev/kmsg)中,printk打印出的信息一般情况下会包含两部分信息,前面会包含它的severity,后面则是它的实际内容。 而klogd正式负责读取这个buffer中的信息,然后调用syslog函数,将所得到的信息整合并发送到/dev/log中, 当然这些信息中包含了产生这个信息的进程名称,以及它的facility。
syslogd则就是时刻关注着/dev/log的变化,一旦有新的信息到来,syslogd就会立刻进行处理。syslogd接受到的信息,通常情况下,是这样的:
<priority>app_name:content
这个时候我们就可以通过这些简短的信息来进行处理。通过前面提到的priority = facility * 8 + severity;可以分别获取facility和severity的值,而app_name 是显而易见的,这样就可以将它们分类处理,或者存放在不同的地方,或者丢弃不存放,当然我们也可以在content中添加自己相应的需求,这就看自己的规 定了。一般情况下,是通过syslog.conf这种配置文件,来进行规定的。