安装 rsyslog 和 logroate 服务
yum install rsyslog
yum install logrotate
rsyslog配置文件
#rsyslog v3 config file [兼容版本号]
#### MODULES #### 加载模块
$ModLoad imuxsock.so # 本地系统日志 (e.g. via logger command)
$ModLoad imklog.so # provides kernel logging support (previously done by rklogd)
# 允许514端口接收使用UDP协议转发过来的日志
#$ModLoad imudp.so
#$UDPServerRun 514
# 允许514端口接收使用TCP协议转发过来的日志
#$ModLoad imtcp.so
#$InputTCPServerRun 514
#### GLOBAL DIRECTIVES ####
# 定义日志格式默认模板
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on
#### RULES ####
# 关于内核的所有日志都放到/dev/console(控制台)
#kern.* /dev/console
# 记录所有日志类型的info级别以及大于info级别的信息到 /var/log/messages,但是mail邮件信息,authpriv验证方面的信息和cron时间任务相关的信息除外
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# authpriv验证相关的所有信息存放在/var/log/secure
authpriv.* /var/log/secure
# 邮件的所有信息存放在/var/log/maillog; 这里有一个-符号, 表示是使用异步的方式记录, 因为日志一般会比较大
mail.* -/var/log/maillog
# 计划任务有关的信息存放在/var/log/cron
cron.* /var/log/cron
# 记录所有的大于等于emerg级别信息, 以wall方式发送给每个登录到系统的人(* 代表所有在线用户 )
*.emerg *
# 记录uucp,news.crit等存放在/var/log/spooler
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log 启动的相关信息
local7.* /var/log/boot.log
# 转发规则
# remote host is: name/ip:port, port optional (e.g. 192.168.0.1:514)
*.* @@remote-host:514
# @@表示通过tcp协议发送 @表示通过udp进行转发
日志级别
-
debug
有调式信息的,日志信息最多 -
info
一般信息的日志,最常用 -
notice
最具有重要性的普通条件的信息 -
warning
警告级别 -
err
错误级别,阻止某个功能或者模块不能正常工作的信息 -
crit
严重级别,阻止整个系统或者整个软件不能正常工作的信息 -
alert
需要立刻修改的信息 -
emerg
内核崩溃等严重信息 -
none
什么都不记录
从上到下,级别从低到高,记录的信息越来越少
连接符号
-
.xxx
:表示大于等于xxx级别的信息 -
.=xxx
:表示等于xxx级别的信息 -
.!xxx
:表示在xxx之外的等级的信息
Actions
记录到普通文件或设备文件:
. /var/log/file.log # 绝对路径
. /dev/pts/0
logger 命令用于产生日志:logger -p local3.info 'KadeFor is testing the rsyslog and logger'
转发到远程::
. @192.168.0.1 # 使用UDP协议转发到192.168.0.1的514(默认)端口
. @@192.168.0.1:10514 # 使用TCP协议转发到192.168.0.1的10514(默认)端口发送给用户(需要在线才能收到)::
. root
. root,kadefor,up01 # 使用,号分隔多个用户
. * # *号表示所有在线用户忽略,丢弃::
local3.* ~ # 忽略所有local3类型的所有级别的日志执行脚本::
local3.* ^/tmp/a.sh # ^号后跟可执行脚本或程序的绝对路径
# 日志内容可以作为脚本的第一个参数. 可用来触发报警
注意: 日志记录的顺序有先后关系!
实例: 过滤特定的日志到文件
# 过滤日志, 由:号开头
:msg, contains, “error” /var/log/error.log
:msg, contains, “error” ~ # 忽略包含error的日志
:msg, contains, “user nagios” ~
:msg, contains, “user kadefor” ~
:msg, contains, “module-alsa-sink.c: ALSA woke us up to write new data to the device, but there was actually nothing to write” ~
local3.* ~
& ~ # 忽略所有的日志.
实例: 使用模板来定义日志格式
定义默认的日志格式:
$template myFormat,”%rawmsg%\n”
$ActionFileDefaultTemplate myFormat
如果不要$ActionFileDefaultTemplate myFormat
这一行, 就需要像这样来使用模板:
在日志文件后添加模板名, 并用;号分隔
$template myFormat,”%rawmsg%\n”
authpriv.* /var/log/secure;myFormat
mail.* /var/log/maillog;myFormat
cron.* /var/log/cron;myFormat
*.emerg *
uucp,news.crit /var/log/spooler;myFormat
local7.* /var/log/boot.log;myFormat
实例: remote log 远程发送与接收:
配置服务端(接收)
$ModLoad imtcp.so # 使用tcp方式
$InputTCPMaxSessions 500 # tcp接收连接数为500个
$InputTCPServerRun 514 # tcp接收信息的端口
# 定义一个名为logformat模板, 为信息加上日志时间
$template logformat, "%TIMESTAMP:::date-mysql% %FROMHOST-IP%%msg%\n"
# 定义日志文件的名称,按照年月日
$template DynFile, "/var/log/tlog%$year%%$month%%$day%.log"
# 把rawmsg(也可以使用msg)日志中包含sdns_log标志的信息写到DynFile定义的日志文件里
:rawmsg, contains, "sdns_log" ?DynFile;logformat
# 这个表示丢弃包含sdns_log标志的信息, 一般都加上它, 以免多个日志文件记录重复的日志
:rawmsg, contains, "sdns_log" ~
配置客户端(发送)
# 把包含sdns_log的信息通过tcp发到192.168.1.2 @@表示tcp @表示udp
:rawmsg, contains, “sdns_log” @@192.168.1.2 # 默认514端口
# 这个表示丢弃包含sdns_log标志的信息,防止这个信息写到本机的/var/log/message
:rawmsg, contains, “sdns_log” ~
测试:在客户端上执行 logger -p user.info "sdns_log 34334"
在服务端的/var/log/目录里是否有tlog*日志产生
如果要把不同服务器发送过来的日志保存到不同的文件, 可以这样操作
:fromhost-ip, isequal, “192.168.0.160″ /var/log/host160.log
:FROMHOST-IP, isequal, “192.168.0.161″ /var/log/host161.log
:FROMHOST-IP, startswith, “192.168.1.” /var/log/network1.log
:FROMHOST-IP, startswith, “192.168.2.” /var/log/network2.log
属性替代
属性替代
Rsyslog 预定义了一些属性,来代表消息中的信息,我们可以在定义输出格式、动态文件名的时候使用到这些属性。这里面比较重要的属性比如:msg(消息体)、hostname、pri(消息等级和类别)、time(时间有关),属性的名称中以是从消息中获得变量。
属性替代的语法格式:
%propname:fromChar:toChar:options:fieldname%
属性替换的功能很强大,你可以使用起始字符获取自己所需的字段,也可以使用正则表达式,也可以使用分隔符。举几个例子:为了兼容一个rfc协议,rsyslog规定如果用户输入的msg不是以空格开头,rsyslog会自动补充一个空格,因此如果你希望输出的时候去掉这个空格,就可以使用:
%msg:2:$%
选取msg变量中,起始位置为2,终止位置为结尾我们经常需要根据空格来分析字符串,F表示使用字符分割,32是空格的ascii码。 按照空格分隔,取第三个子串,例:
%msg:F,32:3%模板
模板的功能是定义输出格式,或者定义omfile模块的动态路径、动态文件。需要使用上面提到的属性替换。
模板定义的形式有四种,适用于不同的输出模块,一般简单的格式,可以使用string
的形式,复杂的格式,建议使用list
的形式,使用list
的形式,可以使用一些额外的属性字段(property statement),例如:position.from
、position.end
。
如果不指定输出模板,rsyslog会默认使用RSYSLOG_DEFAULT
。
如果你只想输出msg,可以定义模板
template f_debug, “/data0/logs/%month%-%$day%/debug.log”-
Ruleset
Ruleset实现的是多实例的功能,可以针对syslog的来源使用不同的过滤规则。需要注意的是,在配置文件中需要先定义ruleset,才可以使用。比较典型的一个例子,针对不同的端口使用不同的过滤规则。$Ruleset tcp1999 $RulesetCreateMainQueue on Local3.* @@10.0.0.44:1999 $Ruleset tcp2000 $RulesetCreateMainQueue on Local4.* @@10.0.0.44:2000
在定义好ruleset后,各个输出模块就可以指定自己使用的ruleset了,具体如何指定,可以查看输出模块的手册,一般会有一个ruleset的参数,用来实现这个功能。
- Filter模块
Rsyslog可以使用syslog标准的过滤规则,同时自己添加了一些扩展。比如可以在输出中指定rsyslog自己的处理方式,可以指定输出template,方法是在规则后面添加template的名字,用分号隔开。
例如我们可以编写一个规则
Local3.* -/data0/logs/local3.log;t_msg
#在这个输出中使用t_msg的模板
Local4.* -?f_local3_test;t_msg
问号表示要使用模板定义的动态路径.
除了syslog标准的规则,rsyslog的作者还自己开发了一个叫做rainerscript的脚本语言,来定义更复杂的过滤过则,rainerscript 可以对属性进行startwith
、contains
、%
(取余)等过滤规则,例如
If msg contains “abc” then{ #pri为local3,且在消息中包含子串‘abc’
. -/data0/logs/local3.log;t_msg
}
还有第三种方式是使用属性的表示方式,例如
:msg, regex, "^ [g-z]" /root/rsyslog_worker_dir/2000.log
# 以字母g到z开头的消息,注意msg开头有个空格 - 队列
队列是rsyslog中比较重要的一个部分,作为使用者,我们需要了解的是队列的种类:主队列 和 工作队列。从输入模块接收的消息会进入主队列,主队列中的消息,经过过滤模块,会进入到相应的工作队列;队列的四种工作模式:direct mode、disk mode、FixedArray mode 和 LinkedList mode,前两种是磁盘队列,更可靠,但是性能也较差,后两种是内存队列,区别是前者是预分配队列长度,后者是动态分配,如果你的系统日志流量比较平稳,可以使用预分配队列,如果日志属于突发型,可以使用动态队列。此外,内存队列还可以通过指定一个queuename来添加DA模式,DA模式主要是为了防止意外情况(进程关闭、server端宕机)下,内存队列可以不丢失。
通过查看rsyslog的系统命令,可以知道rsyslog对队列进行大量的可配参数,来定义队列的行为。可以根据需要来进行优化。