溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

rsyslog管理分布式日志

發(fā)布時間:2020-08-11 11:06:53 來源:網(wǎng)絡(luò) 閱讀:350 作者:sshpp 欄目:數(shù)據(jù)庫

背景

有一個4臺機(jī)器的分布式服務(wù),不多不少,上每臺機(jī)器上查看日志比較麻煩,用Flume,Logstash、ElasticSearch、Kibana等分布式日志管理系統(tǒng)又顯得大材小用,所以想到了centos自帶的rsyslog。

簡介

Rsyslog可以簡單的理解為syslog的超集,在老版本的Linux系統(tǒng)中,Red Hat Enterprise Linux 3/4/5默認(rèn)是使用的syslog作為系統(tǒng)的日志工具,從RHEL 6 開始系統(tǒng)默認(rèn)使用了Rsyslog。

Rsyslog 是負(fù)責(zé)收集 syslog 的程序,可以用來取代 syslogd 或 syslog-ng。 在這些 syslog 處理程序中,個人認(rèn)為 rsyslog 是功能最為強(qiáng)大的。 其特性包括:

  • 支持輸出日志到各種數(shù)據(jù)庫,如 MySQL,PostgreSQL,MongoDB,ElasticSearch,等等;

  • 通過 RELP + TCP 實現(xiàn)數(shù)據(jù)的可靠傳輸(基于此結(jié)合豐富的過濾條件可以建立一種 可靠的數(shù)據(jù)傳輸通道供其他應(yīng)用來使用);

  • 精細(xì)的輸出格式控制以及對消息的強(qiáng)大 過濾能力;

  • 高精度時間戳;隊列操作(內(nèi)存,磁盤以及混合模式等); 支持?jǐn)?shù)據(jù)的加密和壓縮傳輸?shù)取?/p>

版本查看

$rsyslogd -version
rsyslogd 3.22.1, compiled with:    FEATURE_REGEXP:             Yes    FEATURE_LARGEFILE:          Yes
    FEATURE_NETZIP (message compression):   Yes
    GSSAPI Kerberos 5 support:      Yes
    FEATURE_DEBUG (debug build, slow code): No
    Atomic operations supported:        Yes
    Runtime Instrumentation (slow code):    NoSee http://www.rsyslog.com for more information.

安裝

yum -y rsyslog#查看是否安裝了rsyslogrpm -qa | grep rsyslog#如果還需要別的組件(mysql模塊,日志輪轉(zhuǎn))yum -y rsyslog-mysql  
yum -y logrotate

啟動/停止

/etc/init.d/rsyslog start/etc/init.d/rsyslog stop/etc/init.d/rsyslog restart

//幫助文檔 man rsyslogd, 或者輸入一個錯誤的命令
$rsyslogd --helprsyslogd: invalid option -- '-'usage: rsyslogd [-c<version>] [-46AdnqQvwx] [-l<hostlist>] [-s<domainlist>]
                [-f<conffile>] [-i<pidfile>] [-N<level>] [-M<module load path>]
                [-u<number>]To run rsyslogd in native mode, use "rsyslogd -c3 <other options>"For further information see http://www.rsyslog.com/doc

配置

rsyslog的配置文件有多種書寫方法:

  • sysklogd(一些結(jié)構(gòu)不兼容新特性),

  • legacy rsyslog(以“\$”開頭的寫法,如:$ModLoad imtcp.so),

  • RainerScript(一種新的格式,是最推薦使用的一種,尤其是需要做復(fù)雜的配置時)。

在本文中的配置都比較簡單,就采用了legacy rsyslog的配置書寫方法。更多詳情參考:http://www.rsyslog.com/doc/master/configuration/basic_structure.html#statement-types

配置文件簡單實例

下面是一個例子:

$less /etc/rsyslog.conf 
#rsyslog v3 config file# if you experience problems, check# http://www.rsyslog.com/troubleshoot for assistance#### MODULES ####$ModLoad imuxsock.so    # provides support for local system logging (e.g. via logger command)$ModLoad imklog.so      # provides kernel logging support (previously done by rklogd)#$ModLoad immark.so     # provides --MARK-- message capability# Provides UDP syslog reception#$ModLoad imudp.so#$UDPServerRun 514# Provides TCP syslog reception#$ModLoad imtcp.so  #$InputTCPServerRun 514#### GLOBAL DIRECTIVES ##### 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#### 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 stuffcron.*                                                  /var/log/cron# Everybody gets emergency messages*.emerg                                                 *# Save news errors of level crit and higher in a special file.uucp,news.crit                                          /var/log/spooler# Save boot messages also to boot.loglocal7.*                                                /var/log/boot.log

