Rsyslog Server

一、安装Rsyslog Server

RHEL/CENTOS 安装 rsyslog

cd /etc/yum.repos.d/
wget http://rpms.adiscon.com/v8-stable-nightly/rsyslog-nightly.repo # for CentOS 7
wget http://rpms.adiscon.com/v8-stable-nightly/rsyslog-nightly-rhel7.repo # for RHEL 7
yum install rsyslog

当前服务器默认安装了rsyslog-8.24.0-57.el7_9.1.x86_64,执行yum install rsyslog命令后,会升级到rsyslog-8.2102.0.master-1613347368.x86_64

安装rsyslog文档,路径 /usr/share/doc/rsyslog-8.2102.0.master/html

yum install rsyslog-doc

二、协议选择

通常,建议使用TCP syslog,比UDP syslog可靠,但仍然很快。主要是因为,当syslog server 收到大量消息时,UDP可能会丢失消息。如果UDP system buffer 满了,所有的消息都会丢失。TCP不会发生这样的情况。

但是有时候还是需要设置一个UDP server,因为一些设备(比如路由器)设计上就不能发送TCP syslog。

这种情况下,就得配置所有的syslog server types来覆盖所有的情况。如果需要配置both syslog server types,确保它们运行于合适的端口。默认,UDP syslog 通过514端口接收消息。TCP syslog 需要一个配置一个不同的端口,因为通常RPC service也会使用该端口。

三、配置远程日志服务器 server side

Receiving Messages from a Remote System - rsyslog

/etc/rsyslog.confMODULES block,配置接受tcp和udp的syslog。

#### 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 10514

重启rsyslog服务

[root@VM-99-33-centos ~]# systemctl restart rsyslog

[root@VM-99-33-centos ~]# netstat -anpl |grep rsyslog
tcp        0      0 0.0.0.0:10514           0.0.0.0:*               LISTEN      30572/rsyslogd      
tcp6       0      0 :::10514                :::*                    LISTEN      30572/rsyslogd      
udp        0      0 0.0.0.0:514             0.0.0.0:*                           30572/rsyslogd      
udp6       0      0 :::514                  :::*                                30572/rsyslogd      
unix  2      [ ]         DGRAM                    311861   30572/rsyslogd     

四、配置客户机发送日志到远程日志服务器 client side

Sending Messages to a Remote Syslog Server - rsyslog

How to Setup Rsyslog Client to Send Logs to Rsyslog Server in CentOS 7 (tecmint.com)

/etc/rsyslog.confforwarding block,添加行 *.* @@10.51.99.33:10514,以tcp协议发送到10.51.99.33:10514

# ### begin forwarding rule ###
# Remote Logging (we use TCP for reliable delivery)
#
# 为此,在本地磁盘创建了一个队列。如果远程主机连不上,消息会被缓存在磁盘上待再次发送。
#$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
*.* @@10.51.99.33:10514
# ### end of the forwarding rule ###

五、测试

假定,没有在rsyslog server端配置消息存储路径。

  1. 在客户机上发送测试消息
[root@VM_1_101_centos ~]# logger "hello"
[root@VM_1_101_centos ~]# logger test
  1. 在服务器上查看消息
[root@VM-99-33-centos ~]# tail -f /var/log/messages
Sep 27 13:50:31 localhost root: hello
Sep 27 13:51:51 localhost root: test

六、rsyslog debugging

RHEL7 - debugging_rsyslog

检查语法

rsyslogd -N 1

运行 rsyslog 于 debugging mode

rsyslogd -dn

七、配置远程日志服务器消息持久化存储

1. 本地文件系统

Rsyslog - 使用本地文件作为远程消息存储

基本用法

$template RemoteLogs,"/var/log/remotelog/%fromhost-ip%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~

高级用法

# do this in FRONT of the local/regular rules
if $fromhost-ip startswith '192.0.1.' then /var/log/network1.log
& ~
if $fromhost-ip startswith '192.0.2.' then /var/log/network2.log
& ~
# local/regular rules, like
*.* /var/log/syslog.log
用法

How to Setup Central Logging Server with Rsyslog in Linux (tecmint.com)
定义 ruleset

facility.severity_level destination (where to store log)

facility: 生成消息的 process/application 类型,包含 auth, cron, daemon, kernel, local0..local7。* 代表所有。
severity_level: 消息类型 emerg-0, alert-1, crit-2, err-3, warn-4, notice-5, info-6, debug-7。*代表所有级别,none代表没有限制级别。
destination: 本地文件 or 远程rsyslog服务器(格式 IP:port).

We will use the following ruleset for collecting logs from remote hosts, using the RemoteLogs template. Note that these rules must come before any rules for processing local messages, as shown in the screenshot.

$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs 
& ~

