一、安裝Rsyslog Server
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
當(dāng)前服務(wù)器默認(rèn)安裝了rsyslog-8.24.0-57.el7_9.1.x86_64,執(zhí)行yum install rsyslog命令后,會(huì)升級(jí)到rsyslog-8.2102.0.master-1613347368.x86_64。
安裝rsyslog文檔,路徑 /usr/share/doc/rsyslog-8.2102.0.master/html
yum install rsyslog-doc
二、協(xié)議選擇
通常,建議使用TCP syslog,比UDP syslog可靠,但仍然很快。主要是因?yàn)?,?dāng)syslog server 收到大量消息時(shí),UDP可能會(huì)丟失消息。如果UDP system buffer 滿了,所有的消息都會(huì)丟失。TCP不會(huì)發(fā)生這樣的情況。
但是有時(shí)候還是需要設(shè)置一個(gè)UDP server,因?yàn)橐恍┰O(shè)備(比如路由器)設(shè)計(jì)上就不能發(fā)送TCP syslog。
這種情況下,就得配置所有的syslog server types來(lái)覆蓋所有的情況。如果需要配置both syslog server types,確保它們運(yùn)行于合適的端口。默認(rèn),UDP syslog 通過514端口接收消息。TCP syslog 需要一個(gè)配置一個(gè)不同的端口,因?yàn)橥ǔPC service也會(huì)使用該端口。
三、配置遠(yuǎn)程日志服務(wù)器 server side
Receiving Messages from a Remote System - rsyslog
在/etc/rsyslog.conf的 MODULES 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服務(wù)
[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
四、配置客戶機(jī)發(fā)送日志到遠(yuǎn)程日志服務(wù)器 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.conf的 forwarding block,添加行 *.* @@10.51.99.33:10514,以tcp協(xié)議發(fā)送到10.51.99.33:10514。
# ### begin forwarding rule ###
# Remote Logging (we use TCP for reliable delivery)
#
# 為此,在本地磁盤創(chuàng)建了一個(gè)隊(duì)列。如果遠(yuǎn)程主機(jī)連不上,消息會(huì)被緩存在磁盤上待再次發(fā)送。
#$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 ###
五、測(cè)試
假定,沒有在rsyslog server端配置消息存儲(chǔ)路徑。
- 在客戶機(jī)上發(fā)送測(cè)試消息
[root@VM_1_101_centos ~]# logger "hello"
[root@VM_1_101_centos ~]# logger test
- 在服務(wù)器上查看消息
[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
檢查語(yǔ)法
rsyslogd -N 1
運(yùn)行 rsyslog 于 debugging mode
rsyslogd -dn
七、配置遠(yuǎn)程日志服務(wù)器消息持久化存儲(chǔ)
1. 本地文件系統(tǒng)
Rsyslog - 使用本地文件作為遠(yuǎn)程消息存儲(chǔ)
基本用法
$template RemoteLogs,"/var/log/remotelog/%fromhost-ip%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~
高級(jí)用法
# 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。*代表所有級(jí)別,none代表沒有限制級(jí)別。
destination: 本地文件 or 遠(yuǎn)程rsyslog服務(wù)器(格式 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 收集和寫入所有的遠(yuǎn)程消息到/var/log目錄下指定的日志文件,基于 hostname (client machine name) 和前面配置的template RemoteLogs的remote client facility (program/application) 。
第二行 *.* ?RemoteLogs 定義使用模板 RemoteLogs。
第三行 & ~ 指示rsyslog在消息寫入文件后停止處理消息。如果不包含“&~”,消息將被寫入本地文件。
(范例:客戶端執(zhí)行logger test,日志寫入/var/log/remotelog/10.51.1.101/root.log,而不寫入/var/log/messages。默認(rèn)寫入/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
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. 存儲(chǔ)并轉(zhuǎn)發(fā)消息 (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配置文件結(jié)構(gòu)解析
RSyslog Documentation - rsyslog
消息流概覽
- 消息在input modules的幫助下進(jìn)入rsyslog。
- 然后,消息被發(fā)送到ruleset,根據(jù)條件適配rule。
- 匹配對(duì)應(yīng)rule后,消息被轉(zhuǎn)到某個(gè)action,進(jìn)行消息處理,比如寫入到文件、數(shù)據(jù)庫(kù),或者轉(zhuǎn)發(fā)到其他遠(yuǎn)程主機(jī)。
附件二、input modules
| 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
附件四、Actions
Action對(duì)象描述了對(duì)消息的操作。通過output modules實(shí)現(xiàn)。
Action對(duì)象有不同參數(shù):
- 適用于所有action的參數(shù),將在下面描述。
- 用于action queue的參數(shù)。參見 queue parameters。
- action 特定參數(shù)。適用于特定類型的actions。參見 output modules。
General Action Parameters - 摘選
1. Regular File
通常消息會(huì)存儲(chǔ)到文件。文件通過絕對(duì)路徑指定,以 ”/“ 開頭。Version 4.6.2 和 5.4.1后支持相對(duì)路徑。相對(duì)路徑以 "." 開頭。比如,以 "./file-in-current-dir.log" 指派當(dāng)前目錄的文件。rsyslogd通常將其工作目錄更改為root,因此相對(duì)路徑文件名要小心。
在每個(gè)條目前面加上減號(hào)“-”,以避免在每次日志記錄后同步文件。但是,如果系統(tǒng)在嘗試寫入后崩潰,則可能會(huì)丟失信息。然而,這可能會(huì)提升一些性能,特別是記錄詳細(xì)日志時(shí)。如果你的系統(tǒng)有可靠的UPS,并且接收大量日志數(shù)據(jù)(例如,防火墻日志),那么最好在文件名前面指定 “-”。
文件名可以是靜態(tài)的static(始終相同)或動(dòng)態(tài)的dynamic (根據(jù)收到的消息不同)。動(dòng)態(tài)文件名會(huì)基于某些條件,將消息自動(dòng)拆分為不同的文件。例如,dynamic file name selectors 可以根據(jù)發(fā)送消息的hostname將其拆分為不同的文件。dynamic file names 的一切都是自動(dòng)的,不需要 filter。
它需要搭配 template 工作。首先,要為文件名定義一個(gè)template。我們這里使用已經(jīng)定義的 template “DynFile” 。動(dòng)態(tài)文件名定義為,問號(hào) ?"后接模板名。如下:
*.* ?DynFile
要避免同步,如下:
*.* -?DynFile
也可以使用 templates 來(lái)指定輸出格式,如下:
*.* ?DynFile;MyTemplate
創(chuàng)建目錄也是支持的。比如,可以使用 hostname 作為目錄,program name 作為文件名:
$template DynFile,"/var/log/%HOSTNAME%/%programname%.log"
2. Template Name
每個(gè) ACTION 后面可以跟一個(gè) template name。如果是,該 template 將用于消息格式化。如果沒有給定,將給該 action 適配一個(gè) hard-coded default template 。對(duì)于給定的 action,只能存在一個(gè) template name。Default template 被指派給每個(gè) action。參見 template documentation。
3. 調(diào)用插件
這是一個(gè)調(diào)用output插件的通用方法。插件必須支持這個(gè)功能。實(shí)際參數(shù)取決于module。通用語(yǔ)法如下:
:modname:params;template
現(xiàn)在,ommysql database output module 支持該語(yǔ)法 。對(duì)于 ommysql,module name 是 “ommysql” ,參數(shù)就是傳統(tǒng)的那些。;template部分,不是module指派的,是適用于所有module的 rsyslog通用功能。
范例:ommysql module 調(diào)用如下:
:ommysql:dbhost,dbname,dbuser,dbpassword;dbtemplate
更多信息參見 Database Table section 。
4. Database Table
可以將消息存儲(chǔ)到數(shù)據(jù)庫(kù)表內(nèi)。當(dāng)前,僅支持MySQL。然而,其他數(shù)據(jù)庫(kù)驅(qū)動(dòng)也可以開發(fā)為插件。
默認(rèn),工作需要跟 MonitorWare 兼容的 schema??梢允褂胷syslog包內(nèi)的createDB.SQL創(chuàng)建shema。 你也可以選擇其他schema,只需要定義一個(gè)合適的模板分配給action。
在數(shù)據(jù)庫(kù)連接信息前指派大于號(hào) (“>”)來(lái)調(diào)用 database writer 。在符號(hào)后面,設(shè)置 database host name,逗號(hào),database name,逗號(hào),database user,逗號(hào),user’s password。
如果使用了指定的template,則可以在連接信息后面加上分號(hào)和 template name。
如下:
>dbhost,dbname,dbuser,dbpassword;dbtemplate
注意:要使用數(shù)據(jù)庫(kù)功能,MySQL output module必須在第一個(gè)database table action前加載到配置文件。建議在配置文件的開始處,配置如下:
$ModLoad ommysql
附件五、Templates
Templates是rsyslog的關(guān)鍵功能。它們用于消息格式化。它們海用于生成dynamic file name。rsyslog的每個(gè)output都在使用 templates 。database writer 期望它的 template 是SQL語(yǔ)句 - 因此這也是高度定制的。
與傳統(tǒng)syslogd格式兼容的templates被 hardcoded 到 rsyslogd。如果沒有指派template,會(huì)使用hardcoded templates之一。在 rsconf.c 文件查找 “template_” 可以找到相關(guān)的 hardcoded templates。
template() 原語(yǔ)的基本格式:
template(parameters)
template() 原語(yǔ)的擴(kuò)展格式:
template(parameters) { list-descriptions }
每個(gè) template 都有參數(shù) name,指定了template name;參數(shù) type,指定 template type。 name參數(shù)是唯一的, 如果不是行為不可預(yù)測(cè)。type參數(shù)指定了不同的 template types。不同types簡(jiǎn)單地啟用不同方法來(lái)指定template content。 template type 不影響 (output) plugin 。根據(jù)需要選擇不同類型。如下是可用types:
list
subtree
string
plugin
范例1:
創(chuàng)建一個(gè)適用于系統(tǒng)日志集中化管理的動(dòng)態(tài)文件名模板。
template (name="DynFile" type="string" string="/var/log/system-%HOSTNAME%.log")
附件六、& ~ 意義
& 釋義
可以在一個(gè)選擇器配置多個(gè) actions。每個(gè) action 必須獨(dú)占一行,以(‘&’) 字符開頭,沒有過濾器。如下:
*.=crit :omusrmsg:rger
& root
& /var/log/critmsgs
如果執(zhí)行了 discard action ,收到的消息會(huì)被丟棄。不再進(jìn)一步處理。Discard主要用于在進(jìn)一步處理前進(jìn)行消息過濾。"discard"的結(jié)果取決于它在配置文件中的位置。注意,如果消息被discarded,是無(wú)法在后面配置文件挽回的。
Discard 常用于過濾無(wú)意義的消息,這些消息會(huì)填滿你的日志文件。為此,可以將discard action 放到日志文件早期。這通常適用于property-based filters,使您可以自由地指定不需要的內(nèi)容。
Discard 只需要 word “stop” ,沒有參數(shù):
stop
比如:
*.* stop
放棄一切 (好吧,關(guān)了ryslogd不就得了…)
在傳統(tǒng)模式,使用 “~” 而不是 word “stop”
范例:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
第二行的意思是,放棄匹配前一行的消息。
附件七、屬性 properties
rsyslog Properties
rsyslog中的數(shù)據(jù)條目被稱為 properties 。它們有多個(gè)來(lái)源。最重要的來(lái)源是收到的消息。無(wú)論何時(shí)訪問數(shù)據(jù)條目,都需要訪問相應(yīng)的屬性。
Properties 用于
- templates
- conditional statements
property name 大小寫不敏感 (3.17.0之前,大小寫敏感)。
很多用戶也將 rsyslog properties 引用為 rsyslog variables??梢宰鳛橥x詞。
參閱 rsyslog lead author Rainer Gerhards explains the naming difference。
范例:
fromhost-ip 和 PROGRAMNAME 就是 properties,也稱為 variables。
$template RemoteLogs,"/var/log/remotelog/%fromhost-ip%/%PROGRAMNAME%.log"
參考文檔
Adiscon LogAnalyzer 官網(wǎng)
Adiscon LogAnalyzer Demo Site
The original Windows Syslog Server - WinSyslog
Home - EventReporter
LogAnalyzer 是基于GPL授權(quán)的免費(fèi)軟件。Rsyslog 官網(wǎng)
RSyslog Documentation - rsyslog
rsyslog存儲(chǔ)消息到MongoDB,使用LogAnalyzer分析 Using MongoDB with rsyslog and LogAnalyzer - rsyslog
Using rsyslog mmnormalize module effectively with Adiscon LogAnalyzer - rsyslogRed 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