目录

syslog 协议

Syslog(系统日志)协议是一种在 IP 网络中转发系统日志信息的标准,它是在 BSD 大学的 TCP/IP 系统实施中开发的,目前已成为工业标准协议,可用它记录设备的日志。

Syslog 记录着系统中的任何事件,管理者可以通过查看系统记录随时掌握系统状况。系统日志通过 Syslog 进程记录系统的有关事件,也可以记录应用程序运作事件。通过适当配置,还可以实现运行 Syslog 协议的机器之间的通信。通过分析这些网络行为日志,可追踪和掌握与设备和网络有关的情况。常见的应用场景是网络管理工具、安全管理系统、日志审计系统。

Syslog 协议的关键对象有以下几个:

  1. 产生日志的程序模块(Facility):标识系统中需要记录日志的子系统。
  2. 严重性(Priority):用来标识日志级别,级别越低信息越详细。
  3. 时间
  4. 主机名或 IP
  5. 进程名
  6. 进程 ID
  7. 动作(Action):设置日志记录的位置。

在 Unix-Link 操作系统上,能够按 Facility 和 Severity 的组合来决定什么样的日志消息需要记录,记录到什么地方等。

下列是 Linux Kernel 的 syslog 函数自行制定的服务名称(syslog.h),软件开发商可以通过调用上述服务名称来记录他们的软件日志信息。
网络协议 — syslog 协议与 rsyslog 日志服务-LMLPHP
Linux Kernel 的 syslog 将信息分为 7 个主要等级:
网络协议 — syslog 协议与 rsyslog 日志服务-LMLPHP
动作类型:

1)记录到普通文件或设备文件
*.*     /var/log/file.log   #绝对路径
*.*     /dev/pts/0          #设备文件

2)”|”,表示将日志送给其他命令处理

3)”@HOST”,表示将日志发送到特定的主机

*.emerg                     @192.168.10.1

4)”用户”,表示将日志发送到特定的用户

5)”*”,表示将日志发送所有登录到系统上的用户

rsyslog

网络协议 — syslog 协议与 rsyslog 日志服务-LMLPHP

rsyslog(rocket-fast system for log)是 CentOS6 以后引入的一个日志服务。rsyslog 能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。此外还具有以下特性:

  • 支持多线程;
  • 支持 UDP、TCP、TLS 等协议;
  • 支持 MySQL、PGSQL、Oracle 等存储;
  • 支持自定义输出格式;
  • 具有强大的过滤器,可实现过滤记录日志信息中任意部分;
  • 可以提供超过每秒一百万条消息给目标文件。

rsyslogd 主要还是通过 Linux Kernel 提供的 syslog 协议来设置数据的分类。

软件架构

网络协议 — syslog 协议与 rsyslog 日志服务-LMLPHP

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 个部分组成:

  1. MODULES:模块配置,作为 rsyslog 启动时需要加载的一些额外模块,是 rsyslog 支持多种设施类型的关键。
  2. GLOBAL DIRECTIVES:全局配置,定义通用的属性。
  3. 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
07-28 10:44