Looking at the above ruleset, the first rule is “$template RemoteLogs,”/var/log/%HOSTNAME%/%PROGRAMNAME%.log””.

第一行 $template 配置 rsyslog 收集和写入所有的远程消息到/var/log目录下指定的日志文件,基于 hostname (client machine name) 和前面配置的template RemoteLogs的remote client facility (program/application) 。

第二行 *.* ?RemoteLogs 定义使用模板 RemoteLogs

第三行 & ~ 指示rsyslog在消息写入文件后停止处理消息。如果不包含“&~”,消息将被写入本地文件。
(范例:客户端执行logger test,日志写入/var/log/remotelog/10.51.1.101/root.log,而不写入/var/log/messages。默认写入/var/log/messages。)

Journey of Life: rsyslogd dynamically create log file based on msg content (tiebing.blogspot.com)

$template RemoteHost,"/var/log/x/host/%$YEAR%-%$MONTH%-%$DAY%/%HOSTNAME%/%APP-NAME%.log"
$template unixTS,"%timegenerated:::date-unixtimestamp%,%msg%\n"
$template shortlog,"%msg:10:1000%"
$template DynFile,"/tmp/test-%msg:7:18%.log"
$template myFormat,"%rawmsg%\n"
$template DynamicFile,"/var/log/systems/host-%HOSTNAME%.log"
%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log
"%timestamp% %fromhost-ip% %syslogtag% %msg%\n"
$template DynamicFile,"/var/log/systems/host-%fromhost-ip%.log"
$template timeandhost_auth, "/var/log/rsyslog/%FROMHOST%/%$YEAR%/%$MONTH%/%FROMHOST%-%$NOW%-auth.log"
$template timeandhost_syslog, "/var/log/rsyslog/%FROMHOST%/%$YEAR%/%$MONTH%/%FROMHOST%-%$NOW%-syslog.log"

if $source != 'mybox' then ?timeandhost_syslog
if $source != 'mybox' and ($syslogfacility-text == 'authpriv' or $syslogfacility-text == 'auth') then ?timeandhost_auth
if $syslogfacility-text == 'cron' then -/var/log/cron.log

if $source == 'mybox' and ($syslogfacility-text == 'authpriv' or $syslogfacility-text == 'auth') then /var/log/auth.log
if $source == 'mybox' then -/var/log/syslog

if $source == 'mybox' and $syslogfacility-text == 'daemon' then -/var/log/daemon.log
if $source == 'mybox' and $syslogfacility-text == 'kern' then -/var/log/kern.log

rsyslog – create dynamic files – Just Troubleshoot IT (nimdati.com)

$template DailyDynFileNGINX,"/var/log/nginx_%$YEAR%-%$MONTH%-%$DAY%"
if ($msg contains "nginx")
then {
     ?DailyDynFileNGINX
}


$template DailyDynFileNGINX,"/var/log/nginx_%$YEAR%-%$MONTH%-%$DAY%"
:msg,contains,"nginx" ?DailyDynFileNGINX
2. MongoDB

RHEL7- 使用MongoDB作为消息存储

module(load”ommongodb”)

. action(type="ommongodb" server="DB_server" serverport="port" db="DB_name" collection="collection_name" uid="UID" pwd="password")

You can shape the form of the final database output with use of templates. By default, rsyslog uses a template based on standard lumberjack field names.

3. 存储并转发消息 (syslog relay)

Storing and forwarding remote messages - rsyslog
Rsyslog – Store and Forward messages to other hosts – Scubarda

Now create a new file /etc/rsyslog.d/90-store_forward.conf where we put the store&forward confguration

### Locally log received data
# log every host in a its own dir
$template RemoteHost,"/var/spool/rsyslog/%HOSTNAME%/%$YEAR%/%$MONTH%/%$DAY%/syslog.log"
# log everything in a single file
#$template RemoteHost,"/var/spool/rsyslog/received"

### Enable Remote Logging saving locally to the specified file
$RuleSet remote
*.* ?RemoteHost
# Send messages we receive to host
*.* @a.b.c.d:514 #UDP, just one @
*.* @e.f.g.h:514 #UDP
#*.* @@j.k.l.m:514 #TCP, two @

### Listeners (TCP/UDP)
# bind ruleset to the udp listener
$InputUDPServerBindRuleset remote
# and activate it on port udp/514:
$UDPServerRun 514

# bind ruleset to the tcp listener
#$InputTCPServerBindRuleset remote
# and activate it on port tcp/514:
#$InputTCPServerRun 514

附件一、rsyslog配置文件结构解析

RSyslog Documentation - rsyslog

