一、rsyslog服务
rsyslog是Linux系统中的守护进程,操作系统产生的各类消息由rsyslog守护进程写入日志文件。例如/usr/sbin/sshd、/usr/bin/login等进程,用户验证后将通过syslog系统调用将消息发送给rsyslog守护进程,然后rsyslog根据日志规则将各类消息写入不同的日志文件中。
二、定义日志等级
Linux系统中的消息根据重要程度可以分为以下八个等级。
级别 | 日志级别 | 说明 |
0 | emerg | 紧急消息。系统崩溃之前提示,表示系统已不可用。 |
1 | alert | 报告消息。表示必须立即采取措施。 |
2 | crit | 临界消息。通常涉及严重的硬件或软件操作失败。 |
3 | err | 错误消息。串口日志的默认级别。驱动程序常用 KERN_ERR 来报告硬件的错误。 |
4 | warning | 警告消息。对可能出现问题的情况进行警告。 |
5 | notice | 正常但又重要的消息。用于提醒,常用于与安全相关的消息。 |
6 | info | 提示消息。如驱动程序启动时,打印硬件消息。 |
7 | debug | 调试消息。设置此级别会打印所有日志消息。 |
C语言中为程序实现日志输出功能时,可以根据消息的重要程度封装不同等级的日志输出函数。
#define xxx_1_emerg(fmt, args...) \
xxx_1 (0, LOG_EMERG, fmt, ## args)
#define xxx_2_alert(fmt, args...) \
xxx_2 (0, LOG_ALERT, fmt, ## args)
#define xxx_3_crit(fmt, args...) \
xxx_3 (0, LOG_CRIT, fmt, ## args)
#define xxx_4_error(fmt, args...) \
xxx_4 (0, LOG_ERR, fmt, ## args)
#define xxx_5_warning(fmt, args...) \
xxx_5 (0, LOG_WARNING,fmt, ## args)
#define xxx_6_notice(fmt, args...) \
xxx_6 (0, LOG_NOTICE, fmt, ## args)
#define xxx_7_info(fmt, args...) \
xxx_7 (0, LOG_INFO, fmt, ## args)
#define xxx_8_debug(fmt, args...) \
xxx_8 (0, LOG_DEBUG, fmt, ## args)
xxx ()函数中可以通过调用syslog()实现不同等级的日志输出。
三、定义不同模块日志关键字
rsyslogd提供了8个自定义日志路径分别是local0 ~ local7,对应的宏定义为LOG_LOCAL0 ~ LOG_LOCAL7。
可以自定义程序中各个模块的日志由哪个local通道输出,但是方便起见,尽可能将所有模块的日志均通过同一个local通道输出,然后为不同模块的日志添加关键字用于区分。
针对多个模块的服务(例如Module-1/Module-2/Module-3),可以分别将关键字定义在日志打印的行首,这样的话就可以区分不同模块的日志。并且可以将多个模块均配置为通过LOG_LOCALX通道输出日志,可以简化系统配置,降低与其他日志输出规则冲突的概率。
#ifdef Module-1
#define Module_1()
openlog("Module-1", XXX, LOG_LOCALX);
#elif Module-2
#define Module_2()
openlog("Module-2", XXX, LOG_LOCALX);
#elif Module-3
#define Module_3()
openlog("Module-3", XXX, LOG_LOCALX);
#endif
四、过滤不同模块的日志
syslog日志默认打印到messages文件,如果想要不同模块的日志输出到单独的日志文件,需要实现以下功能:
(1)禁止日志输出到messages;
(2)过滤不同模块的日志,并重定向到自定义的文件中;
由于各类消息均由rsyslog守护进程写入日志文件,因此可以通过修改rsyslog的配置文件实现禁止日志输出到messages。
编辑 /etc/rsyslog.conf 文件,为messages输出规则增加一项配置localX.none:
*.info;mail.none;authpriv.none;cron.none;localX.none /var/log/messages
然后在/etc/rsyslog.conf 文件新增配置过滤不同模块的日志,并重定向到不同的文件:
:syslogtag,contains,"Module-1" /var/log/xxx.log
& ~
“:syslogtag,contains,"Module-1" /var/log/xxx.log”表示过滤带有Module-1关键字的日志并重定向到/var/log/xxx.log中。
五、功能验证
启动服务验证自定义日志输出功能,首先检查messages中是否有相关日志,其次到相关路径下查看是否生成自定义日志文件。
可以到相关路径下查看带有关键字的日志是否已成功输出到自定义的日志文件中。
注意:syslog日志会存留在缓冲区一段时间,日志并不是实时持久化到本地日志文件,会有一定的延迟。