CentOS7 rsyslog +loganalyzer配置

1. 前言

自己的OpenWRT有时候不知道为什么重启,OpenWRT试用logread命令可以查看buffer内保存的日志,但是重启后会消失。可以通过logread重定向方式将日志存储到本地,鉴于有多台OpenWRT,每个OpenWRT的日志都以文本文件的形式存储在OpenWRT本地存储中,这样也不利于日志分析。

经过调研后决定试用rsyslog + loganalyzer这种方式,集中式管理所有OpenWRT的日志。


2. rsyslog配置说明

日志过滤器

rsyslog中,提供了三种方式的过滤器方法:

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

基于设施/优先级的过滤器是最常用的方法,语法如下:

1
FACILITY.PRIORITY

FACILITY指定了产生日志消息的子系统,可选值为 auth , authpriv , cron , daemon , kern , lpr , mail , news , syslog , user , ftp , uucp , local0 ~ local7

PRIORITY指定了日志消息的优先级,可用的优先级包含 debug (7) , info (6) , notice (5) , warning (4) , err (3) , crit (2) , alert (1) , emerg (0)

前置符号=表明只有该优先级的消息会被捕获,!表明除了该优先级的消息之外的优先级会被捕获。除了前置符号外,可以使用符号*
表示所有的设施或者优先级,对优先级部分使用none关键字会捕获所有没有指定优先级的消息。

定义多个设施或者优先级使用,分隔,如果是多个 filter 的话,则使用;进行分隔。

使用范例

1
2
3
kern.*                  # 选择所有优先级的内核日志
mail.crit # 选择所有mail 的优先级高于crit的日志
cron.!info,!debug # 选择除了 info 和 debug 优先级的 cron 日志
基于属性的过滤器

基于属性的过滤器语法

1
:PROPERTY, [!]COMPARE_OPERATION, "STRING"

:PROPERTY是要比较的日志属性,COMPARE_OPERATION 为要执行的比较操作,这个的!表示取反的意思,"STRING"为比较的值。

可以使用的比较操作:

比较操作 描述
contains 匹配提供的字符串值是否是属性的一部分,如果不区分大小写,使用contains_i
isequal 比较属性和值是否相等
startswith 属性是否以指定字符串开始(startswith_i)
regex 正则表达式(POSIX BRE 基本正则)匹配
ereregex 正则表达式(POSIX ERE 扩展正则)匹配
isempty 判断属性是否为空,不需要 value

使用范例:

1
2
3
:msg, contains, "error"
:hostname, isequal, "host1"
:msg, !regex, "fatal .* error"
基于表达式的过滤器

基于表达式的过滤器使用了rsyslog自定义的脚本语言RainerScript构建复杂的filter,本文实验场景试用该改方式。更多试用方式,请参考链接RainerScript

Action

Action定义了当匹配指定的 filter 的时候,执行什么操作。如果要指定多个 ACTION,使用 &连接多个 ACTION。例如:

1
2
3
kern.=crit user1  
& ^test-program;temp
& @192.168.0.1

这里的;temp指定了传递日志给 test-program 程序时( ^ 开头表明日志发送给该可执行文件),使用它 temp 模板格式化日志。

在 ACTION 后面追加;模板名称可以为指定的 action 使用该模板格式化日志。

保存日志到日志文件

语法:

1
FILTER PATH

这里的 PATH 指定了日志要保存到的文件。例如 cron.* /var/log/cron.log 指定了所有的定时任务日志都写入到/var/log/cron.log文件。

除了上述方法记录日志(静态),也可以动态的生成日志文件。

1
FILTER ?DynamicFile

这里的DynamicFile是预定义的输出路径模板。

通过网络发送syslog

rsyslog可以使用网络将日志消息发送或者接受日志,使用这个特性,可以实现使用单一的日志服务器统一管理多台服务器日志。

1
@[(zNUMBER)]HOST:[PORT]

这里的@告诉syslog使用 UDP 协议发送日志,要使用 TCP 的话,使用 @@。可选值zNUMBER设置了是否允许使用zlib对日志压缩(压缩级别1-9)。

使用范例

1
2
3
*.* @192.168.0.1        # 使用 UDP 发送,默认端口514*.* 
@@example.com:18 # 使用 TCP 发送到端口18, 默认10514
*.* @(z9)[2001:db8::1] # UDP, ipv6,使用zlib级别9压缩
丢弃日志

要丢弃日志消息,使用stop动作。

