rsyslog 是负责收集 syslog 的程序,可以用来取代 syslogd 或 syslog-ng。 在这些 syslog 处理程序中,rsyslog 是功能最为强大的。
其特性包括: 支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB,ElasticSearch,等等;
通过 RELP + TCP 实现数据的可靠传输(基于此结合丰富的过滤条件可以建立一种 可靠的数据传输通道供其他应用来使用);
精细的输出格式控制以及对消息的强大 过滤能力;高精度时间戳;队列操作(内存,磁盘以及混合模式等); 支持数据的加密和压缩传输等。


CentOS默认已经安装了
主要配置文件在/etc/rsyslog.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ModLoad imuxsock
$ModLoad imklog
$ModLoad immark
$ModLoad imudp.so
$UDPServerRun 514
$ModLoad imtcp.so
$InputTCPServerRun 514
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

配置文件可以分为以下几部分

模块

输入模块(im 前缀)

imfile - 转换文本文件为日志
imrelp - 通过 RELP 可靠的接收日志。

1
2
$ModLoad imrelp # 加载模块
$InputRELPServerRun 514 # 在 514 端口监听

imudp - 通过 UDP 接收日志

1
2
$ModLoad imudp
$UDPServerRun 514

imtcp - 通过 TCP 接收日志

1
2
3
$ModLoad imtcp
$InputTCPMaxSessions 500
$InputTCPServerRun 514

imptcp - 同 imtcp,但针对 Linux 做高性能定制

immark - 周期性输出标记信息
设置为60,每分钟产生一个 mark 日志
$MarkMessagePeriod 60
imklog - 获取内核日志(通过 dmesg 也能看到相关信息)
imuxsock - UNIX socket
缺省情况下从 /dev/log 获取日志。

1
2
netstat -nxp|grep /dev/log
unix 3 [ ] DGRAM 7439519 9074/rsyslogd /dev/log

impstats - rsyslog 内部数据周期统计

输出模块(om 前缀)

omfile - 输出到文件
支持静态文件;通过模板支持动态文件;
omfwd - 内置模块,转发

1
2
\*.\* @192.168.2.11:10514
\*.\* @@192.168.2.11:10514

omsnmp - SNMP trap 输出

1
2
3
4
5
6
7
$ModLoad omsnmp
$actionsnmptransport udp
$actionsnmptarget localhost
$actionsnmptargetport 162
$actionsnmpversion 1
$actionsnmpcommunity public
\*.\* :omsnmp:

omrelp - RELP output module

1
2
$ModLoad omrelp
\*.\* :omrelp:loghost.example.com:20514

omusrmsg - 内置模块,发送日志到指定用户

1
2
\# Emergencies are sent to everybody logged in.
\*.emerg :omusrmsg:\*

omprog - 发送日志给程序处理
为方便程序解析,日志的输出最好采用 json 格式输出

1
2
3
$ModLoad omprog
$ActionOMProgBinary /home/app/rtdatamq/save_log_data.py
:programname,startswith,"log4report" :omprog:;RSYSLOG_TraditionalFileFormat

ommail - 发送邮件

输出到数据库等

  • ommysql - MySQL
  • ompgsql - PostgreSQL
  • ommongodb - MongoDB
  • omlibdbi - 通用数据库模块
  • omhdfs - Hadoop’s HDFS
  • omelasticsearch - ElasticSearch

规则

规则由过滤器和动作组成。

过滤器

基于设施/优先级的过滤器

格式如下:
<FACILITY>.<PRIORITY>
其中:
第一部分表示生成日志的子系统。取值范围为 auth,authpriv,cron, daemon,kern,lpr,mail,news,syslog,user,uucp,local0 到 local7,
参考 man 3 syslog。其对应的数值请参考 /usr/include/sys/syslog.h, 注意需要忽略移位操作。

