系统日志收集之初探rsyslog

DevOps Tool评论2,466字数 5524阅读18分24秒阅读模式

系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对用户了解系统的运行状态是非常有用的,所以需要把它们保存到对应的日志文件中,以便后续进行分析和监控系统或软件的状态。 Linux 系统拥有非常灵活和强大的日志功能,几乎可以保存所有的操作记录,并可以从中检索出我们需要的信息。完成这个工作的守护进程就是 rsyslog。

介绍

谈及 rsyslog,就不可避免的涉及另外两个软件 syslog 和 syslog-ng。这三款软件设计的目标是一样的,就是解决系统和程序的日志收集问题。每一个项目都在试图提高前者的稳定性和功能性。

syslog

syslog 由 Eric Allman 在 1980 年代开发,是 Sendmail 项目的一部分。因为它的易用性被很多类 Unix 系统使用,成为其标准的日志记录解决方案。在这个过程中,它演变成一种协议,成为在互联网协议(TCP/IP)的网络中传递记录档消息的标准。

syslog 协议属于一种主从式协议:syslog 发送端会发送出一个小的文字消息(小于 1024 位组)到 syslog 接收端。接收端通常名为 syslogd、syslog daemon 或 syslog 服务器。系统日志消息可以被以 UDP 协议或 TCP 协议来发送。这些资料是以明码类型被发送。不过由于 SSL 加密外套(例如 Stunnel、sslio 或 sslwrap 等)并非 syslog 协议本身的一部分,因此可以被用来透过SSL/TLS 方式提供一层加密。

syslog-ng

syslog-ng 是 syslog NextGeneration 的简写。该项目发起于 1998 年并基于 syslog 协议开发。作为 syslog 的下一代产品,功能肯定比 syslog 强大的多,如高性能,可靠的传输,支持多平台,高可靠性,众多的用户群体,强大的日志过滤及排序,事件标签和关联性,支持最新的IETF标准等。

rsyslog

rsyslog 是 the rocket-fast system for log processing 的简写。该项目始于 2004 年,当时 rsyslog 的主要作者 Rainer Gerhards 决定编写一个新的强大 syslog 守护程序来与 syslog-ng 竞争。它实现了基本的 syslog 协议,并扩展了基于内容的过滤功能,丰富了过滤能力,处理脱机输出的队列操作,支持不同模块的输出,配置选项更加灵活,并添加了使用 TCP 进行传输的功能。

由于 rsyslog 的高性能,出色的安全性和模块化设计,它不仅作为常规的系统日志收集工具,还能够接受各种来源的输入,将其转换,然后将结果输出到不同的目的地。

系统日志收集之初探rsyslog

 

它的优势有如下:

  • 高性能(使用 C 编写,运用多线程)
  • 支持 TCP, SSL, TLS, RELP
  • 支持多种输出(MySQL, PostgreSQL等)
  • 支持对系统日志的过滤
  • 灵活配置多种输出

正因为如此,它是众多类 Unix 系统和 GNU/Linux 发行版系统日志采集的首选。

syslog 协议

既然三款软件都基于 syslog 协议,那就先来介绍一下 syslog 协议。相关 RFC 文件有 2001 年发行的 RFC 3164(The BSD syslog Protocol), 2009 年发行的 RFC 5424(The Syslog Protocol), RFC 5425(Transport Layer Security Mapping for Syslog), RFC 5426(Transmission of Syslog Messages over UDP)。其中RFC 3164 已经被 RFC 5424 废除,所以下面介绍的以 RFC 5424 为准。

三层模型

Syslog 协议使用三层结构,第一层是消息层,指要传输的信息;第二层是应用层,主要用于消息的生成,解析,路由和存储,代表有发送者,中继器和接受者。第三层是传输层,主要用于发送和接收网络上的信息,代表有发送设备和接收设备。 具体的层次结构见下图(这块的理解可以参考 OSI 7层模型或 TCP/IP 4层模型):

系统日志收集之初探rsyslog

 

部署场景

syslog 协议遵循以下的原则:

  • 协议没有信息确认机制 消息从发送者发送到接受者的 UDP 514 端口,不需要接收方应答。
  • 发送者和中继器可以将相同的消息发送给多个接收者和中继器
  • 发送者,中继器和接收者可以部署在同一个系统上。

按照上述原则,有如下图的部署场景。

系统日志收集之初探rsyslog

 

消息格式

syslog 协议定义了消息格式,由三部分组成:消息头 HEADER ,结构化数据 STRUCTURED-DATA 和消息 MSG(可选)。其中消息头又包含优先级(PRIority),版本号(VERSION),时间戳(TIMESTAMP),主机名(HOSTNAME), 应用名(APP-NAME),进程标识(PROCID)和消息标识(MSGID)。

其中优先级由设备(Facility)和严重性(Severity)共同决定。PRI = Facility * 8 + Severity。 设备的可选值有以下24个:

