來源:  http://book.51cto.com/art/200711/59769.htm


8.3.3 守护进程日志的实现

syslogd守护进程用于解决守护进程的日志记录问题,而日志信息保存的位置和记录的信息级别是在syslogd守护进程的配置文件中设定的。守 护进程日志主要涉及3个函数,分别是openlog、syslog和closelog函数。表8.4所示为这3个函数的具体信息。

表8.4 openlog、syslog和closelog函数

头文件

函数形式

void openlog(const char *ident, int option, int facility);

void syslog(int priority, const char *format, ...);

void closelog(void);

返回值

成功

失败

是否设置errno

说明:openlog函数用于打开系统日志连接。只有在打开连接后,才能使用syslog函数向日志文件中添加日志信息。closelog函数用于关闭打开的系统日志连接,该函数的调用在实现中是可选择的。

openlog函数中的第1个参数为ident,该参数常用来表示信息的来源。ident指向的字符信息会被固定地添加在每行日志的前面。第2个参 数option用于指定openlog函数和接下来调用的syslog函数的控制标志。option的取值情况如表8.5所示,可以单独取其中的某个值, 也可以通过与运算来获得多种特性。第3个参数为facility,这个要与syslogd守护进程的配置文件对应,日志信息会写入syslog.conf 文件指定的位置。

表8.5 openlong函数中的option取值表

LOG_CONS

如果将信息发送给syslogd守护进程时发生错误,直接将相关信息输出到终端

LOG_NDELAY

立即打开与系统日志的连接(通常情况下,只有在产生第一条日志信息的情况下才会打开与日志系统的连接)

LOG_NOWAIT

在记录日志信息时,不等待可能的子进程的创建

LOG_ODELAY

类似于LOG_NDELAY参数,与系统日志的连接只有在syslog函数调用时才会创建

LOG_PERROR

在将信息写入日志的同时,将信息发送到标准错误输出(POSIX.1-2001不支持该参数)

LOG_PID

每条日志信息中都包括进程号

参数facility的取值如表8.6所示。这些值与前面syslog.conf中的facility是存在对应关系的。

表8.6 openlog函数参数facility取值

facility参数

syslog.conf中对应的facility取值

LOG_KERN

kern

LOG_USER

user

LOG_MAIL

mail

LOG_DAEMON

daemon

LOG_AUTH

auth

LOG_SYSLOG

syslog

LOG_LPR

lpr

LOG_NEWS

news

LOG_UUCP

uucp

LOG_CRON

cron

LOG_AUTHPRIV

authpriv

LOG_FTP

ftp

LOG_LOCAL0LOG_LOCAL7

local0local7

syslog函数中的第一个参数priority表示消息的级别。与openlog函数中的facility参数类似,priority参数与level也存在对应的关系。priority取值和对应关系如表8.7所示。

表8.7 syslog函数参数priority取值

priority参数

syslog.conf中对应的level取值

LOG_EMERG

emerg

LOG_ALERT

alert

LOG_CRIT

crit

LOG_ERR

err

LOG_WARNING

warning

LOG_NOTICE

notice

LOG_INFO

info

LOG_DEBUG

debug

syslog函数的第二个参数为消息的格式,之后是格式对应的参数。函数的使用类似于printf函数。

实例演练:
在程序中添加日志功能需要遵循如图8.6所示的步骤。调用syslog函数的过程就是写入日志的过程(如果没有调用openlog函数,直接调用syslog函数的话,facility参数可以作为priority参数的一部分加以说明)。

图8.6 程序添加日志功能工作流程

程序p8.2.c给出了在程序中实现日志的简单实例。首先,程序调用openlog函数打开与系统日志间的连接;然后,通过调用syslog函数产生5条日志信息;最后,关闭与系统日志间的连接。

   

#include
#include

int main(int argc,char* argv[])
{
openlog(argv[0],LOG_CONS | LOG_PID, LOG_USER);

int count=0;
while(count<5){
syslog(LOG_INFO,"%d, log info test...",count);
count++;
}

closelog();

return 0;
}


使用gcc编译p8.2.c,执行编译出的可执行文件。
  [program@localhost charter8]$ gcc p8.2.c
[program@localhost charter8]$ ./a.out

如何查看执行结果呢?

前面介绍了syslogd守护进程会根据syslog.conf文件中的配置,将信息写入指定的日志文件中。调用syslog函数时,指定的 priority为LOG_INFO,对应于syslog.conf中的info优先级。而调用openlog函数的facility为 LOG_USER,对应于syslog.conf中facility取user的情况。查找syslog.conf中的facility.level为 user.info的规则,如图8.7所示。可知,日志文件为/var/log/message。

由于查看/var/log下的日志需要root权限,使用su切换到root用户。使用tail命令查看message文件中的日志信息,发现相关信息已经通过syslogd守护进程记录在了/var/log/message日志文件中,如图8.8所示。

通过程序p8.2.c可以清楚地了解如何在程序中实现日志功能。在守护进程中添加日志功能的流程与p8.2.c几乎是相同的,这里就不再给出实例。

图8.7 syslog.conf中对应的规则

图8.8 程序执行结果

創作者介紹

邱小新の工作筆記

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()