openlog、syslog和closelog函数

守护进程日志的实现

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

表8.4   openlog、syslog和closelog函数

头文件

<syslog.h>

函数形式

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

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

void closelog(void);

 

 

 

 

说明:调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。调用openlog 使我们可以指定一个ident,以后, 此ident 将被加至每则记录消息中。ident 一般是程序的名称(例如 ,cron ,ine 等)

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_LOCAL0~LOG_LOCAL7

local0~local7

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函数。

参考代码如下:

点击(此处)折叠或打开

  1. #include <syslog.h> 

  2. int main(int argc, char **argv) 
  3. { 
  4.     syslog(LOG_ERR|LOG_USER,"test - %m/n"); 
  5.     openlog("SyslogTest", LOG_CONS | LOG_PID, 0); 
  6.     syslog(LOG_DEBUG,"This is a syslog test message generated by program '%s'/n",argv[0]); 
  7.     closelog(); 
  8.     return 0; 
  9. }

执行结果:#cat /var/log/syslog

QQ截图20120408210028

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个守护进程的示例代码,可以参考实现: daemon.c: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <syslog.h> #include <time.h> void daemonize() { pid_t pid = fork(); if (pid < 0) { exit(EXIT_FAILURE); } if (pid > 0) { exit(EXIT_SUCCESS); } if (setsid() < 0) { exit(EXIT_FAILURE); } umask(0); chdir("/"); int fd = open("/dev/null", O_RDWR); if (fd < 0) { exit(EXIT_FAILURE); } dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); close(fd); } int main() { daemonize(); openlog("daemon-test", LOG_PID, LOG_DAEMON); pid_t pid = fork(); if (pid < 0) { syslog(LOG_ERR, "fork error"); exit(EXIT_FAILURE); } if (pid == 0) { int fd = open("test.txt", O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR); if (fd < 0) { syslog(LOG_ERR, "open file error"); exit(EXIT_FAILURE); } time_t t; while (1) { t = time(NULL); char *msg = asctime(localtime(&t)); if (write(fd, msg, strlen(msg)) < 0) { syslog(LOG_ERR, "write file error"); exit(EXIT_FAILURE); } sleep(1); } } else { int status; waitpid(pid, &status, 0); if (WIFEXITED(status)) { syslog(LOG_INFO, "child process terminated normally"); } else if (WIFSIGNALED(status)) { syslog(LOG_INFO, "child process terminated by signal"); } else { syslog(LOG_INFO, "child process terminated abnormally"); } } closelog(); return 0; } ``` 编译命令: ``` gcc daemon.c -o daemon ``` 运行命令: ``` ./daemon ``` 运行后,程序会成为守护进程,创建子进程并复制它,子进程会不断向文件test.txt写入当前时间戳,父进程会等待子进程终止后向系统日志文件/var/log/messages写入相应信息。程序的错误信息输出到系统日志文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值