1
FILTER stop

模板

任何rsyslog生成的日志都可以根据需要使用模板进行格式化,要创建模板,使用如下指令

1
$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]

这里的$template指令表明了接下来的内容定义了一个模板,TEMPLATE_NAME是模板的名称,接下来双引号之间的内容为模板的内容。

这里还有一个 OPTION , 它指定了模板的功能,支持选项为sqlstdsql,在使用数据库存储的时候会用到。

生成动态文件名

模板可以用来生成动态文件名,就如之前所述,在使用动态文件名的时候,需要在 ACTION 中的模板名称前增加?表明该文件名是动态生成的。

例如:

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

timegenerated属性从日志信息中提取出消息的时间戳,这样可以为每个日志生成唯一文件名称。

属性

在模板中使用的属性是在%之间的内容,使用属性可以访问日志消息中的内容。

1
%PROPERTY_NAME[:FROM_CHAR:TO_CHAR:OPTION]%

可用的属性列表见man rsyslog.conf

全局指令

全局指令是rsyslogd守护进程的配置指令。所有的全局指令必须以$开始,每行只能有一个指令,例如:

1
$MainMsgQueueSize 50000

队列

在 rsyslog 中,队列用来传输数据,当 rsyslog 接收到一个消息的时候,首先传递消息预处理器,然后加入到主消息队列,接下来消息会从队列中取出传递给规则处理器。

规则处理器是一个解析过滤引擎,它会基于配置文件中定义的规则,执行相应的动作(action),每一个动作都有自己的动作队列,消息通过这个队列发送到对应的动作处理器,然后输出。对于同一个消息来说,可以同时传递这个消息给多个动作队列。

定义队列

在配置文件/etc/rsyslog.conf文件中

1
$objectQueueType queue_type

这里的队列类型可选值为 direct , linkedlist , fixedarray (内存队列), 或者 disk

默认情况下,对于主队列,使用的是FixedArray队列(10000个消息长度),动作队列采用的是direct 队列


3. rsyslog服务器配置

selinux关闭

关闭selinux,开启可能有未知的问题,具体原因不明。

启用网络传输模块

CentOS7已经自带rsyslog服务,但是默认只处理本机的日志,若要处理远程客户端的日志,需要启用TCP或者UDP模块,也可以两者都启用。修改/etc/rsyslog.conf配置文件如下,默认端口为514。

OpenWRT默认使用UDP传输!

1
2
3
4
5
6
7
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

rsyslog选项修改

修改选项配置文件/etc/sysconfig/rsyslog

这里启用-r选项,接收远程客户端日志;启用-x选项,禁用DNS查询;-m 0选项具体用法不明确。

1
2
3
4
5
SYSLOGD_OPTIONS="-r -x -m 0"

## -m 0 disables 'MARK' messages.
## -r enables logging from remote machines
## -x disables DNS lookups on messages recieved with -r

配置文件修改

本文的例子例子如下,在目录/etc/rsyslog.d/添加配置文件router.conf,将不同的OpenWRT日志记录到不同的文件,实用了基于表达式的过滤器。

1
2
3
4
5
6
7
8
if $fromhost-ip == '172.18.1.1' and $programname != 'transmission-daemon' and $programname != 'dnsmasq' then /var/log/openwrt1.log
& stop
if $fromhost-ip == '172.18.1.2' and $programname != 'transmission-daemon' and $programname != 'dnsmasq' then /var/log/openwrt2.log
& stop
if $fromhost-ip == '172.18.1.3' and $programname != 'transmission-daemon' and $programname != 'dnsmasq' then /var/log/openwrt3.log
& stop
if $fromhost-ip == '172.18.1.4' and $programname != 'transmission-daemon' and $programname != 'dnsmasq' then /var/log/openwrt4.log
& stop

上述过滤语句解释为:

来自IP地址为172.18.1.1并且程序名字不为transmission-daemondnsmasq的日志,保存到 /var/log/openwrt1.log,后续动作stop,不将过滤后的结果继续保存的系统日志或者下一步处理。

修改配置后,重启服务

iptables配置

添加对应的iptables条目,放行TCP/UDP的514端口,并重启iptables服务。

到目前位置,可以远程集中接收来自多个OpenWRT的日志到rsyslog服务器。


4. loganalyzer配置

配置LAMP

安装mariadb-server、mariadb

1
yum install mariadb-server mariadb -y

安装Apache及PHP