消息流概览
  1. 消息在input modules的帮助下进入rsyslog
  2. 然后,消息被发送到ruleset,根据条件适配rule
  3. 匹配对应rule后,消息被转到某个action,进行消息处理,比如写入到文件、数据库,或者转发到其他远程主机。

附件二、input modules

Input Modules - rsyslog

input modules description comments
imudp UDP Syslog Input Module
imtcp TCP Syslog Input Module
imuxsock Unix Socket Input Module
imfile Text File Input Module
imdocker Docker Input Module
imgssapi GSSAPI Syslog Input Module
imbatchreport Batch report input module
Imhiredis Redis input plugin
imhttp http input module
imkafka read from Apache Kafka
imklog Kernel Log Input Module
imkmsg /dev/kmsg Log Input Module
immark Mark Message Input Module
Impcap network traffic capture
improg Program integration input module
impstats Generate Periodic Statistics of Internal Counters
imptcp Plain TCP Syslog
imrelp RELP Input Module
imsolaris Solaris Input Module
imtuxedoulog Tuxedo ULOG input module
im3195 RFC3195 Input Module

附件三、output modules

Output Modules - rsyslog

output modules description comments
omruleset ruleset output/including module
omfile File Output Module
omelasticsearch Elasticsearch Output Module
omfwd syslog Forwarding Output Module
ommongodb MongoDB Output Module
ommysql MySQL Database Output Module
omoracle Oracle Database Output Module
ompgsql PostgreSQL Database Output Module
omhdfs Hadoop Filesystem Output Module
omhiredis Redis Output Module
omkafka write to Apache Kafka
omrabbitmq RabbitMQ output module
ommail Mail Output Module
omhttp HTTP Output Module
omhttpfs Hadoop HTTPFS Output Module
omjournal Systemd Journal Output
omlibdbi Generic Database Output Module
ompipe Pipe Output Module
omprog Program integration Output module
omrelp RELP Output Module
omsnmp SNMP Trap Output Module
omstdout stdout output module (testbench tool)
omudpspoof UDP spoofing output module
omusrmsg notify users
omuxsock Unix sockets Output Module
omamqp1 AMQP 1.0 Messaging Output Module
omclickhouse ClickHouse Output Module
GuardTime Log Signature Provider (gt) sig.provider
Keyless Signature Infrastructure Provider (ksi) sig.provider
KSI Signature Provider (rsyslog-ksi-ls12) sig.provider

附件四、Actions

Actions - rsyslog

Action对象描述了对消息的操作。通过output modules实现。

Action对象有不同参数:

  • 适用于所有action的参数,将在下面描述。
  • 用于action queue的参数。参见 queue parameters
  • action 特定参数。适用于特定类型的actions。参见 output modules

General Action Parameters - 摘选

1. Regular File

通常消息会存储到文件。文件通过绝对路径指定,以 ”/“ 开头。Version 4.6.2 和 5.4.1后支持相对路径。相对路径以 "." 开头。比如,以 "./file-in-current-dir.log" 指派当前目录的文件。rsyslogd通常将其工作目录更改为root,因此相对路径文件名要小心。
在每个条目前面加上减号“-”,以避免在每次日志记录后同步文件。但是,如果系统在尝试写入后崩溃,则可能会丢失信息。然而,这可能会提升一些性能,特别是记录详细日志时。如果你的系统有可靠的UPS,并且接收大量日志数据(例如,防火墙日志),那么最好在文件名前面指定 “-”。

文件名可以是静态的static(始终相同)或动态的dynamic (根据收到的消息不同)。动态文件名会基于某些条件,将消息自动拆分为不同的文件。例如,dynamic file name selectors 可以根据发送消息的hostname将其拆分为不同的文件。dynamic file names 的一切都是自动的,不需要 filter。

它需要搭配 template 工作。首先,要为文件名定义一个template。我们这里使用已经定义的 template “DynFile” 。动态文件名定义为,问号 ?"后接模板名。如下:

*.* ?DynFile

要避免同步,如下:

*.* -?DynFile

也可以使用 templates 来指定输出格式,如下:

*.* ?DynFile;MyTemplate

创建目录也是支持的。比如,可以使用 hostname 作为目录,program name 作为文件名:

$template DynFile,"/var/log/%HOSTNAME%/%programname%.log"
2. Template Name

每个 ACTION 后面可以跟一个 template name。如果是,该 template 将用于消息格式化。如果没有给定,将给该 action 适配一个 hard-coded default template 。对于给定的 action,只能存在一个 template name。Default template 被指派给每个 action。参见 template documentation。

3. 调用插件

这是一个调用output插件的通用方法。插件必须支持这个功能。实际参数取决于module。通用语法如下:

:modname:params;template

现在,ommysql database output module 支持该语法 。对于 ommysql,module name 是 “ommysql” ,参数就是传统的那些。;template部分,不是module指派的,是适用于所有module的 rsyslog通用功能。

