在Linux
中经常用到ssh
远程登录,Linux
系统的登录,操作系统计划任务crond
都会产生一系列的消息,并且发送到rsyslog
守护进程,再由rsyslog
守护进程写入不同的日志文件中。
rsyslog
守护进程接收到的消息,如何分类写入不同的日志文件中?
对于rsyslog
守护进程接收到消息,并且根据伴随消息的设备常量和/etc/rsyslog.conf
配置文件定义的日志规则进行匹配
比如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
配置文件中的已经定制好的日志规则。
*.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
文件。
-
第二条规则非常好理解,匹配消息类型为
authpriv
,且不限任何消息等级的消息会被写入/var/log/secure
文件。
authpriv.* /var/log/secure
-
同理,下面这条规则匹配消息类型为
mail
,且不限任何消息等级的消息会被写入/var/log/mail.log
文件。
mail.* -/var/log/mail.log
动作字段有一个减号(-)是个啥意思啊?表示被匹配的消息不会立即写入/var/log/mail.log
这个文件,消息会停留在Linux
的缓存区,然后稍晚才被写入。
这样做的目的是有好处的,如果每条规则都是立即写入的话,并且你的Linux
运行的所有服务产生的消息是并发性的话,这样会产生频繁的I/O
开销。
碰到这种情况的话,你就要考虑你需要有条件性地设置rsyslog
守护进程过滤一些没必要消息。
-
下面这条规则,不用我说了吧,请自行思考
cron.* /var/log/cron
-
这条规则,需要好好说一下,意味这匹配任何类型,且消息等级是
emerg
(致命性,最高等级)的消息,会被发送到系统所有用户的登录终端。
字段中的:omusrmsg:*
就表达了这个意思。
*.emerg :omusrmsg:*
最后值得一说的是,如果你的Linux
主机安装了nginx
和httpd
这些第三方的网络服务。
他们运行过程中产生的消息会发送给rsyslog
守护进程处理吗?
这一切取决于提供这些网络服务的开发者,这些网络服务的源代码在日志处理功能是否调用了Unix/Linux
内核提供的系统调用syslog
家族函数。
它们应该是没有和rsyslog
守护进程交互的,因为这些网络服务的源代码内部有自己一套的日志处理实现。
留言