系统日志收集之初探rsyslog(系统日志采集方法有哪些)
nanshan 2024-10-22 13:03 35 浏览 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/
相关推荐
- 0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)
-
文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...
- ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes
-
为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...
- 生产环境starrocks 3.1存算一体集群部署
-
集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...
- 在CentOS上添加swap虚拟内存并设置优先级
-
现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...
- 国产深度(deepin)操作系统优化指南
-
1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...
- postgresql-15.4 多节点主从(读写分离)
-
1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...
- Docker 容器 Java 服务内存与 GC 优化实施方案
-
一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...
- 虚拟内存设置、解决linux内存不够问题
-
虚拟内存设置(解决linux内存不够情况)背景介绍 Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...
- Elasticsearch性能调优(5):服务器配置选择
-
在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...
- Es如何落地
-
一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...
- 针对Linux内存管理知识学习总结
-
现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...
- MySQL进阶之性能优化
-
概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...
- Linux Cgroups(Control Groups)原理
-
LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...
- linux 常用性能优化参数及理解
-
1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...
- 如何在 Linux 中使用 Sysctl 命令?
-
sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)