百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

系统日志收集之初探rsyslog(系统日志采集方法有哪些)

nanshan 2024-10-22 13:03 32 浏览 0 评论

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

介绍

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

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

它的优势有如下:

? 高性能(使用 C 编写,运用多线程)

? 支持 TCP, SSL, TLS, RELP

? 支持多种输出(MySQL, PostgreSQL等)

? 支持对系统日志的过滤

? 灵活配置多种输出

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

syslog 协议

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

三层模型

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

部署场景

syslog 协议遵循以下的原则:

? 协议没有信息确认机制 消息从发送者发送到接受者的 UDP 514 端口,不需要接收方应答。

? 发送者和中继器可以将相同的消息发送给多个接收者和中继器

? 发送者,中继器和接收者可以部署在同一个系统上。

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

消息格式

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 配置为例。

# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### 模块MODULES ####

# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### 全局设置GLOBAL DIRECTIVES ####

# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on

# File to store the position in the journal
$IMJournalStateFile imjournal.state


#### 规则RULES ####

# 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


# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###

每次修改配置文件后可以通过以下操作来判断配置文件是否合理并重启 rsyslogd 服务。

# 验证配置文件 /etc/syslog.conf 是否合理
rsyslogd -f /etc/rsyslog.conf -N1
# 重启 rsyslog 服务
systemctl restart rsyslog

基本验证

一般系统都会提供 logger 命令行,可以使用其向系统输入日志。

# -i 记录进程id
# -t 标识记录的tag
# -p 指定消息的设备信息和日志等级,默认user.info
logger -i -t 'hjy_test' -p facility.level 'message'

实战

网上有一篇博文[8]是介绍将 rsyslog 的日志输出到 mysql 中,当然强大的 rsyslog 不仅支持输出到 mysql 中,基本覆盖了所有的主流存储软件。 不过这里介绍的实战是利用 rsyslog 的用户自定义设备来实现推荐系统的用户行为收集。大体的思路是推荐请求或数据上报请求通过 nginx 将请求转发到多台 online 服务中的一个。 该服务处理完请求后会将推荐的数据或打点上报的数据通过 SyslogHandler 汇总到目标服务器上进行推荐系统用户行为的统一处理。具体架构见下图:

优势如下:

? 速度快,稳定性高,性能好(支持百万QPS,压测到十万级别[9])

? rsyslogd 一般服务器自带,不需要安装,只需简单配置

? 客户端实现简单,比如 Python 中 logger 就有 SyslogHandler 来向 rsyslogd 发送日志。

参考文献

1.rsyslog官网[10]

2.rsyslog源码[11]

3.维基百科syslog[12]

4.维基百科rsyslog[13]

5.维基百科syslog-ng[14]

6.三种syslog比较[15]

7.rfc3164[16]

8.rfc5424[17]

9.rfc5425[18]

10.rfc5426[19]

11.rsyslog配置[20]

12.记录rsyslog日志到mysql[21]

13.rsyslog 的 TCP 转发性能测试[22]

References

[1] rsyslog: https://en.wikipedia.org/wiki/Rsyslog
[2] syslog:
https://zh.wikipedia.org/wiki/Syslog
[3] syslog-ng:
https://en.wikipedia.org/wiki/Syslog-ng
[4] RFC 3164:
https://tools.ietf.org/html/rfc3164
[5] RFC 5424:
https://tools.ietf.org/html/rfc5424
[6] RFC 5425:
https://tools.ietf.org/html/rfc5425
[7] RFC 5426:
https://tools.ietf.org/html/rfc5426
[8] 博文:
https://www.codenong.com/cs105581064/
[9] 压测到十万级别:
http://chenlinux.com/2015/02/12/rsyslog-forwarder-testing/
[10] rsyslog官网:
https://www.rsyslog.com/
[11] rsyslog源码:
https://github.com/rsyslog/rsyslog
[12] 维基百科syslog:
https://zh.wikipedia.org/wiki/Syslog
[13] 维基百科rsyslog:
https://en.wikipedia.org/wiki/Rsyslog
[14] 维基百科syslog-ng:
https://en.wikipedia.org/wiki/Syslog-ng
[15] 三种syslog比较:
https://serverfault.com/questions/692309/what-is-the-difference-between-syslog-rsyslog-and-syslog-ng
[16] rfc3164:
https://tools.ietf.org/html/rfc3164
[17] rfc5424:
https://tools.ietf.org/html/rfc5424
[18] rfc5425:
https://tools.ietf.org/html/rfc5425
[19] rfc5426:
https://tools.ietf.org/html/rfc5426
[20] rsyslog配置:
https://blog.clanzx.net/software/rsyslog.html
[21] 记录rsyslog日志到mysql:
https://www.codenong.com/cs105581064/
[22] rsyslog 的 TCP 转发性能测试:
http://chenlinux.com/2015/02/12/rsyslog-forwarder-testing/

