1. 简介
syslog机制包含syslogd守护进程与syslog(3)系列库函数:syslog(3)库函数用于程序调用以生成日志,syslogd守护进程负责发布日志,通过提供/dev/log Unix域数据报套接字或UDP协议的514端口,以支持与syslog(3)调用端程序的本地与网络通信方式。
syslogd守护进程根据自身配置文件中的定义,将产生的日志发布至终端控制台,FIFO,网络套接字,磁盘文件,登录用户等。
大多数Linux发行版中,syslogd已经被rsyslogd替代,主配置文件为/etc/rsyslog.conf。
2. 用法
syslog(3)系列库函数主要包括openlog(3),syslog(3),closelog(3)与setlogmask(3),分别用于打开日志,记录日志,关闭日志以及过滤日志。
#include
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
int setlogmask(int mask);
#include
void vsyslog(int priority, const char *format, va_list ap);
openlog(3)用于建立与syslogd守护进程的连接,以及设置日志记录的默认行为
ident指定日志信息的标识字符串,为NULL时将使用程序名称
option指定控制openlog(3)行为的的标志,多个标志之间可以采取按位或运算而取并集:
LOG_CONS:向syslogd发送日志出错时,将日志发送至系统控制台
LOG_NDELAY:立即建立与syslogd的连接,而不必等到第一条日志信息产生时
LOG_NOWAIT:对于在记录日志过程中创建的子进程,不执行wait(2);glibc的openlog(3)实现不创建子进程,因而该选项在Linux下无效
LOG_ODELAY:与LOG_NDELAY相反,仅在第一条日志信息产生时才创建与syslogd的连接;默认选项
LOG_PERROR:将日志信息发给syslogd的同时,打印至stderr
LOG_PID:每一条日志信息中另包含进程PID
facility指定日志记录的默认类型,包括LOG_AUTH/LOG_AUTHPRIV/LOG_CRON/LOG_DAEMON/LOG_FTP/LOG_KERN/LOG_LOCAL0-LOG_LOCAL7/LOG_LPR/LOG_MAIL/LOG_NEWS/LOG_SYSLOG/LOG_USER/LOG_UUCP
对应用程序常用为LOG_DAEMON与LOG_USER,分别表示守护进程专用日志信息,以及用户级信息,默认为LOG_USER
openlog(3)的调用是可选的,调用syslog(3)将自动调用openlog(3);未调用openlog(3)时,syslog(3)将根据priority指定的方式与优先级记录日志,且日志的标识字符串将被设置为程序名称。
priority由openlog(3)的facility参数之一,与表示日志信息优先级的level之一,进行按位或运算得出level值按优先级从高到低的顺序依次为:
LOG_EMERG:紧急,系统不可用
LOG_ALERT:告警,必须立即采取操作
LOG_CRIT:紧急
LOG_ERR:一般错误
LOG_WARNING:警告
LOG_NOTICE:一般但重要的错误,须特殊处理
LOG_INFO:报告信息
LOG_DEBUG:诊断信息
format参数表示日志信息字符串,与printf(3)的format参数指定方式相同;作为glibc扩展,格式化字符串中的%m序列将被替换为错误信息字符串strerror(errno)而无需参数,syslog(3)会在format指定的日志信息字符串后自动添加换行符。
closelog(3)用于关闭连接syslogd守护进程的文件描述符,由于文件描述符在进程退出后将自动被释放,因此该调用可选。
宏LOG_MASK(level)与LOG_UPTO(level)用于将level宏转换为相应的位掩码,区别在于,每次调用LOG_MASK(level)仅根据level生成单个位掩码,而LOG_UPTO(level)将level及高于level的所有优先级进行转换,然后将所有位掩码进行按位或操作。
setlogmask(3)根据mask指定的level位掩码进行日志信息过滤,mask为经过LOG_MASK(level)或LOG_UPTO(level)转换的值,若syslog(3)中的level值未出现在mask中,则该条日志信息将被忽略。
vsyslog(3)是glibc提供的非标准的日志记录库函数,其中,priority参数与syslog(3)相同,另外2个参数分别与vprintf(3)的format与ap参数的指定方式相同,即通过stdarg(3)系列宏获取可变参数列表。
util-linux软件包提供的logger(1)工具基于syslog(3)实现了系统日志的shell命令接口。
3. 参考
syslog(3)
logger(1)