Linux日志系统分析:rsyslog、syslog和klog

2019-07-13 04:23发布

ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版 ---------------------------------------------------------------------------------   1. syslogd和rsyslogd syslogd是Linux下的一个记录日志文件服务。从结构来说,可以理解为这个服务下面有一系列的子服务,例如mail、auth、cron、kern等等,这些子服务对外提供日志记录的功能,而当其它的程序或服务需要记录日志的时候,就可以直接调用这些子服务将日志记录到设定的地方。而配置这整个守护进程以及其子服务的地方就是/etc/syslog.conf这个文件。 而目前不少的Linux发行版已经用rsyslogd将syslogd代替了。rsyslogd是syslogd的升级版,其配置语法与syslogd的配置文件一致。ubuntu-gnome-16.04使用的是rsyslogd。 注: 在用户空间有专门用于记录系统日志的程序,统称为“syslog守护进程”。早期及现在的大部分嵌入式系统使用的是klogd+syslogd组合,现在大多数发行版都使用rsyslogd或者syslogd-ng。 如果需要修改系统日志配置,修改以下两个文件。 1)/etc/rsyslog.conf 2)/etc/rsyslog.d/50-default.conf 日志文件的记录规则和路径 操作: sudo service rsyslog restart sudo service rsyslog stop sudo service rsyslog start   2. 查看linux日志的三种途径: 1)dmesg printk()打印的日志会写到kernel ring buffer(环缓冲区)中,dmesg是从kernel ring buffer中读取内核日志信息。 2)/var/log/ 系统所有日志(包括用户日志和系统内核日志)均记录在/var/log/目录下。 rsyslogd守护进程根据/etc/rsyslog.conf和/etc/rsyslog.d/50-default.conf,将不同的服务产生的log记录到不同的文件中。 3)/proc/kmsg 通过读取/proc/kmsg也可以得到ring buffer(环缓冲区)的日志,但是对/proc/kmsg进行读操作后,ring buffer中被读取的数据将被清空。 注:如果启用了rsyslogd服务,则不能读取/proc/kmsg 文件(文件为空),同一时间只能用一种方法来获取日志文件。   3. 日志记录的接口: 1)内核空间:printk() 可以使用dmesg命令来查看,使用printk()打印的日志同时也会记录在/var/log/kern.log和/var/log/syslog。当然也可以关闭rsyslogd服务,通过读取/proc/kmsg来查看。 2)用户空间:syslog()函数和logger(logger可在命令行中直接执行) void syslog(int priority, char*format,……); 打印的日志记录在 /var/log/syslog文件中。 注:据自己理解,syslog()打印的日志不会写到kernel ring buffer,只有printk才会写入kernel ring buffer。   4. 自定义日志记录路径 4.1 修改/etc/rsyslog.d/50-default.conf 在文件最后添加如下一行: local0.* /var/log/my_logfile0 注:local0—local7均可。 4.2 重启Ubuntu 注:试了执行service rsyslog restart 但是无法使规则生效。 4.3 编写代码测试 #include int main(int argc, char *argv[]) { openlog("test_my_log", LOG_CONS| LOG_PID, LOG_LOCAL0); setlogmask(LOG_UPTO(LOG_NOTICE)); //设置屏蔽低于NOTICE级别的日志信息 syslog(LOG_INFO, "log info %s ", argv[0]); syslog(LOG_ERR, "log err %s ", argv[0]); syslog(LOG_WARNING, "log warning %s ", argv[0]); closelog(); return 0; } 1)gcc log.c 2)./a.out 3)grep test_my_log /var/log/* 结果如下: /var/log/my_logfile0:Apr 12 20:30:49 ubuntu test_my_log[2456]: log err ./a.out /var/log/my_logfile0:Apr 12 20:30:49 ubuntu test_my_log[2456]: log warning ./a.out /var/log/syslog:Apr 12 20:30:49 ubuntu test_my_log[2456]: log err ./a.out /var/log/syslog:Apr 12 20:30:49 ubuntu test_my_log[2456]: log warning ./a.out 可知log信息被记录到my_logfile0,同时也被记录到syslog。 注: 0 debug       –有调式信息的,日志信息最多 1 info        –一般信息的日志,最常用 2 notice      –最具有重要性的普通条件的信息 3 warning     –警告级别 4 err         –错误级别,阻止某个功能或者模块不能正常工作的信息 5 crit        –严重级别,阻止整个系统或者整个软件不能正常工作的信息 6 alert       –需要立刻修改的信息 7 emerg       –内核崩溃等严重信息