第二部分表示日志的级别,取值范围为 7debug,6info,5notice,4warning,3err,2crit,1alert,0emerg。 参考 man 3 syslog
在级别前可以增加相应的修饰符,例如

  • = 表示仅选择该优先级的日志,
  • ! 表示选择不等于优先级的所有日志,
  • 不加任何符号则表示选择该优先级及之上的日志。
  • * 可以用来表示所有的日志子系统和/或消息级别。
  • 关键字 none 表示未指定级别的日志。
  • 如果要定义多个设置/优先级,使用 , 分隔即可。
  • 如果要定义多个过滤条件,则使用 ; 分隔。

示例如下:

1
2
3
4
5
kern.\* # 选择所有级别的内核日志
mail.crit # 选择所有级别为 crit 及之上的邮件系统相关日志
cron.!info,!debug # 选择所有 cron 日志信息,排除优先级为 info 和 debug 的日志
\*.=debug # 选择所有的调试级别日志
\*.\*;auth,authpriv.none # 选择所有级别的日志,以及认证相关无级别的日志

基于属性的过滤器

格式如下:
:<PROPERTY>, [!]<COMPARE_OPERATION>, "<STRING>"
其中 ! 表示对匹配结果取反。
该过滤器可以对所有日志的属性进行过滤(相对传统的 syslog 程序而言),例如: timegenerated 或者 syslogtag,所有的属性列表如下,完整的列表可以参考 这里的 Available Properties 节。部分属性如下:
属性名 说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
msg 日志正文
hostname 日志中的主机名
fromhost 从该主机接收到的消息,可能不是最开始的发送主机
fromhost-ip fromhost 的 IP
syslogtag 日志标签,如 named[12345]
programname 日志标签的静态部分,如 named
pri 日志的 PRI 部分
pri-text PRI 的文本表示,如 syslog.info
syslogfacility 日志类别
syslogfacility-text 日志类别的文本表示
syslogseverity 日志级别
syslogseverity-text 日志级别的文本表示
timegenerated 日志接收时间,或理解为 timereceived
timereported 日志内的报告时间,或生成时间
$now 当前时间,YYYY-MM-DD
$year 当前年,YYYY
$month 当前月,MM
$day 当前日志,DD
$hour 当前小时,24 小时格式,HH
$hhour 当前半小时,0-29 对应 0,30-59 对应 1
$qhour 当前1/4小时,0-3
$minute 当前分钟,MM

每一个属性可以使用下面的比较操作来和某一个指定的值进行从而定义过滤器。
操作符 说明

1
2
3
4
5
contains 属性包含指定的字符串
isequal 属性等于指定的字符串
startswith 属性由指定字符串开始
regex POSIX BRE 正则表达式
ereregex POSIX ERE 正则表达式

示例如下:
:msg,contains,”error” # 选择包含 error 的日志
:hostname,isequal, “host1” # 选择主机名为 host1 的日志
:msg,!regex,”fatal .* error” # 选择不匹配指定正则表达式的日志

基于RainerScript的过滤器

格式如下:
if <EXPRESSION> then <ACTION>
其中, 表示表达式,例如: “$msg startswith ‘DEVNAME’ or $syslogfacility-text == ‘local0’“。 如果表达式结果为真,则会执行相应的动作。

动作

