Linux日志服务

日志是我们排错的重要参考, 现在就来学习一下Linux上重要的日志吧.

Linux日志简要说明

众所周知的是, Linux上跑了很多daemons, 他们在运行的时候总归会有很多通知要显示, 这些通知最终就会被记录到日志中了. 换句话说, 记录这些重要信息和通知就是日志服务所要做的工作了.

日志服务可以很方便的帮助管理人员: 1) 解决系统错误 2) 查看过去时间的事件 3) 解决网络服务的问题

现在我们就来了解一下常见的Linux日志文件都是记录了什么东西: (就假定前缀都是/var/log了, 懒得写了)

boot.log

这个日志中记录的就是我们进入系统的时候看到的那一大串输出信息, 关于系统是如何启动的,从这里面也可以学到很多~ 但是 这个文件仅仅会记录这一次开机的信息, 前次的信息都会被覆盖.

cron

这个日志我们在之前的 Crontab学习日志 中提到了一下 对于crontab进程是否正常进行, 是否正确书写crontab 的debug很有帮助.

dmesg

这个文件记录的是开机时, 内核扫描硬件过程所产生的各种信息, 这些信息CentOS预设将他们取消显示, 所以额外记录一份在这里面. 直接提供有同名的命令可以来输出dmesg的信息.

lastlog

记录系统上所有账号最近一次登录系统的相关信息, 和dmesg一样, 有同名命令来查看输出, 不同的是, 这个文件是一个data文件, 所以你不能直接cat它.

maillog/mail/*

记录邮件的往来. 其实主要是记录postfix (SMTP提供者)与dovecot (POP3提供者)所产生的信息 .

SMTP是发信所使用的通讯协议, POP3则是收信使用的通讯协议

postfix与dovecot则分别是两套使用这个通讯协议的软件.

message

这个日志非常重要啦. 系统错误或者重要的信息都会记录在这里. 我们在查看系统错误的时候, 这个文件是一定要查查看的之一.

secure

只要是涉及到用户登录,密码输入的程序(ssh, login, telnet, su, sudo啥的..)都会有记录在这个文件里, 不论登录的结果是成功还是错误.

wtmp, faillog

这两个日志可以记录正确登入系统的账号信息以及错误的时候的信息, 如果要读取wtmp, 可以使用last程序~.

/httpd/* , samba/*

常见的网络服务啥的, 会用自己的日志文件来记录他们自己产生的各项信息.

上面就是一些常见的日志文件, 但是要说明的是, 不同的Linux distribution的日志文件是不一样的, 有的可能有, 有的可能没有, 但是大家都会有一个messages文件.

那么问题来了, 这些日志是怎么产生的呢? 或者说, 是谁写的呢?

除了上面说过的, 有应用程序自己处理的日志文件之外, 另一种就是Linux distribution提供的日志服务来统一管理了, 只需要将信息传递给这个服务, 他就会自己分门别类按照格式将信息放到对应的日志文件中去. CentOS中提供rsyslog.service这个服务来统一管理.

那么我们在提出第二个问题,如果说这些日志服务一直奋力的工作, 那么几天之后我们的日志文件岂不是就会变得无比巨大嘛~ 而太大的文件读写效率并不高,所以就要想办法来进行备份和更新. 为了解决这个问题, 引入logrotate这个东西, 它就是来自动化的实现这一过程的.

总结一下,针对日志文件所需的功能,我们需要的服务与程序有:

  • systemd-journald.service:最主要的信息收受者, 由systemd提供
  • rsyslog.service:主要登录系统与网络等服务的信息
  • logrotate:主要在进行日志文件的轮替功能

使用systemd来进行简单的日志管理

刚刚上面的总结好像多了个什么奇怪的东西, emmm..这个journald其实就像是中间件一样, 由于系统是由systemd在管理, 所以消息日志会先发到systemd身上, 接着journald会把这些记录下来, 基于内存的方式. 这样的好处是快速, 却在开机重启后 丢失, 所以journald再将日志发送给rsyslogd, 接着日志信息就会被记录到磁盘中了.

journalctl就是我们实际使用的查看日志的工具了, 基本上你可以使用它来查看全部的日志, 所有的信息!! 而且更方便的是, 不同于rsyslogd分类的方式会使得你在一个日志里左找右找, journald可以使得你很快的定位到能看到的地方.

现在就来试用一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
[root@WWW ~]# journalctl # 什么参数也不加, 直接执行
-- Logs begin at Wed 2017-09-06 00:09:06 EDT, end at Wed 2017-09-06 01:01:01 EDT. --
Sep 06 00:09:06 localhost.localdomain systemd-journal[89]: Runtime journal is using 8.0M (max allowed 91.9M, trying to leave 137.9M free of 911.7M available → current limi
Sep 06 00:09:06 localhost.localdomain kernel: Initializing cgroup subsys cpuset
Sep 06 00:09:06 localhost.localdomain kernel: Initializing cgroup subsys cpu
Sep 06 00:09:06 localhost.localdomain kernel: Initializing cgroup subsys cpuacct
Sep 06 00:09:06 localhost.localdomain kernel: Linux version 3.10.0-514.21.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GC
Sep 06 00:09:06 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-514.21.2.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root r
...(omitted)
# 从这次开机以来的所有记录, 量非常大
[root@WWW ~]# journalctl --since today # 从今天开始的所有记录, 由于我刚开的机, 所以和上面一样
-- Logs begin at Wed 2017-09-06 00:09:06 EDT, end at Wed 2017-09-06 01:01:01 EDT. --
Sep 06 00:09:06 localhost.localdomain systemd-journal[89]: Runtime journal is using 8.0M (max allowed 91.9M, trying to leave 137.9M free of 911.7M available → current limi
Sep 06 00:09:06 localhost.localdomain kernel: Initializing cgroup subsys cpuset
Sep 06 00:09:06 localhost.localdomain kernel: Initializing cgroup subsys cpu
Sep 06 00:09:06 localhost.localdomain kernel: Initializing cgroup subsys cpuacct
Sep 06 00:09:06 localhost.localdomain kernel: Linux version 3.10.0-514.21.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GC
Sep 06 00:09:06 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-514.21.2.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root r
...(omitted)
# 既然有了since, 自然就有until, 其实这两个可以直接写成-S和-U, 如果是昨天的话, 也可以直接使用yesterday
[root@WWW ~]# journalctl --since "2017-09-06 00:00:00" --until "2017-09-07 00:00:00"
...(omitted)
# 方便的是, 我们可以直接指定查看哪一个的UNIT的日志, 使用-u或者--unit, 比如:
[root@WWW ~]# journalctl -u rsyslog
-- Logs begin at Wed 2017-09-06 00:09:06 EDT, end at Wed 2017-09-06 01:26:47 EDT. --
Sep 06 00:09:34 WWW systemd[1]: Starting System Logging Service...
Sep 06 00:09:34 WWW systemd[1]: Started System Logging Service.
# 如果有的时候输出太多了, 或者我只想查看部分怎么办呢, 有-n参数帮你解决
[root@WWW ~]# journalctl -n 10
[root@WWW ~]# journalctl -n 5
-- Logs begin at Wed 2017-09-06 00:09:06 EDT, end at Wed 2017-09-06 01:26:47 EDT. --
Sep 06 01:26:47 WWW NetworkManager[742]: <info> [1504675607.0186] dhcp4 (enp0s3): state changed bound -> bound
Sep 06 01:26:47 WWW dbus[593]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service'
Sep 06 01:26:47 WWW systemd[1]: Starting Network Manager Script Dispatcher Service...
Sep 06 01:26:47 WWW dbus-daemon[593]: dbus[593]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.ser
Sep 06 01:26:47 WWW dhclient[845]: bound to 192.168.56.101 -- renewal in 584 seconds.
lines 1-6/6 (END) # 这样就可以仅仅查看部分, 节选的日志
# 另外, 还可以直接指定PID/UID.~
[root@WWW ~]# journalctl _PID=`pidof crond`
-- Logs begin at Wed 2017-09-06 00:09:06 EDT, end at Wed 2017-09-06 01:36:31 EDT. --
Sep 06 00:09:22 WWW crond[614]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 88% if used.)
Sep 06 00:09:22 WWW crond[614]: (CRON) INFO (running with inotify support)
# 还可以只查看相对应等级的日志
[root@WWW ~]# journalctl -p err
-- Logs begin at Wed 2017-09-06 00:09:06 EDT, end at Wed 2017-09-06 01:36:31 EDT. --
Sep 06 00:09:19 WWW kernel: intel_rapl: no valid rapl domains found in package 0
Sep 06 00:09:27 WWW systemd[1]: Failed to start vboxadd.service.
Sep 06 00:09:27 WWW systemd[1]: Failed to start vboxadd-service.service.
Sep 06 00:09:35 WWW postfix/sendmail[1437]: fatal: parameter inet_interfaces: no local interface found for ::1
Sep 06 00:09:35 WWW postfix[1450]: fatal: parameter inet_interfaces: no local interface found for ::1
Sep 06 00:09:36 WWW systemd[1]: Failed to start Postfix Mail Transport Agent.
# 最后说两个常用的参数, -r和-f
# -r就是reverse的意思啦, 最近时间的日志先输出
# -f就是follow的意思, 和tail -f的-f是一样的效果了

rsyslog

rsyslog其实一个升级版的syslog, 它支持更多特性, 例如:

  • 多线程
  • SSL, TLS, UDP, TCP
  • MySQL, PGSQl, Oracle实现日志存储
  • 过滤器, 实现过滤日志中的任意部分
  • 自定义输出格式

这些介绍在其RPM包的介绍中也有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# rpm -qi rsyslog
Name : rsyslog Relocations: (not relocatable)
Version : 4.6.2 Vendor: CentOS
Release : 12.el6 Build Date: Thu 08 Dec 2011 05:40:21 AM CST
Install Date: Fri 16 Dec 2011 01:49:45 PM CST Build Host: c6b4.bsys.dev.centos.org
Group : System Environment/Daemons Source RPM: rsyslog-4.6.2-12.el6.src.rpm
Size : 1560043 License: GPLv3+
Signature : RSA/SHA1, Fri 09 Dec 2011 05:07:22 AM CST, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : http://www.rsyslog.com/
Summary : Enhanced system logging and kernel message trapping daemons
Description :
Rsyslog is an enhanced, multi-threaded syslog daemon. It supports MySQL,
syslog/TCP, RFC 3195, permitted sender lists, filtering on any message part,
and fine grain output format control. It is compatible with stock sysklogd
and can be used as a drop-in replacement. Rsyslog is simple to set up, with
advanced features suitable for enterprise-class, encryption-protected syslog
relay chains.

而现在一些中型的互联网公司会选择使用elasticsearch, logstash, kibana = elk组合, 也就是分布式日志存储系统 + 日志收集器 + 前端日志展示组合.

现在就来正经的说说这个rsyslog服务吧. 先来看一下我们的日志的一般格式:

1
2
Sep 06 00:09:22 WWW  crond[614]: (CRON) INFO (running with inotify support)
|---日期/时间---|主机|服务/程序/[PID]| 具体信息...

OK, 接下来就先从rsyslog.service的配置文件来说起!

可能你会觉得奇怪, 为什么要有主机这个选项. 日志不就是自己机器的记录嘛. 这是因为我们的机器是可以充当日志服务器 收集记录其他机器的日志.

看一下rsyslog这个服务:

1
2
3
4
5
6
7
8
9
10
[root@WWW log]# systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2017-09-06 00:09:34 EDT; 1h 57min ago
Main PID: 1005 (rsyslogd)
CGroup: /system.slice/rsyslog.service
└─1005 /usr/sbin/rsyslogd -n

Sep 06 00:09:34 WWW systemd[1]: Starting System Logging Service...
Sep 06 00:09:34 WWW systemd[1]: Started System Logging Service.

显然是启动了的, 而且也已经开机自动启动了~.

rsyslog的配置很好找, 就在/etc/下, 重点在这个文件的RULES部分. 规定了什么服务, 什么等级, 需要被记录在哪里 这三个东西 所以设定起来就是这个样子:

1
2
3
4
#以mail这个服务产生的info等级为例:
mail.info /var/log/maillog_info
# 这一行说明:mail 服务产生的**大于等于** info 等级的讯息,都记录到
# /var/log/maillog_info 档案中

这里需要注意的是那个 服务名和等级中间的**.** .

这个点就像是运算符一样的东西, 规则是这样的:

  • . :代表比后面还要严重的等级(含该等级)都被记录下来,例如: mail.info代表只要是mail的信息,而且该信息等级严重于info (含info本身)时,就会被记录下来.
  • .= :代表所需要的等级就是后面接的等级而已(完全匹配)
  • .! :有点反向选择的感觉,代表忽略大于等于这个等级的信息(低于这个等级的才会被纪录)

那么有哪些信息等级呢? 下表:

等级数值 等级名称 说明
7 debug 用来debug (除错) 时产生的
6 info 一些基本的说明
5 notice 正常信息, 但比info 需要被注意到的一些内容
4 warning (warn) 警示的讯息,可能有问题,但是还不至于影响到某个daemon 运作. 基本上, info, notice, warn 这三个都是在告知一些基本信息而已,还不至于干扰到系统运作
3 err (error) 一些重大的错误讯息,例如配置文件的某些设定造成该服务无法启动的说明, 通常藉由err 的错误告知,可以了解到该服务无法启动的原因
2 crit 比error 还要严重的错误信息,这个crit 是临界点(critical) 的缩写,这个错误已经很严重了
1 alert 警告等级,已经很有问题的等级,比crit 还要严重
0 emerg (panic) 疼痛等级,意指系统已经几乎要当机的状态. 很严重的错误资讯. 通常只有硬件出问题,导致整个核心无法顺利运行的时候,才会出现这样的等级的讯息

syslog提供了多个不同的服务类型, 只要软件daemon进行对自己想要响应的服务类型发起调用, 就可以将日志托付到对应的文件里了. 用一张图可以来表示这个:

syslog 所制订的服务与软件调用的方式

而如果这样的调用分配的不是很好的话, 就会造成某一个日志文件特别大, 其他的日志几乎没有什么内容. 所以在rsyslog.conf中所作的规范, 就要好好想想咯~.

OK~那现在我们就来看一下默认CentOS7所写的rsyslog.conf 是由哪些项目吧:

1
2
3
4
5
6
7
8
9
[root@WWW etc]# vim /etc/rsyslog.conf
#kern.* /dev/console
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log

首先第一个, 表示只要是内核产生的信息都进行终端的输出, 而这个console一般就是外部设备连接过来到一些封闭系统主机的.

后面都是一般的规则了, 但是我们注意到maillog那一行的前面加上了一个-号, 这个是什么意思呢? 有-号标识的表示日志较多(或者不是特别关键),优先放入buffer, 临界后再输出到磁盘的策略(简单的说就是异步写入). 那么:omusrmsg:* 又是什么意思呢? * 号表示当前在线的所有人, 而前面的那一串意思是发送消息, 也就是类似wall的效果.

当然了, 之前也说过了, 不同的发行版对于日志是不一样的, 其实就是因为这个默认配置文件不一样.

再回到文件的开头, 这里面加载了一些rsyslog会用到的模块, 这些模块都是rpm包安装的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#### MODULES ####

$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so # provides kernel logging support (previously done by rklogd)
#$ModLoad immark.so # provides --MARK-- message capability
...(omitted)
:! rpm -ql rsyslog
/lib64/rsyslog/imfile.so
/lib64/rsyslog/imklog.so
/lib64/rsyslog/immark.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/omtesting.so
...(omitted)

这些模块由一个共同的特点, 那就是有的是用im开头, 用的用om开头, 相信你也猜出来了, i就是输入, o就是输出.

日志服务器的设定

设定一个日志服务器其实是有很多好处的, 假如某一天你的主机遭到了入侵, Hacker删除了所有的日志, 但是由于你的日志还放到了日志服务器上, 这样就可以很快的追查到对方. 不仅如此, 10台服务器你就要挨个查看各自的日志, 但是如果有日志服务器的话, 你就可以直接去那一台机器上查看了.

那么说了这么多, 怎么设定一个日志服务器呢?

先来说说Server端的设定:

打开配置文件/etc/rsyslog.conf, 接着找到:

1
2
3
4
5
6
7
14 # Provides UDP syslog reception
15 #$ModLoad imudp
16 #$UDPServerRun 514
17
18 # Provides TCP syslog reception
19 $ModLoad imtcp
20 $InputTCPServerRun 514

如果网络环境稳定, 就用UDP吧, 如果想要的是数据的可靠传输, 那么就用TCP, 解掉注释就行了.

接下来就很简单了, 只要重启服务, 这台Linux主机就可以作为一台日志服务器了.

1
2
3
4
5
[root@WWW etc]# systemctl restart rsyslog
[root@WWW etc]# ss -antp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1011,fd=3))
LISTEN 0 25 *:514 *:* users:(("rsyslogd",pid=3087,fd=3))

查看监听端口, 也可发现rsyslogd已经监听在514端口了.

Client端也很简单, 在配置文件的最下面, 有这样一句:

1
2
3
89 # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
90 #*.* @@remote-host:514
91 # ### end of the forwarding rule ###

解掉第90行的注释, 将remote-host改成日志服务器的IP就可以了.

tip: 如果是TCP传输, 就写@@. 如果是UDP, 就只有一个@

logrotate

最后来看看这个玩意的设定吧.

我们说过这个东西是一个自动化的工具, 用来定时将日志写入磁盘. 说到定时任务, 那么第一时间就想到了crontab! 进入/etc/cron.daily/, 果然里面有logrotate.

现在就说说怎么设计这个logrotate. 首先, 这个日志轮替显然是有一定条件的, 这个条件就记录在/etc/logrotate.conf这个配置文件里面. 包括在/etc/logrotate.d/下面的文件. 这些也一贯的会主动调用到conf文件里面. 在我们的log目录下, 一般都会有末尾序号或时间的日志或者有的经过了压缩. 而一段时间了之后, 太老的日志就会被删除.

OK, 现在就来看看默认的logrotate.conf这个配置文件吧.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
weekly     <== 时间频率
rotate 4 <== 保留日志的个数
create <== 由于日志被更名,因此建立一个新的来继续储存
dateext <== 让被轮替的日志名称加上日期
#compress <== 被轮替的日志是否需要压缩
include /etc/logrotate.d
# 将/etc/logrotate.d/ 这个目录中的所有配置都读进来执行rotate的工作
# 下面就是单一设定, 如果由单一的设定就按照单一的处理, 没有的话就使用全局设定
/var/log/wtmp { <== 仅针对/var/log/wtmp所设定的参数
monthly <== 每个月一次
create 0664 root utmp <== 指定新建文件的权限与所属帐号/群组
minsize 1M <== 档案容量一定要超过1M后才进行rotate (覆盖时间参数)
rotate 1 <== 仅保留一个
}

这样就很清楚了吧, 当我们安装需要日志记录的程序的时候, 在RPM执行过程中就会把开发者写的logrotate配置文件拷贝到/etc/logrotate.d/下面.

好吧, 现在就来看一下syslog是怎么写的:

1
2
3
4
5
6
7
8
9
10
11
12
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok # 即使log丢了也没关系
sharedscripts # 脚本开头声明
postrotate # 脚本执行时机, post之后 pre之前.
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript # 脚本结束声明
}

这个脚本是要干什么啊, HUP这个信号是说重新读取配置文件, 也就相当是要平滑重启一次啦. 一般我们在post时期都会选择重新启动(因为名字变了啊), 而在pre的时候修改日志的属性.(比如a属性).

尽管是定时任务, 但是我们还是可以显式的调用Ta, 这样玩:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@WWW ~]# logrotate -v /etc/logrotate.conf 
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file chrony
reading config file httpd
reading config file ppp
reading config file syslog
reading config file wpa_supplicant
reading config file yum
Allocating hash table for state file, size 15360 B

Handling 8 logs

rotating pattern: /var/log/chrony/*.log weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/chrony/*.log
log /var/log/chrony/*.log does not exist -- skipping
not running postrotate script, since no logs were rotated

...(omitted)
rotating pattern: /var/log/wtmp monthly (1 rotations)
empty log files are rotated, only log files >= 1048576 bytes are rotated, old logs are removed
considering log /var/log/wtmp
log does not need rotating (log has been already rotated)
rotating pattern: /var/log/btmp monthly (1 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/btmp
log does not need rotating (log has been already rotated)

加上-v参数使得logrotate展示出实际上做了哪些工作. 由于时间未到 所以没有执行. 如果非要手动更新一次日志的话, 就加上-f|--force参数即可.

更新 17.10.4:

现在我们来试试将日志存储在MySQL服务器上. 首先找一台MYSQL服务器, 这里我们就选择使用日志服务器本身, 如果你要另开机器的话,别忘记了权限设定哦.

1
2
3
4
5
6
7
8
9
10
[root@WWW ~]# ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 10 127.0.0.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:953 *:*
LISTEN 0 25 *:514 *:*
ESTAB 0 0 192.168.56.103:22 192.168.56.1:1780
ESTAB 0 0 192.168.56.103:514 192.168.56.101:54647

3306端口已经开始监听, 本机的514已经和目标主机建立连接, 现在来设定数据库连接.

为了能够使得rsyslog和mysql能够建立连接, 我们需要安装一个驱动包:

1
2
3
4
[root@WWW ~]# yum install rsyslog-mysql
[root@WWW ~]# rpm -ql rsyslog-mysql
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql

其实就是一个共享对象和一个sql文件. ( 这个sql其实就是创建一个日志数据库, 接着创建了两张表, 正如其名 )

接着我们就需要由一个用于来访问这个数据库了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@WWW ~]# mysql -u root -p 
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
MariaDB [(none)]>
MariaDB [(none)]> grant all on Syslog.* to 'syslog'@'192.168.56.%' identified by 'syslogpasswd';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)
...(omitted)

现在就可以进行sql文件读入了:

1
2
3
[root@WWW ~]# mysql -usyslog -h 192.168.56.103 -p < /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql 
Enter password:
[root@WWW ~]#

此时再使用syslog用户就可以看到数据库和表了.

接下来就简单了, 我们在配置文件中导入模块, 并且进行一下配置就行了

1
2
3
4
5
$ModLoad ommysql

#*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none :ommysql:192.168.56.103,Syslog,syslog,syslogpasswd

**注意: 这个模块一定要在第一个Section里写, ** 我们把原来的注释掉, 改成记录到数据库中.

接着随便做些什么, 在数据库中就会有记录了.