目录
文章目录
syslog 协议
Syslog(系统日志)协议是一种在 IP 网络中转发系统日志信息的标准,它是在 BSD 大学的 TCP/IP 系统实施中开发的,目前已成为工业标准协议,可用它记录设备的日志。
Syslog 记录着系统中的任何事件,管理者可以通过查看系统记录随时掌握系统状况。系统日志通过 Syslog 进程记录系统的有关事件,也可以记录应用程序运作事件。通过适当配置,还可以实现运行 Syslog 协议的机器之间的通信。通过分析这些网络行为日志,可追踪和掌握与设备和网络有关的情况。常见的应用场景是网络管理工具、安全管理系统、日志审计系统。
Syslog 协议的关键对象有以下几个:
- 产生日志的程序模块(Facility):标识系统中需要记录日志的子系统。
- 严重性(Priority):用来标识日志级别,级别越低信息越详细。
- 时间
- 主机名或 IP
- 进程名
- 进程 ID
- 动作(Action):设置日志记录的位置。
在 Unix-Link 操作系统上,能够按 Facility 和 Severity 的组合来决定什么样的日志消息需要记录,记录到什么地方等。
下列是 Linux Kernel 的 syslog 函数自行制定的服务名称(syslog.h),软件开发商可以通过调用上述服务名称来记录他们的软件日志信息。
Linux Kernel 的 syslog 将信息分为 7 个主要等级:
动作类型:
1)记录到普通文件或设备文件
*.* /var/log/file.log #绝对路径
*.* /dev/pts/0 #设备文件
2)”|”,表示将日志送给其他命令处理
3)”@HOST”,表示将日志发送到特定的主机
*.emerg @192.168.10.1
4)”用户”,表示将日志发送到特定的用户
5)”*”,表示将日志发送所有登录到系统上的用户
rsyslog
rsyslog(rocket-fast system for log)是 CentOS6 以后引入的一个日志服务。rsyslog 能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。此外还具有以下特性:
- 支持多线程;
- 支持 UDP、TCP、TLS 等协议;
- 支持 MySQL、PGSQL、Oracle 等存储;
- 支持自定义输出格式;
- 具有强大的过滤器,可实现过滤记录日志信息中任意部分;
- 可以提供超过每秒一百万条消息给目标文件。
rsyslogd 主要还是通过 Linux Kernel 提供的 syslog 协议来设置数据的分类。
软件架构
Rsyslog 架构如上图所示,消息流是:输入模块 => 预处理模块 => 主队列 => 过滤模块 => 执行队列 => 输出模块。
在这个流程图中,输入、输出、过滤三个部分称为 module:
- Input 模块:是消息来源,包括:imklg、imsock、imfile;
- Output 模块:是消息的目的地,包括:omudp、omtcp、omfile、omprog、ommysql、omruleset;
- Filter 模块:处理消息的分析和过滤,rsyslog 可以根据消息的任何部分进行过滤,包括:mmnormalize。
预处理模块主要解决各种 Syslog 协议实现间的差异,例如:假设日志系统 client 使用 rsyslog,而 server 使用 syslog-ng,如果自己不做特殊处理的话 syslog-ng 是无法识别的。但是反过来,rsyslog 的 server 就可以识别 syslog-ng 发过来的消息。
Queue 模块负责消息的存储,从 Input 传入的未经过滤的消息放在主队列中,过滤后的消息放入到不同 action queue 中,再由 action queue 送到各个输出模块。
rsyslog.service
rsyslog.service(/lib/systemd/system/rsyslog.service)的相关文件:
- 程序包名:rsyslog
- 主程序文件:/usr/sbin/rsyslogd
- 配置文件:/etc/rsyslog.conf、/etc/rsyslog.d/*.conf
- 库文件:/lib64/rsyslog/*.so
rsyslog.conf
rsyslog.conf 配置文件由 3 个部分组成:
- MODULES:模块配置,作为 rsyslog 启动时需要加载的一些额外模块,是 rsyslog 支持多种设施类型的关键。
- GLOBAL DIRECTIVES:全局配置,定义通用的属性。
- RULES:规则配置,定义记录日志的来源、格式和位置。
MODULES
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
#module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")
RULS
#################
#### RULES ####
#################
# 服务名称[.=!]信息等级 信息记录的文件名或设备或主机
# . 表示大于等于 xxx 级别的信息;
# .= 表示等于 xxx 级别的信息;
# .! 表示在 xxx 之外的等级的信息;
mail.info /var/log/maillog_info # mail 服务产生的大于等于 info 级别的日志信息,都记录到后面指定的位置中。
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
远端日志文件服务器部署示例
- 客户端:192.168.157.60
- 服务器:192.168.157.61
客户端
$ vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$template myFormat,"%timestamp% %fromhost-ip% %msg%\n"
$ActionFileDefaultTemplate myFormat
# 服务端 IP 地址,一个 @ 表示 TCP 传输,两个 @ 表示 UDP 传输
*.info;mail.none;authpriv.none;cron.none @@192.168.157.61:514
$ systemctl start rsyslog
服务器
$ vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
*.info;mail.none;authpriv.none;cron.none /data/log/messages
# 允许 157.0 网段内的主机以 TCP 协议来传输
$AllowedSender tcp, 192.168.157.0/24
# 定义模板,接受日志文件路径,这里区分了不同主机的日志
$template Remote,"/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
# 过滤服务器本机的日志。
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
$ systemctl start rsyslog
$ mkdir -pv /data/log
$ touch messages
$ systemctl restart rsyslog
$ tree /data/log/
/data/log/
├── 192.168.157.60
│ └── 192.168.157.60_2019-05-10.log
└── messages
验证
client $ logger "I'm very happy"
server $ tail -f /data/log/192.168.157.60/192.168.157.60_2019-05-10.log
将日志存储至 MySQL 中
$ yum install mariadb-server rsyslog-mysql -y
$ systemctl start mariadb.service
$ rpm -ql rsyslog-mysql
/usr/lib64/rsyslog/ommysql.so # 客户端通信模块
/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql # 创建 rsyslog 日志表结构的 SQL 语句
$ mysql < /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
mysql> show databases;
mysql> use Syslog;
mysql> show tables;
+------------------------+
| Tables_in_Syslog |
+------------------------+
| SystemEvents |
| SystemEventsProperties |
+------------------------+
mysql> grant all on Syslog.* to 'rsysloguser'@'127.0.0.1' identified by 'rsyslogpass';
mysql> flush privileges;
修改服务器配置文件:
$ vim /etc/rsyslog.conf
......
$ModLoad ommysql # 打开连接 MySQL 的模块
*.* :ommysql:127.0.0.1,Syslog,rsysloguser,rsyslogpass
$ systemctl restart rsyslog.service
验证
client $ logger 'THIS IS A TEST'
mysql> use Syslog;
mysql> select * from SystemEvents\G;
*************************** 17. row ***************************
ID: 17
CustomerID: NULL
ReceivedAt: 2019-05-10 23:15:07
DeviceReportedTime: 2019-05-10 23:15:06
Facility: 1
Priority: 5
FromHost: send
Message: THIS IS A TEST
NTSeverity: NULL
Importance: NULL
EventSource: NULL
EventUser: NULL
EventCategory: NULL
EventID: NULL
EventBinaryData: NULL
MaxAvailable: NULL
CurrUsage: NULL
MinUsage: NULL
MaxUsage: NULL
InfoUnitID: 1
SysLogTag: root:
EventLogType: NULL
GenericFileName: NULL
SystemID: NULL