查看pgsql日志_第14篇:Linux 日志管理--rsyslog规则详解

在Linux中经常用到ssh远程登录,Linux系统的登录,操作系统计划任务crond和at进程都会产生一系列的消息,并且发送到rsyslog守护进程,再由rsyslog守护进程写入不同的日志文件中。那作为Linux管理员是否想过如下问题.

其实下图已经很好地回展示了一切,我们以ssh服务进程为例吧来对上面三个问题做一次FAQ

c3b1595416f5fe870a74f0161613a3c3.png

问题1:消息源的进程如何发送消息给rsyslog守护进程?

像/usr/sbin/sshd、/usr/bin/login、/usr/bin/su这些进程,在执行用户验证操作后,他们会调用一个叫syslog的系统调用,syslog系统调用是一个用于向rsyslog守护进程发送消息的的系统函数。

问题2:rsyslog守护进程如何区分进程发送过来的信息类型?

这里需要引入一个叫syslog系统函数相关的概念,就是设备(facility),可以通过man syslog命令查看syslog系统调用的文档,像/usr/sbin/sshd,/usr/bin/login、/usr/bin/su这些进程专门执行登录验证时,它们在调用syslog系统函数会一般会调用LOG_AUTH这个常量,而/usr/bin/crond和/usr/bin/at这些在调用syslog系统调用会传入LOG_CRON这个常量。

58e5dd1f21ca97dc2b5d00af8d07c930.png

也就是说,像上图列举的设备常量就定义了进程发送消息的类型,当rsyslog守护进程在接收到syslog系统调用转发过来的消息时,会检测消息对应的设备常量。就知道下一步该对消息进行哪一种操作。

不过,对于Linux运维岗位的人员来说,不需要理会syslog系统调用的内部细节。

问题3:rsyslog守护进程接收到的消息,如何分类写入不同的日志文件中?

对于rsyslog守护进程接收到消息,并且根据伴随消息的备常量和/etc/rsyslog.conf配置文件定义的日志规则进行匹配

c41144c1b7b08b9bbe35f4939d2089b7.png

如下图所示。比如sshd进程发送的消息类型是LOG_AUTH,那么rsyslog收回进程会匹配到到下图第二条规则,即

authpriv.*     /var/log/secure

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

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

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

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

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

OK,了解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文件。

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

authpriv.*                                              /var/log/secure 

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

mail.*                                                  -/var/log/mail.log 

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

例3:下面这条规则,不用我说了吧,请自行思考

cron.*                                                  /var/log/cron 

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

*.emerg                                                 :omusrmsg:* 

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

动作(Action)

从上文我们已经解析了动作的含义,指定如何处理选择器(即:设备.优先级)过滤或匹配到的消息。但有必要再细说一些可用的操作。

通过网络发送rsyslog消息

使用以下语法将rsyslog消息转发到远程计算机:

<selector>    @[compress_level][remote_server]:[port]
  • –使用单号@将指定UDP为传输协议。
  • 使用@@符号将指定TCP为传输协议。
  • 可选的compress_level字段启用从1到9的zlib压缩级别。
  • remote_server字段指定接收主机。
  • 可选的PORT字段指定接收主机上的端口号。

例如,下面规则将匹配所有类型的且不限等级的消息,将使用UDP协议将邮件转发到10.10.1.2:

*.*        @ 10.10.1.2

所有消息使用TCP协议将消息转发到“sv1.contoso.org”上的端口45:

*.*       @@sv1.contoso.org:45

向特定用户发送rsyslog消息

指定用于发送rsyslog消息的用户名。用户名之间用逗号(,)分隔以指定多个用户。使用星号(*)将消息发送给当前登录的每个用户。以下示例将所有内核消息发送给用户jack,mary,join:

mail.*   jack,mary,john

执行程序

您可以为选定的rsyslog消息执行程序。要指定要执行的程序,请在其前面加上(^)符号。指定用于格式化接收到的消息并将其作为单行参数传递给指定的可执行文件的模板。以下示例通过模板knl处理所有内核消息,并将它们传递给knlprog程序。

kern.*   ^knl-prog;knl

恩,这里给出了其中一种rsyslog规则的格式规范

<设备>.<优先级> <^发送消息的程序;日志模板>

将rsyslog消息写入数据库

您可以使用数据库编写器操作将选定的rsyslog消息直接写到数据库表中。数据库编写器使用以下语法:

:PLUGIN:DB_HOST,DB_NAME,DB_USER,DB_PASSWORD;[TEMPLATE]
  • PLUGIN字段指定执行数据库写入的插件。
  • rsyslog支持MySQL和PostgreSQL数据库。
  • MySQL集成需要rsyslogmysql软件包。
  • PostgreSQL需要rsyslog-pgsql软件包。您还需要加载ommysql为MySQL模块和ompgsql PostgreSQL的模块。

丢弃rsyslog消息

使用波浪号(~)丢弃选定的消息。以下规则丢弃所有news设备产生的消息:

news.* ~

多个动作复合运用的rsyslog规则

我们可以通过符号(&)来为选择器指定多个操作,以下是具有多个操作的rsyslog规则的示例:

mail.*   jack,rack & ^mx_proc;mylog_tpl & @173.12.5.42

上面的示例中,所有mail设备产生消息会完成如下操作:
发送给用户jack,rack
由模板myloc_tpl处理并传递到mx_proc可执行文件
使用UDP协议转发到主机173.12.5.42

rsyslog日志过滤

rsyslogd守护进程提供了三种不同的方式来过滤rsyslog消息:

  1. 基于设备.优先级过滤器
  2. 基于属性的过滤器
  3. 基于表达式的过滤器

基于设备.优先级的过滤

上文已经说的很清楚,这里仅列举一些示例。

例1:要选择优先级err和更高的所有邮件消息:

mail.err      /var/log/mail.log

例2:可以使用星号*指定所有优先级的日志。这样做等同没有过滤.例如下图的规则会指定所有级别的用户安全验证相关的日志写入/var/log/secure

auth.*       /var/log/secure

例3:使用逗号(,)来指定多个设备和优先级。例如,以warning或更高的优先级选择uucp和news设备

uucp,news.warning  /var/log/news.log

例4:使用分号(;)在一行上定义多个选择器,例如下面的规则这是CentOS 7以后的系统的标配规则。

*.info;mail.none;auth.none;cron.none    /var/log/messages

例5:使用等号=指定单个优先级。 但其他优先级均被忽略。 例如,要选择仅具有emerg优先级的cron消息写入/var/log/cron.log

cron.=emerge    /var/log/cron.log

例6:在优先级前加上感叹号(!)的优先级事件会被过滤掉,其他优先级的日志记录会被写入/var/log/iptables.log

kern.!emerge,kern.!crit,kern.!err   /var/log/iptables.log

基于syslog属性的过滤器

因为syslog属性和syslog模板相关。这个内容算是Linux日志系统中比较复杂的一个部分,故此,留到下一篇再说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值