相关推荐

Linux 的磁盘系统,和你了解的Windows差别很大

我的C盘去哪了?一个系统,如果没有存储,那么也就不能称之为系统。存储性是一个完整系统的重要组成部分。例如AWS最开始的服务就是S3(用来存储数据的云服务),足以见得存储对于一个应用平台是多么的重要。...

一文读懂 Linux 硬盘挂载:从问题到解决方案

各位互联网大厂的后端开发伙伴们!在咱们日常工作中,操作Linux系统是常有的事儿吧。你们有没有遇到过这样的场景:新添加了一块硬盘,满心欢喜准备用来存储重要数据或者部署新的应用服务,却突然发现不知道...

硬盘分区(硬盘分区格式)

 磁盘(硬盘)分区,可以分C、D、E等分区,大家可能都会用,会根据自已的需要确定所需的空间,但分区是如何工作的呢,内容如下。Windows中有3类:MBR分区:MasterBootRecord,也...

parted命令工具分区介绍(particle命令)

linux系统磁盘分区通常可以使用fdisk和parted命令,当分区大小小于2TB的时候,两种皆可以使用,当分区大于2TB的话,就需要用parted分区。以下介绍parted命令相关使用,以sdb为...

Linux 服务器上查看磁盘类型的方法

方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。NAME列显示设备名称(如sda、nvme0n1)。TR...

Linux分区命令fdisk和parted使用介绍

摘要:一般情况下,Linux分区都是选择fdisk工具,要求硬盘格式为MBR格式,能支持的最大分区空间为2T。但是目前在实际生产环境中使用的磁盘空间越来越大,呈TB级别增长;而常用的fdisk这个工具...

linux 分区原理与名词解释(linux操作系统中的分区类型)

分区的意义将磁盘分成几份,每份挂在到文件系统的那个目录在linux里的文件系统Ext2:早期的格式,不支持日志功能Ext3:ext2改良版,增加了日志功能,是最基本且最常用的使用格式了Ext4:针对e...

linux 分区合并(linux合理分区)

查看虚拟机当前磁盘挂载情况fdisk-l选择磁盘fdisk/dev/sda查看磁盘分区情况p重新选择分区n选择主分区p保存w创建物理卷pvcreate/dev/sda3查看物理卷信息pvdi...

如何在 Linux 系统中永久禁用交换分区 ?

Linux操作系统中的交换分区或交换文件充当硬盘上的临时存储区域,当物理内存(RAM)满时,系统使用该存储区域。它用于交换较少使用的内存页,这样系统就不会因为运行应用程序而耗尽物理内存。随着技术的发...

Linux 如何知道硬盘已用多少空间、未用多少空间

刚出社会时,去了一家公司上班,老板为了省钱,买的服务器是低配的,硬盘大小只有40G,有一次网站突然不能访问了,排查半天才知道原来服务器的硬盘空间已用完,已无可用空间。第一步是查看硬盘的使用情况,第二步...

用Linux系统管理磁盘空间 就该这么来

要想充分有效的管理使用Linux系统中的存储空间,用户必须要做的就是双管齐下,一边扩充空间一边限制空间。不得不说的就是很多时候磁盘空间就像水资源,需节制水流。说到要如何实现限制空间就离不开使用LVM技...

Windows 11 磁盘怎么分区?(windows11磁盘怎么分区)

Windows11磁盘分区技术解析与操作指南:构建高效存储体系一、磁盘分区的技术本质与系统价值磁盘分区作为存储系统的基础架构,通过逻辑划分实现数据隔离与管理优化。Windows11采用NTF...

linux上创建多个文件分区,格式化为 ext2、ext3、ext4、XFS 文件

以下是在Linux系统上创建多个20GB文件分区并格式化为不同文件系统的分步指南:步骤1:创建基础文件(4个20GB文件)bash#创建4个20GB稀疏文件(实际占用空间随写入量增长)ddif=/...

救命的U盘低格哪家最强?(低格优盘)

周二时有位童鞋留言说U盘之前做过引导盘,现在格式化不了,用各种工具都不行,而且因为U盘厂商的关系,查不到U盘主控,无法量产恢复,特来求助。小编花了点时间特意弄坏一个U盘分区,终于试出方法了,特来分享一...

Linux 查看硬件磁盘存储大小和磁盘阵列(RAID)的组合方式

一、查看硬件磁盘存储大小查看所有磁盘信息:#lsblk该命令会列出所有磁盘(如/dev/sda、/dev/nvme0n1)及其分区和挂载点。查看磁盘总容量:fdisk-l#或parted-...

取消回复欢迎 发表评论: