侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 742 篇文章
  • 累计创建 64 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

日志服务rsyslog及其可视化工具loganalyzer

zze
zze
2020-02-12 / 0 评论 / 0 点赞 / 1898 阅读 / 15902 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

介绍

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.confRULES 节下添加如下配置行:

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

image.png

5、具体自定义配置之后自行摸索,我这里先做一些必要配置,一路 next 到 step 7,修改如下:

image.png

6、在 step 8 直接 finish 就安装成功,进入如下页面:

image.png

可以看到,MySQL 中的日志信息已经被展示到页面。

7、点击 statistics 查看统计数据会发现有报错信息:

image.png

这是因为 PHP 缺少 GD 依赖库,执行下面命令安装:

$ yum install php-gd -y

8、重启 httpd 服务,刷新浏览器页面:

$ service httpd restart

image.png

其它功能自行摸索吧~

0

评论区