Linux

配置rsyslogd

2019-05-04  本文已影响4人  牧_青

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输出语句时应当具有辨识度,以便查看。

上一篇下一篇

猜你喜欢

热点阅读