内容目录

Linux中经常用到ssh远程登录,Linux系统的登录,操作系统计划任务crond都会产生一系列的消息,并且发送到rsyslog守护进程,再由rsyslog守护进程写入不同的日志文件中。

  • rsyslog守护进程接收到的消息,如何分类写入不同的日志文件中?
    对于rsyslog守护进程接收到消息,并且根据伴随消息的设备常量和/etc/rsyslog.conf配置文件定义的日志规则进行匹配

file

比如sshd进程发送的消息类型是LOG_AUTH,那么rsyslog守护进程会匹配到到下图第二条规则,即
authpriv.* /var/log/secure

这条规则的意思,匹配authpriv.类型的消息,并且将该消息写入/var/log/secure这个日志文件。
这条规则左侧的authpriv.*,我们叫做选择器(Selector), 右侧的/var/log/secure我们叫做动作(Action)

rsyslogd守护进程的配置文件/etc/rsyslog.conf由一系列规则语句和配置选项组成,syslog规则由选择器(Selector)和操作(Action)

  • 选择器 :就是要匹配消息的类型,由设备消息等级以点号(.)隔开
  • 动作 :顾名思义就是如何处理匹配的消息,要么写入动作字段指向的日志文件,要么转发到远程的日志服务器,要么丢弃。

关于消息等级在选择器中是日志分级由高到低排列如下

  • emerg: 表示系统无法使用
  • alert: 必须立即采取措施
  • crit: 致命级别
  • err: 错误级别
  • warning: 警告级别
  • notice: 通知级别
  • info: 正常级别
  • debug: 调试消息
  • none: 不记录任何东西

了解rsyslog的基本原理和相关术语之后,不妨解读一下/etc/rsyslog.conf配置文件中的已经定制好的日志规则。

  1. *.info;mail.none;authpriv.none;cron.none /var/log/messages

这条规则,由4个选择器由分号(;)隔开,他们之间是并集的关系,每个具体含义如下。

  • *.info的表示匹配所有任何设备,但消息级别是info以上的消息;
  • mail.none这个选择器的消息等级是none,意味着不会匹配mail类型的任何等级的消息。
  • 同理:authpriv.none选择器,标识不会匹配authpriv类型的任何等级的消息。
  • 同理:cron.none选择器,标识不会匹配cron类型的任何等级的消息。

那么,这条规则的意思就是:任何设备类型且仅当消息等级为info以上的消息会被写入action字段指向的/var/log/messages文件。

  1. 第二条规则非常好理解,匹配消息类型为authpriv,且不限任何消息等级的消息会被写入/var/log/secure文件。
    authpriv.* /var/log/secure

  2. 同理,下面这条规则匹配消息类型为mail,且不限任何消息等级的消息会被写入/var/log/mail.log文件。
    mail.* -/var/log/mail.log

动作字段有一个减号(-)是个啥意思啊?表示被匹配的消息不会立即写入/var/log/mail.log这个文件,消息会停留在Linux的缓存区,然后稍晚才被写入。
这样做的目的是有好处的,如果每条规则都是立即写入的话,并且你的Linux运行的所有服务产生的消息是并发性的话,这样会产生频繁的I/O开销。
碰到这种情况的话,你就要考虑你需要有条件性地设置rsyslog守护进程过滤一些没必要消息。

  1. 下面这条规则,不用我说了吧,请自行思考
    cron.* /var/log/cron

  2. 这条规则,需要好好说一下,意味这匹配任何类型,且消息等级是emerg(致命性,最高等级)的消息,会被发送到系统所有用户的登录终端。
    字段中的:omusrmsg:* 就表达了这个意思。
    *.emerg :omusrmsg:*

最后值得一说的是,如果你的Linux主机安装了nginxhttpd这些第三方的网络服务。
他们运行过程中产生的消息会发送给rsyslog守护进程处理吗?
这一切取决于提供这些网络服务的开发者,这些网络服务的源代码在日志处理功能是否调用了Unix/Linux内核提供的系统调用syslog家族函数。
它们应该是没有和rsyslog守护进程交互的,因为这些网络服务的源代码内部有自己一套的日志处理实现。

最后修改日期: 2024年8月5日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。