需求

需要让 linux 平台的软件能够输出日志,便于后期的调试和分析。

解决

linux 平台原生支持 syslog 类型的日志服务,不同的发行版可能不同,有可能是 syslog, syslog-ng, rsyslogd 等等。但是具体的程序中输出日志的函数其实是一样的,主要就是三个函数 openlog(), syslog(), closelog().

调用 syslog 函数之前,首先需要包含相应的头文件 #include <syslog.h>

openlog

函数原型为: void openlog(const char *ident, int option, int facility);, 作用是打开一个到系统日志记录程序的连接,实际使用时,这个函数可以省略,在调用 syslog() 时,如果没有打开,会自动打开一个。但是显式使用 openlog 可以进行更多的设定。

  • ident, 设置日志中的生成者的标识,正常使用 NULL 就可以了,会使用程序名进行标识。如果需要自定义一个标识,那么输入字符串即可。
  • option, 设置日志相关属性,简单的可以使用 openlog(NULL, LOG_CONS|LOG_PID, 0); 即可,复杂的使用 openlog(NULL, LOG_CONS | LOG_NDELAY | LOG_NOWAIT | LOG_PID, LOG_LOCAL0);, 具体的含义可以 man openlog
    可选配置 描述
    LOG_CONS 直接写入系统控制台,如果有一个错误,同时发送到系统日志记录。
    LOG_NDELAY 立即打开连接(通常,打开连接时记录的第一条消息)。
    LOG_NOWAIT 不要等待子进程,因为其有可能在记录消息的时候就被创建了(GNU C库不创建子进程,所以该选项在Linux上没有影响。)
    LOG_ODELAY 延迟连接的打开直到syslog函数调用。(这是默认情况下,需要没被指定的情况下。)
    LOG_PERROR (不在SUSv3情况下)同时输出到stderr(标准错误文件)。
    LOG_PID 包括每个消息的PID。
  • facility, 正常为 0 即可。
    设置 描述
    LOG_AUTH 认证系统:login、su、getty等
    LOG_AUTHPRIV 同LOG_AUTH,但只登录到所选择的单个用户可读的文件中
    LOG_CRON cron守护进程
    LOG_DAEMON 其他系统守护进程,如routed
    LOG_FTP 文件传输协议:ftpd、tftpd
    LOG_KERN 内核产生的消息
    LOG_LPR 系统打印机缓冲池:lpr、lpd
    LOG_MAIL 电子邮件系统
    LOG_NEWS 网络新闻系统
    LOG_SYSLOG 由syslogd(8)产生的内部消息
    LOG_USER 随机用户进程产生的消息
    LOG_UUCP UUCP子系统
    LOG_LOCAL0~LOG_LOCAL7 为本地使用保留

syslog

函数原型为 void syslog(int priority, char*format,……);, 有需要输出的日志信息,就调用这个函数进行输出。

  • priority, 表示日志的等级
    优先级 描述
    LOG_EMERG 紧急情况
    LOG_ALERT 应该被立即改正的问题,如系统数据库破坏
    LOG_CRIT 重要情况,如硬盘错误
    LOG_ERR 错误
    LOG_WARNING 警告信息
    LOG_NOTICE 不是错误情况,但是可能需要处理
    LOG_INFO 情报信息
    LOG_DEBUG 包含情报的信息,通常旨在调试一个程序时使用

closelog

函数原型为 void closelog();, 实际使用的时候,也可以省略不用。

参考

syslog函数详解 (转)

系统日志函数syslog(),openlog(),closelog()

syslog的使用