2007年6月29日星期五

syslog的编程和配置


syslog的编程和配置
 
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
 
参考文献:man syslog syslogd syslog.conf openlog, RFC3164
 
1. 前言
 
syslog是UNIX系统中提供的一种日志记录方法(RFC3164),syslog本身是一个服务器,程序中凡是使用syslog记录的信 息都会发送到该服务器,服务器根据配置决定此信息是否记录,是记录到磁盘文件还是其他地方,这样使系统内所有应用程序都能以统一的方式记录日志,为系统日 志的统一审计提供了方便。
 
2. 日志格式
 
syslog记录的日志格式为:
月 日 时:分:秒 主机名 标志 日志内容
 
3. syslog编程
 
为记录日志,通常用到3个函数,openlog(3),syslog(3)和closelog(3),openlog(3)和closelog(3)不是必须的,没有openlog(3)的话将用系统缺省的方式记录日志。
 
      #include <syslog.h>
      void openlog( char *ident, int option, int  facility)
      void syslog( int priority, char *format, ...)
      void closelog( void )
 
openlog(3)有三个参数,第一个参数是标志字符串,也就是日志中的第5个字段,不设的话缺省取程序名称;
第二个参数是选项,是下面一些标志位的组合:
       LOG_CONS:日志信息在写给日志服务器的同时打印到终端
       LOG_NDELAY:立即记录日志
       LOG_PERROR:把日志信息也输出到标准错误流
       LOG_PID:在标志字段中记录进程的PID值
第三个参数是说明日志类型的,定义了以下类型(各类型啥意思就自己看或猜吧,俺就不多说了):
       LOG_AUTH
       LOG_AUTHPRIV
       LOG_CRON
       LOG_DAEMON
       LOG_KERN
       LOG_LOCAL0 through LOG_LOCAL7
       LOG_LPR
       LOG_MAIL
       LOG_NEWS
       LOG_SYSLOG
       LOG_USER(default)
       LOG_UUCP
 
syslog(3)函数主要的是第一个参数priority,后面那些参数就是和printf(3)函数用法一样了,priority值表示该条日志的级别,日志级别分8级,由高到低的顺序为:
       LOG_EMERG
       LOG_ALERT
       LOG_CRIT
       LOG_ERR
       LOG_WARNING
       LOG_NOTICE
       LOG_INFO
       LOG_DEBUG
如果openlog(3)时没有指定facility,是可以把facility的值或到priority中的,如(LOG_AUTH | LOG_INFO),已经设置了就可以不用或了。
 
closelog(3)这个没啥好说的了,关闭日志记录。

4. syslog服务器配置
 
syslog服务器的配置文件为/etc/syslog.conf,syslog(3)函数把想记录的日志信息都发送给日志服务器,但此日志最 终是否记录到文件或发送给远程服务器,则是由此配置文件来决定的,该配置文件就是告诉日志服务器要记录那些类型和级别的日志,如何记录等信息。
 
配置文件是文本文件,每行配置分两个字段,第一字段是说明要记录哪类日志,第二字段是说明日志存放位置,可以是本地文件,也可以是远程服务器。
 
第一字段:
第一字段基本格式是"facility.priority",可以同时定义多个,中间用逗号","或分号";"分隔。
facility名称就是上面说的facility值的后半部的小写,如news, mail,kern, cron等,也可以用"*"表示所有facility类型;
priority名称就是上面说的priority值的后半部的小写,如emerg, alert,err, info等,也可以用"*"表示所有priority类型,比此级别高的日志都会自动记录,用none表示不记录;
举例:
kern.* : 所有级别的内核类型日志
mail.err: 错误及错误级别以上的mail类型日志
如果不记录某级别的日志,在级别前加"!",如:
auth.info;auth.!err :info及info级别以上但不包括err级别的auth类型日志

第二字段:
第二字段分两类,本地文件和远程服务器
本地文件:直接就是写本地文件的文件名,如 /var/log/messages。一般来说日志信息会立即写到文件中,但会降低系统效率,可以在文件名前加减号"-"表示先将信息缓存,到一定量后再一次性写入文件,这样可以提高效率;
远程服务器:格式是"@address","@"表示进行远程记录,将日志发送到远程的日志服务器,日志服务器的端口是UDP514,address可以是IP地址,也可以是域名
 
举例:
# 将所有级别的内核日志发送到终端
kern.*  /dev/console 
 
# 将所有类型所有级别的日志记录到/var/log/messages文件
*.* /var/log/messages
 
# 所有info级别以上的信息,不包括mail类型所有级别和authpriv类型的err级别信息,
# 记录到/var/log/messages文件,不立即写入
*.info;mail.none;authpriv.!err       -/var/log/messages
 
#将所有级别的内核日志发送到远程syslog服务器
kern.*  @1.1.1.1
 
5. syslog服务器
 
在linux下提供了sysklogd的syslog服务器的实现,可以记录本机日志也可以接收(syslogd的-r选项)和转发(syslogd的-h选项)来自外部的日志。
 
sysklogd包括两个程序,klogd和syslogd,klogd用于接收内核日志,再发送到syslogd,syslogd则可以直接 接收应用程序和远程的日志,syslogd是通过一个域socket(AF_UNIX)来接收数据的,syslog()函数记录的日志都发送到此域 socket,socket文件是/dev/log。
 
syslog(3)函数发送给syslogd服务器的日志信息前都加上了类型和级别信息,具体格式是"<x>","x"是一个 0~255的数,8位,低3位表示日志级别,所以共8级,高五位表示日志类型,最多32种,不过目前没用到那么多,可以看看 /usr/include/sys/syslog.h中的定义就知道了。
 
要生成日志信息时,syslogd是先生成日志前部信息:月 日 时:分:秒 主机名 标志,再和日志内容信息拼接起来的,日期用ctime(3)函数获取,隐去了前4个表示星期的字节和后面年的信息,最终生成你所看到的日期格式,老实说那段代码及其丑陋。
 
6. 结论
 
syslog方便了程序信息的记录,由于使用了统一的格式记录使得审计也可以比较方便。要记录日志,除了在应用程序中用syslog(3)函数记录外,还要正确配置/etc/syslog.conf文件,使服务器能正确记录那些想记录的日志。

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

3 条评论:

匿名 说...

Κeep this going pleaѕe, grеat job!
Look at my web page ; augenoperation

匿名 说...

Іf youг οven theгmometer ԁοes not match
уouг oven tempегatuгe setting, уou will want to havе your oven
calibrated. This annual plant can bе grown іn an container, anԁ will yield between 1-2 cups of fresh baѕil.
Roll each ρortion intο the thicknеss of а broom handle.
Also visit my site pizza pan akron market

匿名 说...

Ηеy thеre, Υοu've done a great job. I will definitely digg it and personally suggest to my friends. I am sure they will be benefited from this site.

Feel free to surf to my web page - Chemietoilette