配置文件模塊

配置文件查看less /etc/rsyslog.conf。Rsyslog的配置主要有以下模塊:

  • modules,模塊,配置加載的模塊,如:ModLoad imudp.so配置加載UDP傳輸模塊

  • global directives,全局配置,配置ryslog守護(hù)進(jìn)程的全局屬性,比如主信息隊列大小(MainMessageQueueSize)

  • rules,規(guī)則(選擇器+動作),每個規(guī)則行由兩部分組成,selector部分和action部分,這兩部分由一個或多個空格或tab分隔,selector部分指定源和日志等級,action部分指定對應(yīng)的操作

  • 模板(templates)

  • 輸出(outputs)

常用的modules

  • imudp,傳統(tǒng)方式的UDP傳輸,有損耗

  • imtcp,基于TCP明文的傳輸,只在特定情況下丟失信息,并被廣泛使用

  • imrelp,RELP傳輸,不會丟失信息,但只在rsyslogd 3.15.0及以上版本中可用

  • 更多參考

規(guī)則(rules)

規(guī)則的選擇器(selectors)

selector也由兩部分組成,設(shè)施和優(yōu)先級,由點號.分隔。第一部分為消息源或稱為日志設(shè)施,第二部分為日志級別。多個選擇器用;分隔,如:*.info;mail.none。

日志設(shè)施有:

  • auth(security), authpriv: 授權(quán)和安全相關(guān)的消息

  • kern: 來自Linux內(nèi)核的消息

  • mail: 由mail子系統(tǒng)產(chǎn)生的消息

  • cron: cron守護(hù)進(jìn)程相關(guān)的信息

  • daemon: 守護(hù)進(jìn)程產(chǎn)生的信息

  • news: 網(wǎng)絡(luò)消息子系統(tǒng)

  • lpr: 打印相關(guān)的日志信息

  • user: 用戶進(jìn)程相關(guān)的信息

  • local0 to local7: 保留,本地使用

日志級別有(升序):

  • debug:包含詳細(xì)的開發(fā)情報的信息,通常只在調(diào)試一個程序時使用。

  • info:情報信息,正常的系統(tǒng)消息,比如騷擾報告,帶寬數(shù)據(jù)等,不需要處理。

  • notice: 不是錯誤情況,也不需要立即處理。

  • warning: 警告信息,不是錯誤,比如系統(tǒng)磁盤使用了85%等。

  • err:錯誤,不是非常緊急,在一定時間內(nèi)修復(fù)即可。

  • crit:重要情況,如硬盤錯誤,備用連接丟失。

  • alert:應(yīng)該被立即改正的問題,如系統(tǒng)數(shù)據(jù)庫被破壞,ISP連接丟失。

  • emerg:緊急情況,需要立即通知技術(shù)人員。

日志設(shè)施的配置:

  • . 代表比后面還要高的消息等級都會記錄下來

  • .= 代表只有后面的這個消息等級會被記錄下來

  • .! 代表除了后面的這個消息等級,其他的都會被記錄下來,我在rsyslogd 4.6.2中失敗了不知道為啥。。

對于多個選擇器可以用;分隔。

local0.=debug                /home/admin/applogs/app-name/debug.loglocal0.err;local0.warning;local0.info                /home/admin/applogs/app-name/info.loglocal0.err                /home/admin/applogs/app-name/error.log
動作 (action)

action是規(guī)則描述的一部分,位于選擇器的后面,規(guī)則用于處理消息??偟膩碚f,消息內(nèi)容被寫到一種日志文件上,但也可以執(zhí)行其他動作,比如寫到數(shù)據(jù)庫表中或轉(zhuǎn)發(fā)到其他主機(jī)。

在前面的實例中的是寫到本地文件中的:

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

也可以寫到mysql數(shù)據(jù)庫中,

# modules, 要將日志寫到mysql中需要加載ommysql模塊$ModLoad ommysql 
# rule, send to mysql#*.*       :ommysql:database-server,database-name,database-userid,database-password*.*       :ommysql:127.0.0.1,Syslog,syslogwriter,topsecret

關(guān)于配置發(fā)送消息到數(shù)據(jù)庫的更多類容可以參考:http://www.rsyslog.com/doc/master/tutorials/database.html

