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 –内核崩溃等严重信息