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

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\n", argv[0]);
     syslog(LOG_ERR, "log err %s\n", argv[0]);
     syslog(LOG_WARNING, "log warning %s\n", 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       –内核崩溃等严重信息

 

Linux日志系统分析:rsyslog、syslog和klog_第1张图片

 

 

 

 

 

 

你可能感兴趣的:(Linux)