在数据为王的时代,日志管理是一个绕不开的话题,相应的开源软件有不少,比如热门的三件套:Logstash、ElasticSearch、Kibana,但这套开源日志系统有点重量级,当然本博客也有专题介绍。
一台服务器的日志对系统工程师来说是至关重要的,一旦服务器出现故障或被入侵,我们需要查看日志来定位问题的关键所在,所以说对于线上跑的服务器而言日志应该合理的处理及管理。
Syslog协议
系统日志(Syslog)协议是在一个IP网络中转发系统日志信息的标准,它是在美国加州大学伯克利软件分布研究中心(BSD)的TCP/IP系统实施中开发的,目前已成为工业标准协议,可用它记录设备的日志。Syslog记录着系统中的任何事件,管理者可以通过查看系统记录随时掌握系统状况。系统日志通过Syslog进程记录系统的有关事件,也可以记录应用程序运作事件。通过适当配置,还可以实现运行Syslog协议的机器之间的通信。通过分析这些网络行为日志,可追踪和掌握与设备和网络有关的情况。
在Unix类操作系统上,syslog广泛应用于系统日志。syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见的应用场景是网络管理工具、安全管理系统、日志审计系统。
完整的syslog日志中包含产生日志的程序模块(Facility)、严重性(Severity或 Level)、时间、主机名或IP、进程名、进程ID和正文。在Unix类操作系统上,能够按Facility和Severity的组合来决定什么样的日志消息是否需要记录,记录到什么地方,是否需要发送到一个接收syslog的服务器等。由于syslog简单而灵活的特性,syslog不再仅限于Unix类主机的日志记录,任何需要记录和发送日志的场景,都可能会使用syslog。
rsyslog日志系统
对于日志管理,老版本的Linux系统(Centos 6以前)缺省使用Syslog,在老版本的Linux系统上syslog不仅表示一个系统日志协议,同时程序名称也叫syslog,其配置文件为”/etc/syslog.conf“,信息如下介绍:
# 表示将所有facility的info级别,但不包括mail,authpriv,cron相关的信息,记录到 /var/log/messages文件
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 表示将权限,授权相关的所有基本的信息,记录到/var/log/secure文件中.这个文件的权限是600
authpriv.* /var/log/secure
# 表示将mail相关的所有基本的信息记录到/var/log/maillog文件中,可以看到路径前面有一个"-"而"-" 表示异步写入磁盘
mail.* -/var/log/maillog
# 表示将任务计划相关的所有级别的信息记录到/var/log/cron文件中
cron.* /var/log/cron
# 表示将所有facility的emerg级别的信息,发送给登录到系统上的所有用户
*.emerg *
# 表示将uucp及news的crit级别的信息记录到/var/log/spooler文件中
uucp,news.crit /var/log/spooler
# 表示将local7的所有级别的信息记录到/var/log/boot.log文件中上面说过local0 到local7这8个是用户自定义使用的,这里的local7记录的是系统启动相关的信息
local7.* /var/log/boot.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 表示将所有facility的info级别,但不包括mail,authpriv,cron相关的信息,记录到 /var/log/messages文件
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 表示将权限,授权相关的所有基本的信息,记录到/var/log/secure文件中.这个文件的权限是600
authpriv.* /var/log/secure
# 表示将mail相关的所有基本的信息记录到/var/log/maillog文件中,可以看到路径前面有一个"-"而"-" 表示异步写入磁盘
mail.* -/var/log/maillog
# 表示将任务计划相关的所有级别的信息记录到/var/log/cron文件中
cron.* /var/log/cron
# 表示将所有facility的emerg级别的信息,发送给登录到系统上的所有用户
*.emerg *
# 表示将uucp及news的crit级别的信息记录到/var/log/spooler文件中
uucp,news.crit /var/log/spooler
# 表示将local7的所有级别的信息记录到/var/log/boot.log文件中上面说过local0 到local7这8个是用户自定义使用的,这里的local7记录的是系统启动相关的信息
local7.* /var/log/boot.log
关于Syslog的内容我并不想多说,大家如果有不清楚的地方,可以参考鸟哥的Linux私房菜。虽然Syslog中规中矩,但是随着时间的推移,无论是功能还是性能,它都显得捉襟见肘,于是出现了:Rsyslog和Syslog-ng,它们都涵盖SysLog的常用功能,不过在功能和性能上更为出色,至于孰优孰劣是个仁者见仁智者见智的问题,鉴于多数Linux发行版均选择了Rsyslog,下面就说说Rsyslog。
它所做的事就是统一记录系统的各个子系统产生的日志。但是像FTP、HTTP它们都有自己日志记录格式不是系统的Rsyslog。在Rsyslog系统有两个进程分别是klogd,syslogd。而为什么需要两个守护进程呢?是因为内核跟其他信息需要记录的详细程度及格式的不同。
klogd:记录内核信息,系统启动中在登录之前使用的都是物理终端/dev/console,这个时候虚拟终端还没有启动而内核启动日志都存放在/var/log/dmesg文件中,使用dmesg命令可以查看。
syslogd:记录非内核系统产生的信息,当系统启动/sbin/init程序时产生的日志都存放在以下各个日志文件中。
/var/log/message #标准系统错误信息;
/var/log/maillog #邮件系统产生的日志信息;
/var/log/secure #记录系统的登录情况;
/var/log/dmesg #记录linux系统在引导过程中的各种记录信息;
/var/log/cron #记录crond计划任务产生的时间信息;
/var/log/lastlog #记录每个用户最近的登录事件;
/var/log/wtmp #记录每个用户登录、注销及系统启动和停机事件;
/var/run/btmp #记录失败的、错误的登录尝试及验证事件;
1
2
3
4
5
6
7
8
/var/log/message#标准系统错误信息;
/var/log/maillog#邮件系统产生的日志信息;
/var/log/secure#记录系统的登录情况;
/var/log/dmesg#记录linux系统在引导过程中的各种记录信息;
/var/log/cron#记录crond计划任务产生的时间信息;
/var/log/lastlog#记录每个用户最近的登录事件;
/var/log/wtmp#记录每个用户登录、注销及系统启动和停机事件;
/var/run/btmp#记录失败的、错误的登录尝试及验证事件;
另外当日志文件过大时会通过系统crontab定义日志滚动的,也称日志切割,由logrotate控制其配置文件/etc/logrotate.conf,然后再由系统任务计划执行。logrotate负责备份和删除旧日志, 以及更新日志文件。后面详说。
syslog协议格式定义如下:
facility.priority action
1
facility.priorityaction
facility(设施):标识系统需要记录日志的子系统,大概有以下子系统。
auth #PAM认证相关日志;
authpriv #SSH、FTP登录相关日志;
cron #任务计划相关日志;
daemon #守护进程相关日志;
kern #内核相关日志;
lpr #打印相关日志;
mail #邮件相关日志;
mark #标记相关日志;
news #新闻相关日志;
security #安全相关日志与auth类似;
syslog #Rsyslog自己的日志;
user #用户相关日志;
uucp #UNIX to UNIX cp相关日志;
local0 to local7 #用户自定义使用设置日志;
* #表示所有的facility;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
auth#PAM认证相关日志;
authpriv#SSH、FTP登录相关日志;
cron#任务计划相关日志;
daemon#守护进程相关日志;
kern#内核相关日志;
lpr#打印相关日志;
mail#邮件相关日志;
mark#标记相关日志;
news#新闻相关日志;
security#安全相关日志与auth类似;
syslog#Rsyslog自己的日志;
user#用户相关日志;
uucp#UNIX to UNIX cp相关日志;
local0tolocal7#用户自定义使用设置日志;
*#表示所有的facility;
priority(级别):用来标识日志级别,级别越低信息越详细,有以下日志级别,从上到下,级别从低到高,记录的信息越来越少,详细的可以查看手册: man 3 syslog。
debug #程序或系统调试信息;
info #一般信息;
notice #不影响正常功能需要注意的信息;
warning #可能影响系统功能提醒用户的重要事件;
error #错误信息;
crit #比较严重的信息;
alert #必须马上处理的警告信息;
emerg/panic #会导致系统不可用的严重信息;
* #表示所有日志级别;
none #跟*相反表示什么都没有;
1
2
3
4
5
6
7
8
9
10
debug#程序或系统调试信息;
info#一般信息;
notice#不影响正常功能需要注意的信息;
warning#可能影响系统功能提醒用户的重要事件;
error#错误信息;
crit#比较严重的信息;
alert#必须马上处理的警告信息;
emerg/panic#会导致系统不可用的严重信息;
*#表示所有日志级别;
none#跟*相反表示什么都没有;
action(动作):设置日志记录的位置,有以下几种。
1)记录到普通文件或设备文件
*.* /var/log/file.log #绝对路径
*.* /dev/pts/0 #设备文件
1
2
*.* /var/log/file.log #绝对路径
*.* /dev/pts/0#设备文件
2)”|”,表示将日志送给其他命令处理
3)”@HOST”,表示将日志发送到特定的主机
*.emerg @192.168.10.1
1
4)”用户”,表示将日志发送到特定的用户
5)”*”,表示将日志发送所有登录到系统上的用户
连接符号
. #表示大于等于xxx级别的信息;
.= #表示等于xxx级别的信息;
.! #表示在xxx之外的等级的信息;
1
2
3
.#表示大于等于xxx级别的信息;
.=#表示等于xxx级别的信息;
.!#表示在xxx之外的等级的信息;
格式定义案例(定义在/etc/rsyslog.conf配置文件)
# 表示将mail相关的,info级别及以上级别都记录到mail.log文件中
mail.info /var/log/mail.log
# 表示将auth相关的基本为info信息记录到远程主机
auth.=info @192.168.10.1
# 表示记录与user和error相反的
user.!error
# 表示记录所有日志信息的info级别及以上级别
*.info
# 所有日志及所有级别信息都记录下来
*.*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 表示将mail相关的,info级别及以上级别都记录到mail.log文件中
mail.info /var/log/mail.log
# 表示将auth相关的基本为info信息记录到远程主机
# 表示记录与user和error相反的
user.!error
# 表示记录所有日志信息的info级别及以上级别
*.info
# 所有日志及所有级别信息都记录下来
*.*
PS:多个日志来源可以使用,号隔开,如cron.info;mail.info。
Rsyslog架构阐述
Rsyslog架构,这是rsyslog官网上的一张图,用来介绍rsyslog的架构,rsyslog的消息流是从输入模块->预处理模块->主队列->过滤模块->执行队列->输出模块。
在这个流程图中,输入、输出、过滤三个部分称为module,输入模块有imklg、imsock、imfile。输出模块有omudp、omtcp、omfile、omprog、ommysql、omruleset(后两者我没有研究,本文不会涉及)。过滤模块研究不多,只会提到mmnormalize。
预处理模块主要解决各种syslog协议实现间的差异,举例说明如果日志系统client端使用rsyslog、server端使用syslog-ng,如果自己不做特殊处理syslog-ng是无法识别的。但是反过来,rsyslog的server端就可以识别syslog-ng发过来的消息。
Input模块,包括imklg、imsock、imfile、imtcp等,是消息来源。
Filetr模块,处理消息的分析和过滤,rsyslog可以根据消息的任何部分进行过滤,后面会介绍到具体的做法。
Output模块,包括omfile、omprog、omtcp、ommysql等。是消息的目的地。
Queue模块,负责消息的存储,从Input传入的未经过滤的消息放在主队列中,过滤后的消息放入到不同action queue中,再由action queue送到各个输出模块。
Rsyslog的概念
1)属性替代
Rsyslog预定义了一些属性,来代表消息中的信息,我们可以在定义输出格式、动态文件名的时候使用到这些属性。这里面比较重要的属性比如:msg(消息体)、hostname、pri(消息等级和类别)、time(时间有关),属性的名称中以$开头的是从本地系统获得的变量、不带$是从消息中获得变量。
属性替代的语法格式:
%propname:fromChar:toChar:options:fieldname%
1
%propname:fromChar:toChar:options:fieldname%
属性替换的功能很强大,你可以使用起始字符获取自己所需的字段,也可以使用正则表达式,也可以使用分隔符。举几个例子:为了兼容一个rfc协议,rsyslog规定如果用户输入的msg不是以空格开头,rsyslog会自动补充一个空格,因此如果你希望输出的时候去掉这个空格,就可以使用
%msg:2:$% #选取msg变量中,起始位置为2,终止位置为结尾
1
%msg:2:$%#选取msg变量中,起始位置为2,终止位置为结尾
我们经常需要根据空格来分析字符串,F表示使用字符分割,32是空格的ascii码,例:
%msg:F,32:3% #按照空格分隔,取第三个子串,
1
%msg:F,32:3%#按照空格分隔,取第三个子串,
正则匹配可以匹配特定的文字和格式,我的正则比较差, 避免了使用这部分的内容,所以这部分没有例子了。
属性替代中还用到了一类特殊的以$!开头的变量,这是使用mmnormalize模块时特有的,可以实现类似于syslog-ng中parser模块的功能。后面再讲。
2)模板
模板的功能是定义输出格式,或者定义omfile模块的动态路径、动态文件。需要使用上面提到的属性替换。
模板定义的形式有四种,适用于不同的输出模块,一般简单的格式,可以使用string的形式,复杂的格式,建议使用list的形式,使用list的形式,可以使用一些额外的属性字段(property statement),例如:position.from、position.end。
如果不指定输出模板,rsyslog会默认使用RSYSLOG_DEFAULT。
如果你只想输出msg,可以定义模板:
$template t_msg, "%msg\n%"
1
$templatet_msg,"%msg\n%"
如果想按日期保存输出,需要使用动态路径。可以定义模板
$template f_debug, "/data0/logs/%$year%-%$month%-%$day%/debug.log"
1
$templatef_debug,"/data0/logs/%$year%-%$month%-%$day%/debug.log"
3)Ruleset
Ruleset实现的是多实例的功能,可以针对syslog的来源使用不同的过滤规则。需要注意的是,在配置文件中需要先定义ruleset,才可以使用。比较典型的一个例子,针对不同的端口使用不同的过滤规则。
$Ruleset tcp1999
$RulesetCreateMainQueue on
Local3.* @@10.0.0.44:1999
$Ruleset tcp2000
$RulesetCreateMainQueue on
Local4.* @@10.0.0.44:2000
1
2
3
4
5
6
$Rulesettcp1999
$RulesetCreateMainQueueon
Local3.*@@10.0.0.44:1999
$Rulesettcp2000
$RulesetCreateMainQueueon
Local4.*@@10.0.0.44:2000
在定义好ruleset后,各个输出模块就可以指定自己使用的ruleset了,具体如何指定,可以查看输出模块的手册,一般会有一个ruleset的参数,用来实现这个功能。
4)Filter模块
Rsyslog可以使用syslog标准的过滤规则,同时自己添加了一些扩展。比如可以在输出中指定rsyslog自己的处理方式,可以指定输出template,方法是在规则后面添加template的名字,用分号隔开。
例如我们可以编写一个规则:
Local3.* -/data0/logs/local3.log;t_msg #在这个输出中使用t_msg的模板
Local4.* -?f_local3_test;t_msg #问号表示要使用模板定义的动态路径
1
2
Local3.*-/data0/logs/local3.log;t_msg#在这个输出中使用t_msg的模板
Local4.*-?f_local3_test;t_msg#问号表示要使用模板定义的动态路径
除了syslog标准的规则,rsyslog的作者还自己开发了一个叫做rainerscript的脚本语言,来定义更复杂的过滤过则,rainerscript可以对属性进行startwith、contains、%(取余)等过滤规则,例如:
If $pri-txt == local3.* and $msg contains “abc” then{ #pri为local3,且在消息中包含子串‘abc’
*.* -/data0/logs/local3.log;t_msg
}
1
2
3
If$pri-txt==local3.*and$msgcontains“abc”then{#pri为local3,且在消息中包含子串‘abc’
*.*-/data0/logs/local3.log;t_msg
}
还有第三种方式是使用属性的表示方式,例如:
:msg, regex, "^ [g-z]" /root/rsyslog_worker_dir/2000.log #以字母g到z开头的消息,注意msg开头有个空格
1
:msg,regex,"^ [g-z]"/root/rsyslog_worker_dir/2000.log#以字母g到z开头的消息,注意msg开头有个空格
5)队列
队列是rsyslog中比较重要的一个部分,作为使用者,我们需要了解的是队列的种类:主队列和工作队列。从输入模块接收的消息会进入主队列,主队列中的消息,经过过滤模块,会进入到相应的工作队列;队列的四种工作模式:direct mode、disk mode、FixedArray mode和LinkedList mode,前两种是磁盘队列,更可靠,但是性能也较差,后两种是内存队列,区别是前者是预分配队列长度,后者是动态分配,如果你的系统日志流量比较平稳,可以使用预分配队列,如果日志属于突发型,可以使用动态队列。此外,内存队列还可以通过指定一个queuename来添加DA模式,DA模式主要是为了防止意外情况(进程关闭、server端宕机)下,内存队列可以不丢失。
通过查看rsyslog的系统命令,可以知道rsyslog对队列进行大量的可配参数,来定义队列的行为。可以根据需要来进行优化。
Rsyslog启动参数
正常启动:指定-f和-i就可以了,新版本不需要-c 5 这样的参数。
rsyslogd -f /root/rsyslog_worker_dir/rsyslog.conf -i /root/rsyslog_worker_dir/rsyslog.pid
1
rsyslogd-f/root/rsyslog_worker_dir/rsyslog.conf-i/root/rsyslog_worker_dir/rsyslog.pid
debug版本:debug消息会输出到标注输出,如果出现未预期的结果,可以尝试使用debug方式,查看处理流程。
rsyslogd -f /root/rsyslog_worker_dir/rsyslog.conf -i /root/rsyslog_worker_dir/rsyslog.pid -dn >debuglog
1
rsyslogd-f/root/rsyslog_worker_dir/rsyslog.conf-i/root/rsyslog_worker_dir/rsyslog.pid-dn>debuglog
测试配置文件是否正确:
rsyslogd -N1 -f file
1
rsyslogd-N1-ffile
Rsyslog配置文件
默认Rsyslog主配置文件/etc/rsyslog.conf。
#### 加载模块 ####
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
#### 定义日志格式默认模板 ####
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
#### 包含其他配置文件 ####
$IncludeConfig /etc/rsyslog.d/*.conf
#### 规则 ####
# 关于内核的所有日志都放到/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
# 记录启动的相关信息
local7.* /var/log/boot.log
###日志转发规则###
#$WorkDirectory /var/spppl/rsyslog # where to place spool files
#$ActionQueueFileName fwdRule1 #unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on #save messages to disk on shutdown
#$ActionQueueType LinkedList #run asynchronously
#$ActionResumeRetryCount -1 #infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514 #@@表示通过tcp协议发送 @表示通过udp进行转发
#local3.info @@localhost :514
#local7.* #@@192.168.56.7:514
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#### 加载模块 ####
$ModLoadimuxsock# provides support for local system logging (e.g. via logger command)
$ModLoadimklog# provides kernel logging support (previously done by rklogd)
#### 定义日志格式默认模板 ####
$ActionFileDefaultTemplateRSYSLOG_TraditionalFileFormat
#### 包含其他配置文件 ####
$IncludeConfig/etc/rsyslog.d/*.conf
#### 规则 ####
# 关于内核的所有日志都放到/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
# 记录启动的相关信息
local7.*/var/log/boot.log
###日志转发规则###
#$WorkDirectory /var/spppl/rsyslog # where to place spool files
#$ActionQueueFileName fwdRule1 #unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on #save messages to disk on shutdown
#$ActionQueueType LinkedList #run asynchronously
#$ActionResumeRetryCount -1 #infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514 #@@表示通过tcp协议发送 @表示通过udp进行转发
#local3.info @@localhost :514
#local7.* #@@192.168.56.7:514
下面提供一个把特定的Rsyslog日志文件发送到远程主机的配置。
# 定义从默认的设备文件中读取日志,/dev/log是默认的日志读取设备文件;
$AddUnixListenSocket /dev/log
# 定义从指定的设备文件中读取日志,如PHP程序使用Rsyslog输出日志,同时PHP使用了chroot,那么需要定义chroot后的路径才可以读取日志;
#$AddUnixListenSocket /data/app/dev/log
# 定义一个模板,可选;
$template logstash,"%msg%\n"
# Rsyslog默认日志首都有空格,可以使用下面的模板删除空格,可选;
$template logstash,"%msg:2:$%\n"
# 使用一个已定义的模板;
$ActionFileDefaultTemplate logstash
# 摘取$msg(消息)变量内容,判断如果有keyboard关键字就进行远程传送,没有此关键字的就不传送;
if $msg contains "keyboard" then
action(type="omfwd" Target="172.18.20.60"\
Port="8594"\
Protocol="udp"\
queue.type="LinkedList"\
queue.spoolDirectory="/var/spool/rsyslog"\
queue.filename="test2"\
queue.size="100000"\
queue.maxdiskspace="2g"\
queue.highwatermark="60000"\
queue.lowwatermark="2000"\
queue.discardmark="80000"\
queue.timeoutenqueue="3000"\
queue.maxfilesize="200m"\
queue.dequeuebatchsize="1000"\
)
& stop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 定义从默认的设备文件中读取日志,/dev/log是默认的日志读取设备文件;
$AddUnixListenSocket/dev/log
# 定义从指定的设备文件中读取日志,如PHP程序使用Rsyslog输出日志,同时PHP使用了chroot,那么需要定义chroot后的路径才可以读取日志;
#$AddUnixListenSocket /data/app/dev/log
# 定义一个模板,可选;
$templatelogstash,"%msg%\n"
# Rsyslog默认日志首都有空格,可以使用下面的模板删除空格,可选;
$templatelogstash,"%msg:2:$%\n"
# 使用一个已定义的模板;
$ActionFileDefaultTemplatelogstash
# 摘取$msg(消息)变量内容,判断如果有keyboard关键字就进行远程传送,没有此关键字的就不传送;
if$msgcontains"keyboard"then
action(type="omfwd"Target="172.18.20.60"\
Port="8594"\
Protocol="udp"\
queue.type="LinkedList"\
queue.spoolDirectory="/var/spool/rsyslog"\
queue.filename="test2"\
queue.size="100000"\
queue.maxdiskspace="2g"\
queue.highwatermark="60000"\
queue.lowwatermark="2000"\
queue.discardmark="80000"\
queue.timeoutenqueue="3000"\
queue.maxfilesize="200m"\
queue.dequeuebatchsize="1000"\
)
&stop
上面都是使用$msg为载体进行过滤,$msg就是取日志内容。当然除了$msg外,常用的还有一个变量$programname,就是取程序名称。两种方式都可以使用。
如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。