1、syslog简介
syslog 是一种工业标准的协议,可用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,我们还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,藉以追踪掌握与设备和网络有关的状况。
2、syslog配置文件
syslog 设备依据两个重要的文件:/etc/syslogd守护进程和/etc/syslog.conf配置文件。通常情况下,多数syslog信息被写到 /var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围。
通过使用syslog.conf文件,可以对生成的日志的位置及其相关信息进行灵活的配置。该配置文件指明了syslogd守护程序记录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab隔开:
syslog.conf行的基本语法是:
消息类型.优先级 动作域
其中,每个选择域是由消息类型和优先级组成。当指明一个优先级时,syslogd将记录一个拥有相同或更高优先级的消息。Linux中一些主要的消息类型如表2所示,表3列出了一些优先级信息:
表1 syslog消息类型
表2 syslog常用优先级
不同的服务类型有不同的优先级,数值较大的优先级涵盖数值较小的优先级。如果某个选择条件只给出了一个优先级而没有使用任何优先级限定符,对应于这个优先级的消息以及所有更紧急的消息类型都将包括在内。比如说,如果某个选择条件里的优先级是“warning”,它实际上将把“warning”、“err”、 “crit”、“alert“和“emerg”都包括在内。
syslog允许人们使用三种限定符对优先级进行修饰:星号(*)、等号(=)和叹号(!):
所以,根据上面介绍的相关知识,我们给出如下例子作为示范:
(1)如果指明\"crit\",那所有标为crit、alert和emerg的消息将被记录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,如果想把所有邮件消息记录到一个文件中,如下所示:
#Log all the mail messages in one placemail.* /var/log/maillog
(2)其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为\"err\"或更高。例如:
# Save news errors of level crit and higher in a special file.uucp,news.crit /var/log/spooler
(3)当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。
#Everybody gets emergency messages, plus log them on anther machine*.emerg **.emerg @linuxaid.com.cn
(4)有时syslogd将产生大量的消息。例如内核(\"kern\"设备)可能很冗长,用户很难看得清楚明了,那么用户可能想把内核消息记录到/dev/console中。下面的例子表明内核日志记录被注释掉了:
#Log all kernel messages to the console#Logging much else clutters up the screen#kern.* /dev/console
(5)用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别\"none\"禁止一个设备:
#Log anything(except mail)of level info or higher#Don\'t log private authentication messages!*.info:mail.none;autHPriv.none /var/log/messages
3、syslog进程
syslogd守护程序是由/etc/rc.d/init.d/syslog脚本在运行级2下被调用的,缺省不使用选项。但有两个选项-r和-h很有用:
另外,如果需要重新启动syslog守护进程(/etc/syslog.conf的修改只有在syslog守护进程重新启动后才会生效),并且只想重新启动syslog守护进程而不是整个系统,在Red Hat Linux机器上,执行以下两条命令之一即可:
/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart/etc/rc.d/init.d/syslogrestart
4、灵活运用syslog调用接口
在实际的使用过程中,我们可以通过配置文件和查看相应的日志文件来使用syslog。然而,在许多应用场景下,我们往往需要通过程序产生输出信息并进行记录,也就是说要把一些信息写成日志文件,正常情况下运行程序的人不用关心日志里的内容,只有在出现问题的时候才会查看日志文件里的内容以确定问题所在。因此,下面将详细介绍如何通过syslog日志系统提供的API调用接口,来使用程序实现对syslog的使用。
1.主要的函数
在Linux中,提供了四个有关syslog日志系统的系统调用,供用户使用:
(1)openlog函数
该函数的声明如下:
void openlog(const char *ident, int option, int facility);
此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。
openlog 的第一个参数ident是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。第二个参数 option一般是下列选项值取“与”运算(使用“|”表示,如“LOG_CONS | LOG_PID”)的结果:
第三个参数facility指明记录日志的程序的类型,它主要具有如下几类日志类型:
(2)syslog函数
syslog函数的声明如下:
void syslog(int priority, const char * message, ...);
第一个参数是消息的紧急级别priority,第二个参数是消息及其格式,之后是格式对应的参数,如同C语言里面printf输出函数一样使用,具体的格式这里就不再详述,它不是本书介绍的重点。
这里还需要详细介绍一下第一个参数priority,它是由severity level和facility组成的。Facility已经在上面介绍了,下面介绍一下severity level,也就是消息的重要级别,它主要包括:
在实际使用中,如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。
(3)closelog函数
相对上述2个函数来说,该函数非常简单,其声明如下:
void closelog( void );
值得注意的是,虽然该函数的使用和调用情况非常简单,但是是必不可少的,因为在Linux系统中,打开的日志也是资源,如果只使用openlog函数打开日志,而忘记使用closelog关闭日志的话,当打开的日志数量累积到一定程度,便会造成内存不足,从而引起系统问题。所以,提醒用户在使用中特别注意。
2.一个实际的程序调用例子
下面给出一个使用上述几个函数写日志的例子,以供大家参考:
#include
#include
#include
int main(void)
{
int log_test;
/*打开日志*/
openlog("log_test ", LOG_PID|LOG_CONS, LOG_USER);
/*写日志*/
syslog(LOG_INFO, "PID information, pid=%d", getpid());
syslog(LOG_DEBUG,"debug message ");
/*关闭日志*/
closelog();
}
转自 http://weisjohn.blog.163.com/blog/static/310152562012326113450226/