范例:ommysql module 调用如下:

:ommysql:dbhost,dbname,dbuser,dbpassword;dbtemplate

更多信息参见 Database Table section 。

4. Database Table

可以将消息存储到数据库表内。当前,仅支持MySQL。然而,其他数据库驱动也可以开发为插件。
默认,工作需要跟 MonitorWare 兼容的 schema。可以使用rsyslog包内的createDB.SQL创建shema。 你也可以选择其他schema,只需要定义一个合适的模板分配给action。
在数据库连接信息前指派大于号 (“>”)来调用 database writer 。在符号后面,设置 database host name,逗号,database name,逗号,database user,逗号,user’s password。
如果使用了指定的template,则可以在连接信息后面加上分号和 template name。
如下:

>dbhost,dbname,dbuser,dbpassword;dbtemplate

注意:要使用数据库功能,MySQL output module必须在第一个database table action前加载到配置文件。建议在配置文件的开始处,配置如下:

$ModLoad ommysql

附件五、Templates

Templates是rsyslog的关键功能。它们用于消息格式化。它们海用于生成dynamic file name。rsyslog的每个output都在使用 templates 。database writer 期望它的 template 是SQL语句 - 因此这也是高度定制的。
与传统syslogd格式兼容的templates被 hardcoded 到 rsyslogd。如果没有指派template,会使用hardcoded templates之一。在 rsconf.c 文件查找 “template_” 可以找到相关的 hardcoded templates。

template() 原语的基本格式:

template(parameters)

template() 原语的扩展格式:

template(parameters) { list-descriptions }

每个 template 都有参数 name,指定了template name;参数 type,指定 template type。 name参数是唯一的, 如果不是行为不可预测。type参数指定了不同的 template types。不同types简单地启用不同方法来指定template content。 template type 不影响 (output) plugin 。根据需要选择不同类型。如下是可用types:

list
subtree
string
plugin

范例1:
创建一个适用于系统日志集中化管理的动态文件名模板。

template (name="DynFile" type="string" string="/var/log/system-%HOSTNAME%.log")

附件六、& ~ 意义

& 释义
可以在一个选择器配置多个 actions。每个 action 必须独占一行,以(‘&’) 字符开头,没有过滤器。如下:

*.=crit :omusrmsg:rger
& root
& /var/log/critmsgs

~ 释义

如果执行了 discard action ,收到的消息会被丢弃。不再进一步处理。Discard主要用于在进一步处理前进行消息过滤。"discard"的结果取决于它在配置文件中的位置。注意,如果消息被discarded,是无法在后面配置文件挽回的。

Discard 常用于过滤无意义的消息,这些消息会填满你的日志文件。为此,可以将discard action 放到日志文件早期。这通常适用于property-based filters,使您可以自由地指定不需要的内容。

Discard 只需要 word “stop” ,没有参数:

stop

比如:

*.*   stop

放弃一切 (好吧,关了ryslogd不就得了…)

在传统模式,使用 “~” 而不是 word “stop”

范例:

:msg, startswith, "iptables: " -/var/log/iptables.log
& ~

第二行的意思是,放弃匹配前一行的消息。

附件七、属性 properties

rsyslog Properties
rsyslog中的数据条目被称为 properties 。它们有多个来源。最重要的来源是收到的消息。无论何时访问数据条目,都需要访问相应的属性。

Properties 用于

property name 大小写不敏感 (3.17.0之前,大小写敏感)。

很多用户也将 rsyslog properties 引用为 rsyslog variables。可以作为同义词。
参阅 rsyslog lead author Rainer Gerhards explains the naming difference

范例:
fromhost-ipPROGRAMNAME 就是 properties,也称为 variables。

$template RemoteLogs,"/var/log/remotelog/%fromhost-ip%/%PROGRAMNAME%.log"

参考文档


  1. Adiscon LogAnalyzer 官网
    Adiscon LogAnalyzer Demo Site
    The original Windows Syslog Server - WinSyslog
    Home - EventReporter
    LogAnalyzer 是基于GPL授权的免费软件。

  2. Rsyslog 官网
    RSyslog Documentation - rsyslog
    rsyslog存储消息到MongoDB,使用LogAnalyzer分析 Using MongoDB with rsyslog and LogAnalyzer - rsyslog
    Using rsyslog mmnormalize module effectively with Adiscon LogAnalyzer - rsyslog

  3. Red Hat 文档 - rsyslog
    How to use rsyslog to create a Linux log aggregation server | Enable Sysadmin (redhat.com)
    RHEL6 - Viewing and Managing Log Files
    RHEL7 - Viewing and Managing Log Files
    RHEL8 - Configuring a remote logging solution

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容