Syslog协议

系统日志(Syslog)协议是在一个IP网络中转发系统日志信息的标准,它是在美国加州大学伯克利软件分布研究中央(BSD)的TCP/IP系统履行中开拓的,目前已成为工业标准协议,可用它记录设备的日志。
Syslog记录着系统中的任何事宜,管理者可以通过查看系统记录随时节制系统状况。
系统日志通过Syslog进程记录系统的有关事宜,也可以记录运用程序运作事宜。
通过适当配置,还可以实现运行Syslog协议的机器之间的通信。
通过剖析这些网络行为日志,可追踪和节制与设备和网络有关的情形。

在Unix类操作系统上,syslog广泛运用于系统日志。
syslog日志既可以记录在本地文件中,也可以通过网络发送到吸收syslog的做事器。
吸收syslog的做事器可以对多个设备的syslog进行统一的存储,或者解析个中的内容做相应的处理。
常见的运用处景是网络管理工具、安全管理系统、日志审计系统。

php日志接入rsyslogRsyslog日记体系 PHP

完全的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

关于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 #记录失落败的、缺点的登录考试测验及验证事宜;

其余当日志文件过大时会通过系统crontab定义日志滚动的,也称日志切割,由logrotate掌握其配置文件/etc/logrotate.conf,然后再由系统任务操持实行。
logrotate卖力怪份和删除旧日志, 以及更新日志文件。
后面详说。

syslog协议格式定义如下

facility.priority action

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;

priority(级别):用来标识日志级别,级别越低信息越详细,有以下日志级别,从上到下,级别从低到高,记录的信息越来越少,详细的可以查看手册: man 3 syslog。

debug #程序或系统调试信息;info #一样平常信息;notice #不影响正常功能须要把稳的信息;warning #可能影响系统功能提醒用户的主要事宜;error #缺点信息;crit #比较严重的信息;alert #必须立时处理的警告信息;emerg/panic #会导致系统不可用的严重信息; #表示所有日志级别;none #跟相反表示什么都没有;

action(动作):设置日志记录的位置,有以下几种。

1)记录到普通文件或设备文件. /var/log/file.log #绝对路径. /dev/pts/0 #设备文件2)”|”,表示将日志送给其他命令处理3)”@HOST”,表示将日志发送到特定的主机.emerg @192.168.10.14)”用户”,表示将日志发送到特定的用户5)””,表示将日志发送所有登录到系统上的用户

连接符号

. #表示大于即是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 # 所有日志及所有级别信息都记录下来.

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%

属性更换的功能很强大,你可以利用起始字符获取自己所需的字段,也可以利用正则表达式,也可以利用分隔符。
举几个例子:为了兼容一个rfc协议,rsyslog规定如果用户输入的msg不因此空格开头,rsyslog会自动补充一个空格,因此如果你希望输出的时候去掉这个空格,就可以利用

%msg:2:$% #选取msg变量中,起始位置为2,终止位置为结尾

我们常常须要根据空格来剖析字符串,F表示利用字符分割,32是空格的ascii码,例:

%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%\公众

如果想按日期保存输出,须要利用动态路径。
可以定义模板

$template f_debug, \公众/data0/logs/%$year%-%$month%-%$day%/debug.log\"大众

3)Ruleset

Ruleset实现的是多实例的功能,可以针对syslog的来源利用不同的过滤规则。
须要把稳的是,在配置文件中须要先定义ruleset,才可以利用。
比较范例的一个例子,针对不同的端口利用不同的过滤规则。

$Ruleset tcp1999$RulesetCreateMainQueue onLocal3. @@10.0.0.44:1999$Ruleset tcp2000$RulesetCreateMainQueue onLocal4. @@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 #问号表示要利用模板定义的动态路径

除了syslog标准的规则,rsyslog的作者还自己开拓了一个叫做rainerscript的脚本措辞,来定义更繁芜的过滤过则,rainerscript可以对属性进行startwith、contains、%(取余)等过滤规则,例如:

If $pri-txt == local3. and $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开头有个空格

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

debug版本:debug会输出到标注输出,如果涌现未预期的结果,可以考试测验利用debug办法,查看处理流程。

rsyslogd -f /root/rsyslog_worker_dir/rsyslog.conf -i /root/rsyslog_worker_dir/rsyslog.pid -dn >debuglog

测试配置文件是否精确:

rsyslogd -N1 -f file

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/secureauthpriv. /var/log/secure # 邮件的所有信息存放在/var/log/maillog; 这里有一个-符号, 表示是利用异步的办法记录, 由于日志一样平常会比较大mail. -/var/log/maillog # 操持任务有关的信息存放在/var/log/croncron. /var/log/cron # 记录所有的大于即是emerg级别信息, 以wall办法发送给每个登录到系统的人.emerg # 记录uucp,news.crit等存放在/var/log/spooleruucp,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\"大众 thenaction(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,便是取程序名称。
两种办法都可以利用。