代号 设备(Facility) 注释
0 kernel messages 内核相关
1 user-level messages 用户相关(默认)
2 mail system 邮件相关
3 system daemons 系统守护进程相关
4 security/authorization messages (note 1) 登陆授权相关
5 messages generated internally by syslogd syslogd相关
6 line printer subsystem 打印相关
7 network news subsystem 新闻相关
8 UUCP subsystem unix到unix的cp相关
9 clock daemon (note 2) 任务计划相关
10 security/authorization messages (note 1) 登陆授权相关
11 FTP daemon FTP相关
12 NTP subsystem
13 log audit (note 1) 登陆授权相关
14 log alert (note 1) 登陆授权相关
15 clock daemon (note 2) 任务计划相关
16 local use 0 (local0) 用户自定义0
17 local use 1 (local1) 用户自定义1
18 local use 2 (local2) 用户自定义2
19 local use 3 (local3) 用户自定义3
20 local use 4 (local4) 用户自定义4
21 local use 5 (local5) 用户自定义5
22 local use 6 (local6) 用户自定义6
23 local use 7 (local7) 用户自定义7

严重性的可选值有以下8个,这也是Facility * 8的原因:

代号 严重性(Severity) 注释
0 Emergency: system is unusable 崩溃级别
1 Alert: action must be taken immediately 报警级别
2 Critical: critical conditions 危急级别
3 Error: error conditions 错误级别
4 Warning: warning conditions 警告级别
5 Notice: normal but significant condition 提示级别
6 Informational: informational messages 消息级别
7 Debug: debug-level messages 调试级别

其它注意点

  • 协议的实现必须支持基于 TLS 的传输,应该支持基于 UDP 的传输
  • 所有接收设备必须能够结构长度不超过480个八位字节的消息,应该接收长度最大为2048个八位字节的消息,可以接收超过2048个八位字节的消息(可以截断或丢弃)。

rsyslog 使用

鉴于 rsyslog 已经是众多类 Unix 系统和 GNU/Linux 发行版系统日志采集的首选,所以这里重点介绍一下 rsyslog 使用。

配置文件

一般 rsyslog 的配置文件在 /etc/rsyslog.conf, 其由 3 个部分组成:模块(MODULES),全局设置(GLOBAL DRICTIVES)和规则(RULE)。这里以 Centos 中 rsyslog 配置为例。


服务端配置

[root@us-prod-sre-syslog-2 ~]# grep -v "^$" /etc/rsyslog.conf | grep -v "^#"
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$FileOwner log
$FileGroup log
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser log
$PrivDropToGroup log
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$template  SpiceTmpl,"%msg%\n"
$template Remote,"/data/logs/%syslogtag%/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%.log"
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
local7.*

重启服务端生效

[root@test-service-1 lingoace]# systemctl restart rsyslog
[root@test-service-1 lingoace]# 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 2021-08-04 03:58:11 UTC; 2s ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 77209 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─77209 /usr/sbin/rsyslogd -n

Aug 04 03:58:11 test-service-1 systemd[1]: Starting System Logging Service...
Aug 04 03:58:11 test-service-1 rsyslogd[77209]:  [origin software="rsyslogd" swVersion="8.24.0-52.el7_8.2" x-pid="77209" x-info="http:...] start
Aug 04 03:58:11 test-service-1 systemd[1]: Started System Logging Service.
Hint: Some lines were ellipsized, use -l to show in full.

客户端配置

[root@us-prod-ops-backend-service-1 ~]# grep -v "^$" /etc/rsyslog.conf | grep -v "^#"
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$ModLoad imudp
$UDPServerRun 514
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.mail.none;authpriv.none;cron.none                /var/log/messages
info;error                 @@10.0.7.83
local7.*                                                /var/log/boot.log
module(load="imfile" PollingInterval="2")
$InputFileName /data/logs/lingoace/info.log
$InputFileTag ops-backend-service-info
$InputFileStateFile state-ops-backend-service-info
$InputRunFileMonitor
$InputFileName /data/logs/lingoace/error.log
$InputFileTag ops-backend-service-error
$InputFileStateFile state-ops-backend-service-error
$InputRunFileMonitor     

 

继续阅读
DevOps
  • 本文由 发表于 2022年9月1日 18:43:30
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
部署NFS服务 NFS

部署NFS服务

部署 NFS 服务 服务端: 192.168.100.11 安装依赖 yum -y install epel-release 安装 NFS yum -y install nfs-...
git clone代码报文件名过长 Tool

git clone代码报文件名过长

简述 由于工程路径过长导致克隆代码时会出现文件名过长的问题不能clone代码中断 打开git Bash窗口执行 git config --global core.longpaths tr...
服务器禁ping Tool

服务器禁ping

ping是通的 [root@nginx-2 ~]# ping 192.168.1.227 PING 192.168.1.227 (192.168.1.227) 56(84) bytes of da...
linux压缩包加密 Tool

linux压缩包加密

OpenSSL加密算法 OpenSSL是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库、应用程序、SSL协议库[vip] Openssl支持的加密算法有: ...
评论  0  访客  0

发表评论