主要内容
模块(Modules)
Rsyslog是基于模块化的设计,在rsyslog的执行过程,背后都有一系列模块的功能支撑,例如输入模块、输出模块、消息修改模块等。输入模块用于把系统或程序产生的日志输入到队列中去,而输出模块则是把日志从队列中输出到其他指定的地方。消息修改模块可以对队列中的消息进行修改,例如消息的格式化。不同的模块提供了不同的设置参数,模块使用前必须先导入。
除了上面提到的三个模块,Rsyslog还提供了其他一些模块,例如解析模块,库模块等,由于输入输出模块是Rsyslog中比较重要且常用的模块,所以这篇文章重点讲解的是这两个模块。
输入模块(Input Module)
输入模块都是以字母im
开头,常见的输入模块有:imfile、imtcp、imudp、imuxsock、imjournal。它们的作用如下:
- imfile:把文件导入到rsyslog中,例如web服务器产生的日志文件
- imtcp:把以tcp作为协议传输的日志导入到rsyslog,例如把日志转发到远程服务器的时候需要用到
- imudp:同上,不同的只是传输协议
- imuxsock:把unix socket作为日志的输入点
- imjournal:把journald(另一种日志系统)的日志导入到rsyslog
文本文件输入模块(imfile)
此模块可以把普通的文本文件导入到rsyslog,文本中的内容由可打印的字符组成,以LF结尾。文本以行的形式输入,空白行不会被处理。由于部分程序不会通过rsyslog管理日志,例如nginx、httpd等,那么我们可以把这些程序生成的日志先导入到rsyslog,然后由rsyslog作后续处理:发送到远程服务器或写入到数据库等等。例如:
1 2 3 4 5 6 7 8 9 |
#import nginx log $ModLoad imfile #导入模块 $InputFileName /var/log/nginx/access.log #需要导入的文件 $InputFileTag ng-acc #添加标签名称 $InputFilePersistStateInterval 10 #多久处理一次追踪文件 $InputFileStateFile state-ng-acc $InputRunFileMonitor #开始监控文件 if $syslogtag contains "ng-acc" then /var/log/ng-acc.log |
例子中导入了nginx的访问信息,然后添加了一条规则,把它写入到硬盘的另一个位置(只是一个例子,可能有点多余)。$InputFileStateFile
指令用于追踪文件的状态,即哪一个部分已经被处理,哪些还没有被处理。这个指令依赖$InputFilePersistStateInterval
指令,只有定义了这个指令,$InputFileStateFile
才会生成追踪文件。
tcp协议输入模块(imtcp)
当客户端需要把日志转发给远程日志服务器的时候,服务器需要打开这个模块,rsyslog才能接收客户端的日志。忽略其他非必要的设置,imtcp模块是使用起来最简单的的一个模块。
服务器只需要打开两个指令,就可以使用这个模块:
1 2 |
$ModLoad imtcp #导入模块 $InputTCPServerRun 514 #运行模块 514是监控的端口 |
这个,一个可用的远程日志服务器就搭建完毕,不过,请注意添加端口到防火墙的白名单上。
如果要为服务器指定一个Ruleset,可以使用$InputTCPServerBindRuleset
指令。例如:
1 2 3 |
$ModLoad imtcp #导入模块 $InputTCPServerBindRuleset remote $InputTCPServerRun 514 #运行模块 514是监控的端口 |
客户端只需要指定接收日志的目标服务器地址即可:
1 2 3 |
#*.* @@hostname:port_num #例如 *.* @@192.168.0.10:514 |
如果希望了解更多imtcp模块的相关配置,请看imtcp: TCP Syslog Input Module
输出模块(Output Module)
和输入模块的作用相反,输出模块用于日志的输出(消费),所有的日志最后都会被输出模块处理。常用的输出模块有:omfile、omfwd、omjournal、ommysql等。
鉴于omfile模块是一个内建的模块,它的作用就是把日志输出为普通的文本文件。rsyslog默认会导入这个模块,我们基本上不需要过多去配置它,因此这里不讨论这个模块。同样地,omfwd也是一个内建模块,我们也不需要手动去加载它,它的作用就是使日志可以通过udp协议或者tcp协议转发到远程服务器,简单的使用上面的客户端设置已经列出,不再详细描述。如果希望了解更多omfile和omfwd的配置参数,请看下面两个链接:
omfwd: syslog Forwarding Output Module
输出数据库模块(ommysql)
有时候我们可能需要把日志储存到数据库中,ommysql模块就可以帮助我们。其实除了ommysql之外,还有另一个提供同样作用的模块,那就是omlibdbi,但是ommysql的性能更优于omlibdbi,因此我们选择了前者。
在centos7中,ommysql需要另外安装,它包含在rsyslog-mysql软件包中。可以使用下面的命令安装:
1 |
yum install rsyslog-mysql |
下面是ommysql的实际使用案例。
第一步:安装rsyslog-mysql
这个包就是提供ommysql模块的软件包,如果还没有安装的请先安装,已安装的可以忽略这一步。
第二步,创建数据库
ommysql提供了一些默认的行为,例如,数据库和表名称,写入模板(template)。在使用ommysql之前,我们需要把数据库创建好,模块提供了创建数据库的脚本,可以在/usr/share/doc/rsyslog-8.24.0/
目录下找到(不同的rsyslog版本可能位置不同)。如果没有安装rsyslog-mysql软件包,这个脚本是不存在的。
1 2 3 |
[root@centos7-server ~]# cd /usr/share/doc/rsyslog-8.24.0/ [root@centos7-server rsyslog-8.24.0]# ls AUTHORS ChangeLog COPYING COPYING.ASL20 COPYING.LESSER mysql-createDB.sql |
mysql-createDB.sql就是创建数据库的脚本,找到后可以通过下面的命令使用这个脚本(为了简化步骤,使用了root操作这个数据库,生产环境中不建议):
1 |
[root@centos7-server]# mysql -u root -p < /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql |
这个脚本会创建一个名称为Syslog的数据库,里面包含两张表:SystemEvents和SystemEventsProperties。通常日志都会被写入到SystemEvents表中。
第三步:配置rsyslog
我们说过,通常在一些慢操作上,可以使用队列加快rsyslog的操作效率,因此,我们在这里可以配合队列使用,在rsyslog.conf的最后添加下面的设置:
1 2 3 4 5 6 7 8 9 |
$ModLoad ommysql #加载模块 $ActionQueueType LinkedList #创建LinkedList队列 $ActionQueueFileName sql #同时使用Disk-Assisted队列 $ActionQueueWorkerThreads 2 #两个工作线程 $ActionResumeRetryCount -1 #如果写入失败则循环尝试 #配置规则 #模块使用 :ommysql:主机名,数据库,用户名,密码 *.* :ommysql:localhost,Syslog,root,your_password |
第四步:重启rsyslog服务,这也是最后一个步骤。
如果没有错误,就可以登录mysql查看是否工作正常:
1 2 3 4 5 6 7 8 9 10 11 |
MariaDB [Syslog]> SELECT ReceivedAt,Facility,Priority,FromHost FROM SystemEvents LIMIT 5; +---------------------+----------+----------+----------------+ | ReceivedAt | Facility | Priority | FromHost | +---------------------+----------+----------+----------------+ | 2018-03-03 09:28:26 | 1 | 6 | centos7-server | | 2018-03-03 09:28:35 | 10 | 5 | centos7-server | | 2018-03-03 09:29:36 | 3 | 6 | centos7-server | | 2018-03-03 09:29:36 | 5 | 6 | centos7-server | | 2018-03-03 09:29:36 | 3 | 6 | centos7-server | +---------------------+----------+----------+----------------+ 5 rows in set (0.00 sec) |
由于ommysql模块使用了一个默认的模板,因此我们不需要自己编写sql语句,一般默认的模板如下:
1 2 3 4 |
$template tpl,"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 |
使用自定义模板
虽然rsyslog提供了默认的数据库和模板,我们也可以使用自定义的模板。如果也希望使用自定义的数据库,创建一个就可以。例如自己创建rsyslog的数据库,里面有一个表events:
1 2 3 4 5 6 7 8 9 10 |
create database rsyslog; CREATE TABLE `events` ( `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `ReceivedAt` datetime DEFAULT NULL, `Facility` smallint(6) DEFAULT NULL, `Priority` smallint(6) DEFAULT NULL, `FromHost` varchar(60) DEFAULT NULL, `Message` text, PRIMARY KEY (`ID`) ) |
然后就是配置rsyslog.conf文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#创建自定义模板 $template sqlTemplate,\ "insert into events(ReceivedAt, Facility, Priority, FromHost, Message)\ values ('%timegenerated:::date-mysql%', %syslogfacility%, %syslogpriority%,\ '%hostname%', '%msg%')",SQL $ModLoad ommysql $ActionQueueType LinkedList $ActionQueueFileName sql $ActionQueueWorkerThreads 2 $ActionResumeRetryCount -1 #使用自定义模板,在模块的最后添加一个分号,然后跟模板名称 *.* :ommysql:localhost,rsyslog,root,konrida;sqlTemplate |
当然,测试之前别忘了重启rsyslog服务。
注意自定义模板后面添加了一个模板选项:SQL,添加这个选项可以有效防止sql注入。
如果希望了解更多ommysql模块的配置,请看:ommysql: MySQL Database Output Module
转载请注明:Pure nonsense » Linux日志管理Rsyslog之模块