1
2
yum install httpd -y
yum install php php-gd php-xml php-mysql -y

启动服务并加入开机自启动

1
2
3
4
systemctl start httpd.service
systemctl enable httpd.service
systemctl start mysqld.service
systemctl enable mysqld.service

初始化mariadb,设置root登录密码

1
/bin/mysql_secure_installation

测试php环境,在/var/www/html/下创建index.php文件,内容如下,浏览器查看是否正常。

1
2
3
<?php    
phpinfo()
?>

安装rsyslog-mysql

安装rsyslog 连接MySQL数据库的模块

1
yum install rsyslog-mysql -y

导入SQL语句

修改/usr/share/doc/rsyslog-x.x.x/mysql-createDB.sql中创建数据库语句的编码,这样中文不会乱码。

1
2
3
4
CREATE TABLE SystemEvents
(
......
)DEFAULT CHARSET=utf8;

导入相关SQL语句,创建相关的数据库

1
2
cd /usr/share/doc/rsyslog-x.x.x/
mysql -uroot -p<mysql-createDB.sql

导入之后,在数据中创建了数据库SysLog、两张空表SystemEventsSystemEventsProperties

创建rsyslog用户

1
2
3
mysql> grant all on Syslog.* to rsyslog@'localhost' identified by '******';
mysql> flush privileges;
mysql> exit

启用rsyslog-mysql模块

在配置文件/etc/rsyslog.conf中添加全局变量$Modload ommysql,一个例子如下

1
*.* :ommysql:localhost,Syslog,rsyslog,rootroot #所有日志存入数据库Syslog,账户名rsyslog,密码rootroot

或者使用基于表达式方式,例子如下

1
2
3
if $programname != 'transmission-daemon' and $programname != 'dnsmasq' then :ommysql:localhost,Syslog,rsyslog,rootroot
& /var/spool/rsyslog/test.log
& stop

重启rsyslog服务

1
systemctl restart rsyslog.service

loganalyzer下载安装

loganalyzer官方网站下载最新的稳定版本,当前为4.1.6,并拷贝源码到/var/www/目录下

1
2
3
4
cd ~
wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.6.tar.gz
tar xvzf loganalyzer-4.1.6.tar.gz
cp -r loganalyzer-4.1.6/src/ /var/www/loganalyzer

创建配置文件,后续loganalyzer安装向导会使用

1
2
3
4
5
cd ~
cd loganalyzer-4.1.6/contrib
sh configure.sh
chmod 666 config.php
cp config.php /var/www/loganalyzer

http访问口令配置

鉴于loganalyzer不登录也能查看日志,因此在配置文件目录/etc/httpd/conf.d下添加apache配置文件log.conf,同时添加目录映射。

1
2
3
4
5
6
7
8
Alias /log /var/www/loganalyzer

<Directory /var/www/loganalyzer>
AuthType Basic
AuthUserFile /etc/httpd/.htpasswd
AuthName "Sign In Here To Gain Access To the Site !"
Require valid-user
</Directory>

loganalyzer网页向导配置

打开浏览器,输入http://[rsyslog服务器IP]/log,输入http账户密码后,进入网页向导配置。

这里引用了其他博客的图片。

wKiom1cqNAmgHDCjAAChoWQm4MI349.png</center
图4-1

点击next进行系统环境测试:

wKioL1cqNU2Q1LLCAAELO8IapEY181.png
图4-2

此处提示没有config.php文件,使用contrib中的configure.sh脚本可生成;

wKioL1cqNU2hBbwqAAEtExRXt1U565.png
图4-3

本文前面已经添加了config.php文件并配置权限为666

wKiom1cqNHigy2oJAAErad1aUL8851.png
图4-4

继续下一步,填写数据库信息

wKioL1cqNU6A8INuAADnfHC1M5U426.png
图4-5

点击next生成数据库中的表;

wKiom1cqNHjjXiyvAAC2F9RtI7o224.png
图4-6

设置管理员

wKioL1cqNU6R3RhEAACtVFQo2Wo346.png
图4-7

创建第一个系统日志source

wKiom1cqNHnAUrJmAAC1dcIKjxo395.png
图4-8
wKioL1cqNU_zgw7kAAC591Gyx7o617.png
图4-9

完成

wKioL1cqNVDD1T5XAAHN-Ex87zU198.png
图4-10

部署完毕,更多需要查看文档


修订版本信息

修订版本 时间 备注
文档创建 2018/1/11 创建

参考