1. what
syslog是UNIX系统提供的一种日志记录方法(RFC3164)。syslog本身是一种服务器,程序中通过syslog函数记录的信息都会被发送到该服务器,服务器根据配置决定此信息是否记录,以及记录到磁盘文件、远程syslog服务器还是远程邮件服务器等。syslog使得系统内所有的应用程序都能以统一的方式记录日志,为系统日志的统一审计提供了方便。
2. sysklogd
linux提供了sysklogd的syslog服务器的实现,可以记录本机日志,也可以接收和转发外部日志。sysklogd包括2个程序:syslogd & klogd。
2.1 syslogd
syslogd通过域socket(AF_UNIX)可以直接接收应用程序和远程的日志,syslog()函数记录的日志都会被发送到此域socket,socket文件为/dev/log。
2.2 klogd
klogd用于接收内核日志,然后发送到syslogd。
3. syslog()
syslog函数的头文件及原型如下:
#include <syslog.h> void syslog(int priority, char *format, ...);
|
syslog.h位于uclibc/include/sys/目录下;
syslog()位于uclibc/libc/misc/syslog/syslog.c中。
3.1 priority
syslog()的参数priority是facility与level的组合,后续参数与printf同。
facility参数用来指定何种程序在记录log信息,默认为LOG_USER。
/* facility codes */ #define LOG_KERN (0<<3) /* kernel messages */ #define LOG_USER (1<<3) /* random user-level messages */ #define LOG_MAIL (2<<3) /* mail system */ #define LOG_DAEMON (3<<3) /* system daemons */ #define LOG_AUTH (4<<3) /* security/authorization messages */ #define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ #define LOG_LPR (6<<3) /* line printer subsystem */ #define LOG_NEWS (7<<3) /* network news subsystem */ #define LOG_UUCP (8<<3) /* UUCP subsystem */ #define LOG_CRON (9<<3) /* clock daemon */ #define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ #define LOG_FTP (11<<3) /* ftp daemon */
|
level参数用于指定信息的重要性,共分8个等级:
#define LOG_EMERG 0 /* system is unusable */ #define LOG_ALERT 1 /* action must be taken immediately */ #define LOG_CRIT 2 /* critical conditions */ #define LOG_ERR 3 /* error conditions */ #define LOG_WARNING 4 /* warning conditions */ #define LOG_NOTICE 5 /* normal but significant condition */ #define LOG_INFO 6 /* informational */ #define LOG_DEBUG 7 /* debug-level messages */
|
4. /etc/syslog.conf
/etc/syslog.conf为syslog服务器的配置文件,用于指定服务器需要记录哪些类型和级别的log以及将这些log记录到何处。
4.1 配置格式
配置文件为文本文件,每行配置分两个字段,第一字段是说明要记录哪类日志,第二字段是说明日志存放位置,可以是本地文件,也可以是远程服务器。
第一字段:"facility.priority",可以同时定义多个,中间用逗号","或分号";"分隔。
facility为上述facility后半部的小写(eg. kern, user, mail etc.),也可以用"*"表示所有facility类型;
priority为上述priority后半部的小写(eg. err, info),也可以用"*"表示所有priority类型,比此级别高的日志都会被记录,用none表示不记录,若不记录某级别的日志,在该级别前加"!"。
第二字段:若为本地文件,即为本地文件名;若为远程服务器,格式为"@address",其中@表示进行远程记录,日志服务器的端口为UDP 514,address可以是IP地址,也可以是域名。第二字段前面加"-"表示不立即写入log文件。
4.2 配置实例
(1) kern.* @1.2.3.4
将所有级别的内核日志发送到远程syslog服务器。
(2) *.* /var/log/messages
将所有类型所有级别的日志记录到/var/log/messages文件中。
(3) *.info;mail.none;auth.!err -/var/log/messages
将所有info级别以上的信息记录到/var/log/messages文件中,但不包括mail信息,以及facility=auth,priority>=err的信息,并且记录的信息不立即写入该文件中。
5. log format
月 日 时:分:秒 主机名 标志 日志内容
通常,syslog()函数发送给syslog服务器的日志信息前都加上了类型与级别信息,并用<>括起来,syslogd又会将这些信息进行重新格式化为上述形式。
6. Reference
[1] syslog的编程和配置.
阅读(690) | 评论(0) | 转发(0) |