action的配置:

  • 保存到文件,cron.* -/var/log/cron.log如果路徑前有-則表示每次輸出日志時不同步(fsync)指定日志文件。 文件路徑既可以是靜態(tài)文件也可以是動態(tài)文件。動態(tài)文件由模板前加 ? 定義。

  • 通過網(wǎng)絡(luò)發(fā)送日志 格式如下: @[()]:[] @ 表示使用 UDP 協(xié)議。@@ 表示使用 TCP 協(xié)議。 可以為: z 表示使用 zlib 壓縮,NUMBER 表示壓縮級別。多個選項 使用 , 分隔。 例如: . @192.168.0.1 # 使用 UDP 發(fā)送日志到 192.168.0.1 *.*@@example.com:18 # 使用 TCP 發(fā)送到 "example.com" 的 18 端口 . @(z9)[2001::1] # 使用 UDP 發(fā)送消息到 2001::1,啟用 zlib 9 級壓縮

  • cron.* ~ 丟棄所有信息,即該配置之后的動作不會看到該日志。 隨 rsyslog 版本不同,如果有如下警告信息,則將 ~ 修改為 stop。


模板(templates)

模板允許你指定日志信息的格式,也可用于生成動態(tài)文件名,或在規(guī)則中使用。其定義如下所示,其中TEMPLATE_NAME是模板的名字,PROPERTY是rsyslog本身支持的一些屬性參數(shù)。

$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]

使用例子:

$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"$template DailyPerHostLogs,"/var/log/syslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages.log"*.info ?DailyPerHostLogs
*.* ?DynamicFile

在模板中我們用到的properties可以參考官方文檔說明,例子中用到的timegenerated是指接收到消息時的時間戳。

輸出(outputs)

輸出頻道為用戶可能想要的輸出類型提供了保護(hù),在規(guī)則中使用前要先定義.其定義如下所示,其中NAME指定輸出頻道的名稱,F(xiàn)ILE_NAME指定輸出文件,MAX_SIZE指定日志文件的大小,單位是bytes, ACTION指定日志文件到達(dá)MAX_SIZE時的操作。

$outchannel NAME, FILE_NAME, MAX_SIZE, ACTION

在規(guī)則中使用輸出頻道按照如下的格式:

selectors :omfile:$NAME

例子:

$outchannel log_rotation, /var/log/test_log.log, 104857600, /home/joe/log_rotation_script

*.* :omfile:$log_rotation

配置的驗證

通過下面命令可以校驗配置文件是否配置正確:

sudo rsyslogd -f /etc/rsyslog.conf -N4

其中 -N后面的數(shù)值代表rsyslog啟動時-c 后指定的版本。

通過下面命令可以手動發(fā)送日志信息:

logger -p local0.info "hello world"

日志文件Rotating

隨著日志文件越來越大,這不僅會帶來性能問題,同時對日志的管理也非常棘手。 當(dāng)一個日志文件被rotated,會創(chuàng)建一個新的日志文件,同時舊的日志文件會被重命名。這些文件在一段時間內(nèi)被保留,一旦產(chǎn)生一定數(shù)量的舊的日志,系統(tǒng)就會刪除一部分舊的日志。

logrotate配置文件實例

logrotate是通過cron任務(wù)調(diào)用的,在安裝的時候就自動創(chuàng)建了,所以通過ps命令看不到logrotate,可查看定時任務(wù)調(diào)用:cat /etc/cron.daily/logrotate

#!/bin/sh/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"fiexit 0

cron.daily下的文件執(zhí)行都是通過/etc/crontab配置的:

$cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# |  .------------- hour (0 - 23)# |  |  .---------- day of month (1 - 31)# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# |  |  |  |  |# *  *  *  *  * user-name command to be executed0 0 * * * root run-parts /etc/cron.daily #定時執(zhí)行cron.daily

logrotate的配置文件為/etc/logrotate.conf,下面給一個例子:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old onescreate# uncomment this if you want your log files compressed
#compress# packages drop log rotation information into this directoryinclude /etc/logrotate.d# no packages own wtmp, or btmp -- we'll rotate them here/var/log/syslog
{
    rotate 7
    daily
    missingok
    notifempty
    delaycompress    compress
    postrotate
        invoke-rc.d rsyslog reload > /dev/null
    endscript
}
/var/log/cron.log/var/log/debug
/var/log/messages
{
    rotate 4
    weekly
    missingok
    notifempty    compress
    delaycompress
    sharedscripts
    postrotate
        invoke-rc.d rsyslog reload > /dev/null
    endscript
}
# system-specific logs may be configured here

syslog的日志文件每天被rotated,保留7份舊的日志。其他的日志文件每周進(jìn)行一次rotate,并保留4份舊的日志。

logrotate配置項

