系统日志收集之初探rsyslog(系统日志采集数据的方法)
off999 2024-10-07 12:18 31 浏览 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/
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
