介绍
Rsyslog 是一种开源软件实用程序,可工作在 Unix 和类似 Unix 的计算机系统上,用于在 IP 网络中转发日志消息。它实现了基本的 syslog 协议,并通过基于内容的丰富的过滤功能,排队地来处理离线输出。它还支持不同的模块输出,灵活的配置选项以及添加诸如使用 TCP 进行传输等功能来扩展它。
Rsyslog 服务包含如下两个进程:
- syslogd:记录用户空间相关日志;
- klogd:记录内核空间相关日志;
Rsyslog 是针对 CentOS 6 以后来说的,在 CentOS 5 时 Rsyslog 就叫做 Syslog,也是由这两个服务组成。
Rsyslog 是 Syslog 的升级版,相关改变特性如下:
- 多线程支持;
- 支持 TCP、UDP 协议使用 SSL 或 TLS 完成日志的远程加密传输;
- 支持在 MySQL、PGSQL 或 Oracle 等关系型数据库中记录日志(需加载相关驱动模块);
- 强大的过滤器,可实现过滤日志信息中的任何部分;
- 可自定义输出格式;
Rsyslog 虽然很强大,但很多应用并不是默认使用 Rsyslog 来进行日志的记录,而是自身实现了一套日志系统完成对日志的管理,如 httpd、nginx 等,当然,也可以对它们进行配置让其使用 Rsyslog。
日志收集设施及级别
Rsyslog 可以为 N 多应用程序收集日志,如果这些程序随意发送日志,最后我们可能就很难对日志进行分类、管理了,因此 Rsyslog 在收集日志时必须明确分类。
以单个主机为例,如果这个主机上的多个应用程序需要记录日志,那么我们可以对这些应用程序进行归类,最后归类产生的这个类别叫做日志产生器,它可以将多个应用程序产生的日志集中到一个数据流中,在 Rsyslog 中,它也叫做 facility。
像 OpenSSH 默认就是通过 Rsyslog 进行认证日志的记录,使用的 facility 就是 AUTHPRIV
(在 /etc/ssh/sshd_config
中的 SyslogFacility
指定)。
小结一下:把某一类具有相同特性的、由各个应用程序产生的日志数据流归类到 Rsyslog 的一个日志收集管道中,这个管道就可称之为 facility(设施)。
每一个 facility 在实现日志收集时我们还需要定义所收集日志的 priority(优先级),在 Rsyslog 中配置 facility 的格式如下:
facility.priority target
该配置的含义就是将 facility
产生的 priority
级别及高于这个级别的日志记录到 target
中。
facility 设施
常见的 facility 有如下:
auth
:认证相关设施;authpriv
:认证及授权相关设施;cron
:专门为 cron 定时任务记录设施;daemon
:为守护进程记录日志设施;kern
:为内核记录日志设施;lpr
:打印系统日志设施;mail
:邮件系统日志设施;mark
:标记相关日志设施;news
:新闻组相关日志设施;security
:安全相关日志设施;user
:用户相关设施;uucp
:UUCP(unix to unix copy)协议相关设施;local0-7
:用户可自定义使用的 8 个日志设施;syslog
:Rsyslog 自己为自己记录日志的设施;
priority 级别
日志 priority 从低到高如下:
debug
:调试;info
:信息;notice
:需注意;warn
/waring
:警告;err
/error
:错误;crit
/critical
:危急;alert
:警报;emerg
/panic
:要挂了;
指定日志级别有如下几种格式:
*
:所有级别;none
:没有级别,该级别不记录日志;priority
:此级别及更高级别下会记录日志;=priority
:仅记录此级别的日志;
不同系统中的级别可能有所差异。
target 目标
target 指的是日志存放目标位置,可是如下几类:
- 文件路径:记录于指定的日志文件中,通常应该在
/var/log
目录下,如果在文件路径前使用-
表示异步写入; - 用户:将日志通知给指定用户,
*
表示所有用户; - 日志服务器:通过
@host
指定一个主机地址为host
的远程日志服务器,必须以 tcp 或 udp 协议监听在端口上提供服务,默认为 514 端口; - 管道:将日志信息以管道的形式交给命令处理,格式为
|COMMAND
;
程序环境
Rsyslog 也是一程序包的形式存在的,以 CentOS 6 为例,我们可以通过 rpm -ql rsyslog
查看 Rsyslog 的相关文件:
$ rpm -ql rsyslog
/etc/logrotate.d/syslog
/etc/pki/rsyslog
/etc/rc.d/init.d/rsyslog
/etc/rsyslog.conf
/etc/rsyslog.d
/etc/sysconfig/rsyslog
/lib64/rsyslog
/lib64/rsyslog/imfile.so
/lib64/rsyslog/imklog.so
/lib64/rsyslog/immark.so
/lib64/rsyslog/impstats.so
/lib64/rsyslog/imptcp.so
/lib64/rsyslog/imtcp.so
/lib64/rsyslog/imudp.so
/lib64/rsyslog/imuxsock.so
/lib64/rsyslog/lmnet.so
/lib64/rsyslog/lmnetstrms.so
/lib64/rsyslog/lmnsd_ptcp.so
/lib64/rsyslog/lmregexp.so
/lib64/rsyslog/lmstrmsrv.so
/lib64/rsyslog/lmtcpclt.so
/lib64/rsyslog/lmtcpsrv.so
/lib64/rsyslog/lmzlibw.so
/lib64/rsyslog/ommail.so
/lib64/rsyslog/omprog.so
/lib64/rsyslog/omruleset.so
/lib64/rsyslog/omtesting.so
/lib64/rsyslog/omuxsock.so
/lib64/rsyslog/pmlastmsg.so
/sbin/rsyslogd
/var/lib/rsyslog
其中,我们需要关注的文件如下:
/etc/rsyslog.conf
是它的主配置文件;im*.so
:输入过滤工具,收集其它程序传来的日志信息;om*.so
:输出过滤工具,将收集的日志信息保存到指定位置,如文件、数据库;/sbin/rsyslogd
:主程序文件;/etc/rc.d/init.d/rsyslog
:服务脚本,Rsyslog 可能需要监听在某套接字上接收日志,所以其本身也需要运行为服务;
配置
Rsyslog 的主配置文件 /etc/rsyslog.conf
描述如下:
#### MODULES ####
# 模块配置
# 支持本地系统日志记录
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
# 支持内核日志记录
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
# 让 rsyslog 服务以 UDP 协议监听在 514 端口上
#$ModLoad imudp
#$UDPServerRun 514
# 让 rsyslog 服务以 TCP 协议监听在 514 端口上
#$ModLoad imtcp
#$InputTCPServerRun 514
#### GLOBAL DIRECTIVES ####
# 全局配置
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
#### RULES ####
# 规则配置,真正指明日志如何记录
# 内核所有级别的日志记录到控制台
#kern.* /dev/console
# 多个设施的多个级别通过 ; 隔开统一指定记录到 /var/log/messages
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 认证授权相关的任意级别的日志记录到 /var/log/secure
authpriv.* /var/log/secure
# 邮件系统任意级别的日志记录到 /var/log/maillog 中,其中 - 表示异步记录
mail.* -/var/log/maillog
# cron 定时任务任意级别的日志记录到 /var/log/cron
cron.* /var/log/cron
# 任意设施的 emerg 级别日志通知到所有登录状态的用户,* 表示所有用户
*.emerg *
# 两个设施使用相同级别使用 , 隔开
uucp,news.crit /var/log/spooler
# local7 是自定义日志设施,被 boot 引导过程征用
local7.* /var/log/boot.log
# ### end of the forwarding rule ###
$template SpiceTmpl,"%TIMESTAMP%.%TIMESTAMP:::date-subseconds% %syslogtag% %syslogseverity-text%:%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
:programname, startswith, "spice-vdagent" /var/log/spice-vdagent.log;SpiceTmpl
dmesg
命令可以看到系统启动的日志信息,其存放位置为/var/log/dmesg
。
以修改 OpenSSH 服务的日志记录到 /var/log/sshd.log
为例。
1、这里我们使用自定义设施 local2
来映射到 /var/log/sshd.log
,所以需要在 /etc/rsyslog.conf
的 RULES
节下添加如下配置行:
local2.* /var/log/sshd.log
2、修改 /etc/ssh/sshd_config
中的 SyslogFacility
项为 local2
:
SyslogFacility local2
3、重启 Rsyslog 服务:
$ service rsyslog restart
4、断开终端连接,然后重新连接,查看生成的日志文件:
$ cat /var/log/sshd.log
Feb 12 14:08:50 zze sshd[7669]: Accepted password for root from 10.0.1.1 port 50890 ssh2
文件记录日志的格式
通过上述示例结果可以看出,日志的默认格式如下:
事件发生的日期时间 主机 进程(进程号): 事件内容
有些日志记录为二进制格式,这种日志我们不能直接使用文本查看工具查看,如:
/var/log/wtmp
:当前系统上成功登陆的日志,可使用last
命令查看;/var/log/btmp
:当前系统上失败的登陆尝试,可使用lastb
命令查看;
lastlog
命令可以查看当前系统上所有用户在最近哪个时间点登陆过系统。
Rsyslog 服务器
要想让装有 Rsyslog 程序包的服务器成为 Rsyslog 服务器的方法很简单,只需要装载指定模块,让其监听在指定套接字上即可。
下面我以 10.0.1.201
主机作为服务端、10.0.1.200
主机作为客户端演示。
服务端主机
1、修改 /etc/rsyslog.conf
文件,启用如下选项:
# 让 rsyslog 服务以 UDP 协议监听在 514 端口上
$ModLoad imudp
$UDPServerRun 514
# 让 rsyslog 服务以 TCP 协议监听在 514 端口上
$ModLoad imtcp
$InputTCPServerRun 514
上面两组选项任选其一即可,也可以都启用,Rsyslog 服务可自行协商使用哪种协议。
2、重启 Rsyslog 服务,查看监听的端口:
$ service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
$ netstat -tunl | grep :514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
tcp 0 0 :::514 :::* LISTEN
udp 0 0 0.0.0.0:514 0.0.0.0:*
udp 0 0 :::514 :::*
可以看到 tcp 即 udp 的 514 端口都处于监听状态了。
客户端主机
1、编辑 /etc/rsyslog.conf
,把原来记录到 /var/messages
文件配置项改为指向远程主机,修改行如下:
#*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none @10.0.1.201
2、重启 Rsyslog 服务:
$ service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
测试
1、在客户端主机上使用 yum
测试安装软件:
$ yum install vsftpd -y
2、查看服务端主机上的 /var/log/message
文件:
$ tailf /var/log/messages
...
Feb 12 16:42:57 zze.ho yum[1385]: Installed: vsftpd-3.0.2-25.el7.x86_64
可以看到,10.0.1.200
主机上安装日志成功记录到了 10.0.1.201
主机的 /var/log/message
下了。
将日志记录到 MySQL
首先要有一台正常运行的 MySQL 服务器,这里我的 MySQL 服务主机地址为 10.0.1.201
。
MySQL 的安装部署可参考【以通用二进制方式安装并配置MariaDB5.5】。
MySQL 服务端主机
1、在 MySQL 中创建一个用户让其拥有 Syslog
库的所有权限:
mysql> GRANT ALL ON Syslog.* TO 'syslog'@'10.0.1.%' IDENTIFIED BY 'syslogpass';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
2、在 MySQL 配置文件中的 mysqld
节下添加如下两项以关闭 MySQL 基于主机名的反向解析:
$ vim /etc/my.cnf
[mysqld]
...
skip_name_resolve=on
innodb_file_per_table=on
...
[mysqld_safe]
...
3、重启 MySQL 服务:
$ service mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
Rsyslog 客户端主机
1、要想让客户端主机的 Rsyslog 连接到 MySQL 需要安装相应驱动包,在 Rsyslog 端执行下面命令即可:
$ yum install rsyslog-mysql -y
查看该程序包生成的文件如下:
$ rpm -ql rsyslog-mysql
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
2、测试使用 MySQL 客户端连接 MySQL 服务端:
$ mysql -usyslog -psyslogpass -h10.0.1.201
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
如果没有
mysql
命令直接执行yum install mysql -y
安装即可。
3、执行 rsyslog-mysql
程序包中的 SQL 文件:
$ mysql -usyslog -psyslogpass -h10.0.1.201 < /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
4、检查 MySQL 中是否成功创建了 Syslog
库和相关表:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Syslog |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> USE Syslog;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLES;
+------------------------+
| Tables_in_Syslog |
+------------------------+
| SystemEvents |
| SystemEventsProperties |
+------------------------+
2 rows in set (0.00 sec)
5、修改配置文件加载连接 MySQL 模块:
$ vim /etc/rsyslog.conf
#### MODULES ####
...
$ModLoad ommysql
...
6、修改配置文件中测试的设施指向的目标:
$ vim /etc/rsyslog.conf
#### RULES ####
...
#*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none :ommysql:10.0.1.201,Syslog,syslog,syslogpass
...
该目标的格式为
:模块:主机,数据库名,用户名,用户密码
,即将日志信息转交给ommysql
模块让其以syslog
的身份连接10.0.1.201
主机上的Syslog
库。
7、重启 Rsyslog 服务:
$ service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
8、使用 yum 做一下安装或卸载操作用于产生日志:
$ yum remove vsftpd -y
9、进入 MySQL 查看 Syslog
库中的表是否生成了数据:
MySQL [Syslog]> SELECT COUNT(1) FROM SystemEvents;
+----------+
| COUNT(1) |
+----------+
| 8 |
+----------+
1 row in set (0.00 sec)
即日志信息已保存到远程 MySQL 中。
前端展示工具
我们可以安装一个前端展示工具让用户可以以浏览器的方式查看 MySQL 中的 Rsyslog 日志信息,这个前端展示工具实际上就是一个 PHP 编写的网站程序,名为 loganalyzer,我们直接将它放在 LAMP 下的站点目录下并做相应配置即可。
LAMP 的部署可参考 【LAMP 系列】。
微信扫描文章首部二维码或搜索zze_coding
关注微信公众号发送#loganalyzer
即可获取到 loganalyzer-4.1.8 安装包。
1、解压 loganalyzer 压缩包,将解压后的 src
文件夹移动到到 httpd 的站点目录下:
$ tar xf loganalyzer-4.1.8.tar.gz
$ mv loganalyzer-4.1.8/src/ /var/www/html/loganalyzer
2、移动解压后的 contrib
目录下的脚本到站点目录下的 loganalyzer
目录并赋予执行权限:
$ mv loganalyzer-4.1.8/contrib/* /var/www/html/loganalyzer
$ chmod +x /var/www/html/loganalyzer/*.sh
3、按如下顺序运行脚本并修改 config.php
的权限如下:
$ cd /var/www/html/loganalyzer
$ ./configure.sh
$ ./secure.sh
$ chmod 666 config.php
4、使用浏览器访问该目录下的 install.php
进入安装界面,我这里路径为 http://10.0.1.200/loganalyzer/install.php
:
5、具体自定义配置之后自行摸索,我这里先做一些必要配置,一路 next 到 step 7,修改如下:
6、在 step 8 直接 finish 就安装成功,进入如下页面:
可以看到,MySQL 中的日志信息已经被展示到页面。
7、点击 statistics
查看统计数据会发现有报错信息:
这是因为 PHP 缺少 GD 依赖库,执行下面命令安装:
$ yum install php-gd -y
8、重启 httpd 服务,刷新浏览器页面:
$ service httpd restart
其它功能自行摸索吧~
评论区