保存日志到指定文件
例如:
cron.* -/var/log/cron.log
如果文件路径前有 - 则表示每次输出日志时不同步(fsync)指定日志文件。 文件路径既可以是静态文件也可以是动态文件。动态文件由模板前加 ? 定义。

  • 通过网络发送日志
    格式如下:
    @[(<options>)]<HOST>:[<PORT>]
    @ 表示使用 UDP 协议。@@ 表示使用 TCP 协议。 可以为: z 表示使用 zlib 压缩,NUMBER 表示压缩级别。多个选项 使用 , 分隔。
    例如:

    1
    2
    3
    \*.\* @192.168.0.1 # 使用 UDP 发送日志到 192.168.0.1
    \*.\* @@example.com:18 # 使用 TCP 发送到 "example.com" 的 18 端口
    \*.\* @(z9)[2001::1] # 使用 UDP 发送消息到 2001::1,启用 zlib 9 级压缩
  • 发送消息到特定用户
    例如
    :msg,contains,"error" liuzx
    发送包含 error 的日志到用户 liuzx。多个用户则用 , 分隔,* 表示所有用户。用户 的 mesg

  • 丢弃日志
    例如
    cron.* ~
    丢弃所有信息,即该配置之后的动作不会看到该日志。
    随 rsyslog 版本不同,如果有如下警告信息,则将 ~ 修改为 stop。
    warning: ~ action is deprecated, consider using the ‘stop’ statement instead [try http://www.rsyslog.com/e/2307 ]
    对每一个过滤条件,可以指定多个动作,每个动作一行即可。这种情况下,也可以通过 “&” 来表示上一行的过滤体检。例如:
    :msg,contains,”error” liuzx
    & @192.168.1.1
    包含 “error” 日志被同时发送给用户 liuzx 和通过 UDP 发送到 192.168.1.1。

日志输出模板

通过模板可以更具需要来控制日志输出的样式。格式如下:

1
2
3
4
5
$template <TEMPLATE_NAME>,"text %<PROPERTY>% more text", [<options>]
|
|
模板指令 模板名 模板格式 其他选项
动态文件输出

通过日志和/或系统属性决定输出文件名。

1
2
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"
\*.\* ?DynamicFile

使用 timegenerated 生成文件名,使用该模板则在前面加上 ?。

其他例子如下:

$template DailyPerHostLogs,"/var/log/syslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages.log"
根据属性控制日志输出格式
使用下面的格式可以对模板之中的属性做各种修改操作从而定制日志的格式:
%<propname>[:<fromChar>:<toChar>:<options>]%

  • 属性名,可用的属性名参考上文。
  • 表示对属性值字符串的操作范围。 设置 为 R, 为正则表达式即可以通过正则 表达式定义范围。
  • 则表示属性选项。
    一些示例如下:
    1
    2
    3
    4
    %msg% # 日志的完整消息文本
    %msg:1:2% # 日志消息文本的最开始两个字符
    %msg:::drop-last-lf% # 日志的完整消息文本,移出最后的换行符
    %timegenerated:1:10:date-rfc3339% # 时间戳的头10个字符并按 RFC3999 标准格式化

下面是一些模板例子。
输出日志的级别,类别,收到日志时的时间戳,主机名,消息标签,消息正文, 加上换行符:
$template verbose,"%syslogseverity%,%syslogfacility%,%timegenerated%,%HOSTNAME%,%syslogtag%,%msg%\n"
输出日志来源,时间以及日志标签,正文,同时还有蜂鸣声(\7):
$template wallmsg,"\r\n\7Message from syslogd@%HOSTNAME% at %timegenerated% ...\r\n %syslogtag% %msg%\n\r"
格式化日志以便于直接进行 SQL 操作:
$template dbFormat,"insert into SystemEvents (Message, Facility,FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%',%syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag%')",sql
以 json 格式输出,方便程序解析:
$template jsonFormat,"{\"message\":\"%msg:::json%\",\"fromhost\":\"%HOSTNAME:::json%\",\"facility\":\"%syslogfacility-text%\",\"priority\":\"%syslogpriority-text%\",\"timereported\":\"%timereported:::date-rfc3339%\",\"timegenerated\":\"%timegenerated:::date-rfc3339%\"}\n"
注意,message 的内容会在最前面多一个空格,其解释请参考这里。
rsyslog 也提供了一些预定义的模板(以 RSYSLOG_ 为前缀),参考 这里 的 Reserved Template Names 节,其定义如下:

  • RSYSLOG_FileFormat
    "%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"
  • RSYSLOG_TraditionalFileFormat
    "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"
  • RSYSLOG_ForwardFormat
    "<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%\"
  • RSYSLOG_TraditionalForwardFormat
    "<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%\"

使用这些模板,则在动作后附加 “;template_name” 即可,例如:
:programname,startswith,"cron" -/var/log/cron;RSYSLOG_TraditionalFileFormat

http://blog.clanzx.net/2013/12/31/rsyslog.html