需求
需要让 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();
, 实际使用的时候,也可以省略不用。