配置rsyslogd
1 简介
在修改内核源码时,需要判断程序执行的情况,最简单的方法就是通过类似C程序中printf输出相关信息,内核函数中与之相似的函数是printk,可以在代码段中加入printk函数输出相关信息到日志中,可以通过查看日志来查看输出的信息。
rsyslogd是系统自带的日志管理工具,可以记录系统中硬件,软件和系统问题的信息,同时还可以见识系统中发生的事情,将异常信息写入对应的日志中,用户可以通过它来检查系统异常的原因。
一点小建议:如果是初学者,看前面一大堆看的头大的话,建议看的时候结合4配置rsyslogd.conf记录printk输出信息 看具体实例,再打开CentOS中的/etc/rsyslog.conf查看其中的相关配置,结合实例,应该能够较快领悟。
2 rsyslog.conf配置详细介绍
配置rsyslog.conf主要有四个因素:
1. 服务名称
2. 连接符号
3. 日志等级
4. 日志存放位置
2.1 服务名称
服务名称有十三种:
1. auth 安全和认证相关信息
2. authpriv 安全和认证相关信息(私有的)
3. cron 系统定时任务cront和at产生的日志
4. daemon 各个守护进程相关日志
5. ftp ftp守护进程产生的日志
6. kern 内核产生的相关日志
7. local0-local7 为本地服务使用预留的服务
8. lpr 打印产生的日志
9.mail 邮件收发信息
10.news 与新闻服务器相关的日志
11.syslog syslog服务产生的日志信息
12.user 用户等级类别的日志信息
13.uucp uucp子系统的日志信息,uucp是早期linux系统进行数据传递的协议,后来也常用在新闻组服务中。
14."*" 可用来表示以上所有服务
2.2 连接符号
连接符号用在服务名称和日志等级之间,用来表示达到符合条件等级的服务日志才会被记录。
符号等级主要包括:
1. "*"表示可以包括所有的日志等级
例如:kern*表示记录所有内核服务产生的日志信息。
2. "."表示记录的日志等级要高于或等于后面连接的日志等级
例如:kern.info表示记录所有内核产生的等级高于或等于info等级的日志信息,对应到3.3,就是记录内核产生的2info , 3notice , 4warning , 5err , 6crit , 7alert , 8emerg等级的信息。
3.".="表示记录与后面连接等级相等的日志信息。
例如:kern.=debug表示记录内核服务中与debug等级相等的日志信息。
4.".!"表示不等于,即除了后面连接的等级,其他等级的日志信息都记录。
例如:kern.!emerg表示内核服务中除了emerg等级,其它等级的信息都记录。
2.3 日志等级
日志等级表示出现问题的严重程度,与printk中的等级划分一致。日志等级由低到高依次为:
1. debug 一般为调试信息的说明
2. info 基本的通知信息
3. notice 普通信息,但是有一定重要性
4. warming 警告信息,但是还不会影响到服务或系统的运行
5. err 错误信息,一般到达了err等级的信息已经可以影响到服务或者系统的运行了。
6. crit 临界状况信息,比err等级还要严重
7. alert 警告状态信息,比之前的都要严重,必须立即采取行动
8. emerg 疼痛等级信息,系统已经无法使用了
7 alert以上等级的输出信息是可以直接打印到控制台上的(这个数值是可更改的,详细可以看printk的原理与直接使用),我只尝试过emerg等级,这个等级是可以直接输出到控制台,慎用!我是在每个进程退出时都会调用的exit()函数中写的emerg等级的printk,结果一打开终端就是进程退出信息,根本就没时间输入自己的命令(手动狗头)。
2.4 日志记录位置
1. 通常使用的都是系统中的文件位置,形式为文件在系统中的绝对路径。
例如:/var/log/kerndebug
2. 系统设备文件
3. 转发给远程主机
4. 系统的其他用户,如"root"
5. 忽略或丢弃,如"~"
3 printk的规范
3.1 printk的书写规范
printk的格式为
printk(日志等级 "需要输出的语句");
需要注意的是:日志等级和输出语句之间并没有逗号隔开。
例如:
printk(KERN_DEBUG "hello world!");
如果没有指定日志级别的话,使用默认级别,一般默认级别为4 KERN_WARNING。
3.2 printk的日志等级
printk的日志等级与前面介绍过的rsyslog的日志等级是一致的,只不过格式所有不同。
有关printk日志等级的信息定义在/include/linux/kernel.h中:
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */
一般作为调试信息的printk使用的是KERN_DEBUG等级。
4 配置rsyslog.conf记录printk输出信息
4.1 配置步骤
1.创建日志文件
切换root用户,在/var/log中创建文件kerndebug
# touch kerndebug
2.更改rsyslog.conf配置
在/etc/rsyslog.conf中添加一行,表示将内核服务输出的debug等级的信息添加到文件/var/log/kerndebug文件中。
kern.=debug /var/log/kerndebug
至此,rsyslog配置完成。
3.添加printk
在内核需要调试的代码处加上printk(等级为debug),重新编译内核,运行新内核,就可以通过日志查看printk的输出语句了。
printk(KERN_DEBUG "hello world!");
4.2 注意事项
1.rsyslog的日志等级要与printk日志等级一致。
例如prink的日志等级为KERN_DEBUG,则rsyslog.conf中记录此printk输出的日志等级应为debug,即kern.=debug。
2.在日志中可能存在的不只是自己写的printk语句,因为编写内核的人员也会写一些调试代码但是没有删除,所以在写自己的printk输出语句时应当具有辨识度,以便查看。