网站首页 > 技术文章 正文
系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对用户了解系统的运行状态是非常有用的,所以需要把它们保存到对应的日志文件中,以便后续进行分析和监控系统或软件的状态。 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/
- 上一篇: 一文读懂关于Python Log日志如何输出到控制台示例
- 下一篇: 小小的日志,大大的坑 小小的日子
猜你喜欢
- 2024-12-29 基于 SLF4J 的 MDC 实现日志链路追踪详解
- 2024-12-29 使用Flume同步日志到Kafka flume收集日志到hdfs
- 2024-12-29 Python日志模块logging python logger日志级别
- 2024-12-29 在Spring Boot中通过AOP技术实现日志拦截操作
- 2024-12-29 [编程基础] Python日志记录库logging总结
- 2024-12-29 如何将日志记录到 Windows事件日志 中
- 2024-12-29 SpringBoot集成logback异步日志 springboot集成日志log4j2
- 2024-12-29 Spring Boot中的Logback日志配置详解
- 2024-12-29 Linux 系统日志写入记录命令用法(logger)
- 2024-12-29 Python logging模块日志相关功能及应用示例
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)