我們可以通過man logrotate來獲取所有的參數(shù)和詳細(xì)描述。這里列出一部分:

  • daily 指定轉(zhuǎn)儲周期為每天

  • weekly 指定轉(zhuǎn)儲周期為每周

  • monthly 指定轉(zhuǎn)儲周期為每月

  • compress 通過gzip 壓縮轉(zhuǎn)儲以后的日志

  • nocompress 不需要壓縮時,用這個參數(shù)

  • copytruncate 用于還在打開中的日志文件,把當(dāng)前日志備份并截斷

  • nocopytruncate 備份日志文件但是不截斷

  • missingok 如果文件不存在,繼續(xù)下一個文件,不報異常

  • nomissingok 如果文件不存在,報異常(默認(rèn)配置)

  • create mode(文件權(quán)限) owner(擁有者) group(組) 轉(zhuǎn)儲文件,使用指定的文件模式創(chuàng)建新的日志文件

  • nocreate 不建立新的日志文件

  • delaycompress 和 compress 一起使用時,轉(zhuǎn)儲的日志文件到下一次轉(zhuǎn)儲時才壓縮

  • nodelaycompress 覆蓋 delaycompress 選項,轉(zhuǎn)儲同時壓縮。

  • errors address 轉(zhuǎn)儲時的錯誤信息發(fā)送到指定的Email 地址

  • ifempty 即使是空文件也轉(zhuǎn)儲,(logrotate 的缺省選項)

  • notifempty 如果是空文件的話,不轉(zhuǎn)儲

  • mail address 把轉(zhuǎn)儲的日志文件發(fā)送到指定的E-mail 地址

  • nomail 轉(zhuǎn)儲時不發(fā)送日志文件

  • olddir directory 轉(zhuǎn)儲后的日志文件放入指定的目錄,必須和當(dāng)前日志文件在同一個文件系統(tǒng)

  • noolddir 轉(zhuǎn)儲后的日志文件和當(dāng)前日志文件放在同一個目錄下

  • prerotate/endscript 在轉(zhuǎn)儲以前需要執(zhí)行的命令可以放入這個對,這兩個關(guān)鍵字必須單獨成行

  • postrotate/endscript 在轉(zhuǎn)儲以后需要執(zhí)行的命令可以放入這個對,這兩個關(guān)鍵字必須單獨成行

  • rotate count 指定日志文件刪除之前轉(zhuǎn)儲的次數(shù),0 指沒有備份,5 指保留5 個備份

  • tabootext [+] LIST 讓logrotate 不轉(zhuǎn)儲指定擴(kuò)展名的文件,缺省的擴(kuò)展名是:.rpm-orig, .rpmsave, v, 和 ~

  • size SIZE 當(dāng)日志文件到達(dá)指定的大小時才轉(zhuǎn)儲,Size 可以指定 bytes (缺省)以及KB (sizek)或者M(jìn)B (sizem)

實例

sudo vim /etc/rsyslog.conf

# Provides UDP syslog reception$ModLoad imudp.so
$UDPServerRun 514$template ipAndMsg,"[%fromhost-ip%]  %$now%%msg%\n"local0.=debug                /home/admin/applogs/app-name/debug.log;ipAndMsglocal0.err;local0.warning;local0.info                /home/admin/applogs/app-name/info.log;ipAndMsglocal0.err                /home/admin/applogs/app-name/error.log;ipAndMsg

sudo service rsyslog restart

sudo service syslog/syslog-ng stop

sudo vim /etc/logrotate.conf

/home/admin/applogs/app-name/debug.log/home/admin/applogs/app-name/info.log/home/admin/applogs/app-name/error.log{
    daily
    create 0664 root root
    rotate 30
    missingok
    nocompress
    notifempty
    dateext
    postrotate        /etc/init.d/rsyslog restart > /dev/null 2>&1
    endscript
}

注意,最后必須加上:

postrotate        /etc/init.d/rsyslog restart > /dev/null 2>&1endscript

因為logrotate之后,即使已經(jīng)移走了,但是rsyslog還是持有這個文件操作句柄,會繼續(xù)往原文件(被rotate的文件)中寫,即使已經(jīng)被重命名了,所以需要 restart rsyslog 來 reopen 下 logrotate新創(chuàng)建的同名文件。

另外有一個可以不用重啟的辦法,但是會丟失部分?jǐn)?shù)據(jù),logrotate 提供了 copytruncate。默認(rèn)的指令 create 做法,是 移動舊文件,創(chuàng)建新文件,然后用腳本reopen新文件;而 copytruncate 是采用的先拷貝再清空, 先復(fù)制一份舊的日志,然后請客原文件,整個過程原來的文件句柄,并沒有變化,所以不需要reopen,服務(wù)可以不中斷,但是這個過程會導(dǎo)致部分?jǐn)?shù)據(jù)丟失。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI