rsyslog管理分佈式日誌

背景

有一個4臺機器的分佈式服務,很少很多,上每臺機器上查看日誌比較麻煩,用Flume,LogstashElasticSearchKibana等分佈式日誌管理系統又顯得大材小用,因此想到了centos自帶的rsyslog。node

簡介

Rsyslog能夠簡單的理解爲syslog的超集,在老版本的Linux系統中,Red Hat Enterprise Linux 3/4/5默認是使用的syslog做爲系統的日誌工具,從RHEL 6 開始系統默認使用了Rsyslog。mysql

Rsyslog 是負責收集 syslog 的程序,能夠用來取代 syslogd 或 syslog-ng。 在這些 syslog 處理程序中,我的認爲 rsyslog 是功能最爲強大的。 其特性包括:linux

  • 支持輸出日誌到各類數據庫,如 MySQL,PostgreSQL,MongoDB,ElasticSearch,等等;
  • 經過 RELP + TCP 實現數據的可靠傳輸(基於此結合豐富的過濾條件能夠創建一種 可靠的數據傳輸通道供其餘應用來使用);
  • 精細的輸出格式控制以及對消息的強大 過濾能力;
  • 高精度時間戳;隊列操做(內存,磁盤以及混合模式等); 支持數據的加密和壓縮傳輸等。

版本查看

$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):    No

See http://www.rsyslog.com for more information.

安裝

yum -y rsyslog
#查看是否安裝了rsyslog
rpm -qa | grep rsyslog
#若是還須要別的組件(mysql模塊,日誌輪轉)
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 --help
rsyslogd: 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的配置文件有多種書寫方法:git

  • sysklogd(一些結構不兼容新特性),
  • legacy rsyslog(以「$」開頭的寫法,如:$ModLoad imtcp.so),
  • RainerScript(一種新的格式,是最推薦使用的一種,尤爲是須要作複雜的配置時)。

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

配置文件簡單實例

下面是一個例子:sql

$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 stuff
cron.*                                                  /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.log
local7.*                                                /var/log/boot.log

配置文件模塊

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

  • modules,模塊,配置加載的模塊,如:ModLoad imudp.so配置加載UDP傳輸模塊
  • global directives,全局配置,配置ryslog守護進程的全局屬性,好比主信息隊列大小(MainMessageQueueSize)
  • rules,規則(選擇器+動做),每一個規則行由兩部分組成,selector部分和action部分,這兩部分由一個或多個空格或tab分隔,selector部分指定源和日誌等級,action部分指定對應的操做
  • 模板(templates)
  • 輸出(outputs)

經常使用的modules

  • imudp,傳統方式的UDP傳輸,有損耗
  • imtcp,基於TCP明文的傳輸,只在特定狀況下丟失信息,並被普遍使用
  • imrelp,RELP傳輸,不會丟失信息,但只在rsyslogd 3.15.0及以上版本中可用
  • 更多參考

規則(rules)

規則的選擇器(selectors)

selector也由兩部分組成,設施和優先級,由點號.分隔。第一部分爲消息源或稱爲日誌設施,第二部分爲日誌級別。多個選擇器用;分隔,如:*.info;mail.none數據庫

日誌設施有:vim

  • auth(security), authpriv: 受權和安全相關的消息
  • kern: 來自Linux內核的消息
  • mail: 由mail子系統產生的消息
  • cron: cron守護進程相關的信息
  • daemon: 守護進程產生的信息
  • news: 網絡消息子系統
  • lpr: 打印相關的日誌信息
  • user: 用戶進程相關的信息
  • local0 to local7: 保留,本地使用

日誌級別有(升序):

  • debug:包含詳細的開發情報的信息,一般只在調試一個程序時使用。
  • info:情報信息,正常的系統消息,好比騷擾報告,帶寬數據等,不須要處理。
  • notice: 不是錯誤狀況,也不須要當即處理。
  • warning: 警告信息,不是錯誤,好比系統磁盤使用了85%等。
  • err:錯誤,不是很是緊急,在必定時間內修復便可。
  • crit:重要狀況,如硬盤錯誤,備用鏈接丟失。
  • alert:應該被當即改正的問題,如系統數據庫被破壞,ISP鏈接丟失。
  • emerg:緊急狀況,須要當即通知技術人員。

日誌設施的配置:

  • . 表明比後面還要高的消息等級都會記錄下來
  • .= 表明只有後面的這個消息等級會被記錄下來
  • .! 表明除了後面的這個消息等級,其餘的都會被記錄下來,我在rsyslogd 4.6.2中失敗了不知道爲啥。。

對於多個選擇器能夠用;分隔。

local0.=debug                /home/admin/applogs/app-name/debug.log
local0.err;local0.warning;local0.info                /home/admin/applogs/app-name/info.log
local0.err                /home/admin/applogs/app-name/error.log

動做 (action)

action是規則描述的一部分,位於選擇器的後面,規則用於處理消息。總的來講,消息內容被寫到一種日誌文件上,但也能夠執行其餘動做,好比寫到數據庫表中或轉發到其餘主機。

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

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

也能夠寫到mysql數據庫中,

# 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

關於配置發送消息到數據庫的更多類容能夠參考:http://www.rsyslog.com/doc/master/tutorials/database.html

action的配置:

  • 保存到文件,cron.* -/var/log/cron.log若是路徑前有-則表示每次輸出日誌時不一樣步(fsync)指定日誌文件。 文件路徑既能夠是靜態文件也能夠是動態文件。動態文件由模板前加 ? 定義。
  • 經過網絡發送日誌 格式以下: @[()]:[] @ 表示使用 UDP 協議。@@ 表示使用 TCP 協議。 能夠爲: z 表示使用 zlib 壓縮,NUMBER 表示壓縮級別。多個選項 使用 , 分隔。 例如: . @192.168.0.1 # 使用 UDP 發送日誌到 192.168.0.1 .@@example.com:18 # 使用 TCP 發送到 "example.com" 的 18 端口 . @(z9)[2001::1] # 使用 UDP 發送消息到 2001::1,啓用 zlib 9 級壓縮
  • cron.* ~ 丟棄全部信息,即該配置以後的動做不會看到該日誌。 隨 rsyslog 版本不一樣,若是有以下警告信息,則將 ~ 修改成 stop。

模板(templates)

模板容許你指定日誌信息的格式,也可用於生成動態文件名,或在規則中使用。其定義以下所示,其中TEMPLATE_NAME是模板的名字,PROPERTY是rsyslog自己支持的一些屬性參數。

$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)

輸出頻道爲用戶可能想要的輸出類型提供了保護,在規則中使用前要先定義.其定義以下所示,其中NAME指定輸出頻道的名稱,FILE_NAME指定輸出文件,MAX_SIZE指定日誌文件的大小,單位是bytes, ACTION指定日誌文件到達MAX_SIZE時的操做。

$outchannel NAME, FILE_NAME, MAX_SIZE, ACTION

在規則中使用輸出頻道按照以下的格式:

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後面的數值表明rsyslog啓動時-c 後指定的版本。

經過下面命令能夠手動發送日誌信息:

logger -p local0.info "hello world"

日誌文件Rotating

隨着日誌文件愈來愈大,這不只會帶來性能問題,同時對日誌的管理也很是棘手。 當一個日誌文件被rotated,會建立一個新的日誌文件,同時舊的日誌文件會被重命名。這些文件在一段時間內被保留,一旦產生必定數量的舊的日誌,系統就會刪除一部分舊的日誌。

logrotate配置文件實例

logrotate是經過cron任務調用的,在安裝的時候就自動建立了,因此經過ps命令看不到logrotate,可查看定時任務調用: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]"
fi
exit 0

cron.daily下的文件執行都是經過/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 executed

0 0 * * * root run-parts /etc/cron.daily #定時執行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 ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /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份舊的日誌。其餘的日誌文件每週進行一次rotate,並保留4份舊的日誌。

logrotate配置項

咱們能夠經過man logrotate來獲取全部的參數和詳細描述。這裏列出一部分:

  • daily 指定轉儲週期爲天天

  • weekly 指定轉儲週期爲每週
  • monthly 指定轉儲週期爲每個月
  • compress 經過gzip 壓縮轉儲之後的日誌
  • nocompress 不須要壓縮時,用這個參數
  • copytruncate 用於還在打開中的日誌文件,把當前日誌備份並截斷
  • nocopytruncate 備份日誌文件可是不截斷
  • missingok 若是文件不存在,繼續下一個文件,不報異常
  • nomissingok 若是文件不存在,報異常(默認配置)
  • create mode(文件權限) owner(擁有者) group(組) 轉儲文件,使用指定的文件模式建立新的日誌文件
  • nocreate 不創建新的日誌文件
  • delaycompress 和 compress 一塊兒使用時,轉儲的日誌文件到下一次轉儲時才壓縮
  • nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮。
  • errors address 轉儲時的錯誤信息發送到指定的Email 地址
  • ifempty 即便是空文件也轉儲,(logrotate 的缺省選項)
  • notifempty 若是是空文件的話,不轉儲
  • mail address 把轉儲的日誌文件發送到指定的E-mail 地址
  • nomail 轉儲時不發送日誌文件
  • olddir directory 轉儲後的日誌文件放入指定的目錄,必須和當前日誌文件在同一個文件系統
  • noolddir 轉儲後的日誌文件和當前日誌文件放在同一個目錄下
  • prerotate/endscript 在轉儲之前須要執行的命令能夠放入這個對,這兩個關鍵字必須單獨成行
  • postrotate/endscript 在轉儲之後須要執行的命令能夠放入這個對,這兩個關鍵字必須單獨成行
  • rotate count 指定日誌文件刪除以前轉儲的次數,0 指沒有備份,5 指保留5 個備份
  • tabootext [+] LIST 讓logrotate 不轉儲指定擴展名的文件,缺省的擴展名是:.rpm-orig, .rpmsave, v, 和 ~
  • size SIZE 當日志文件到達指定的大小時才轉儲,Size 能夠指定 bytes (缺省)以及KB (sizek)或者MB (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;ipAndMsg
local0.err;local0.warning;local0.info                /home/admin/applogs/app-name/info.log;ipAndMsg
local0.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>&1
endscript

由於logrotate以後,即便已經移走了,可是rsyslog仍是持有這個文件操做句柄,會繼續往原文件(被rotate的文件)中寫,即便已經被重命名了,因此須要 restart rsyslog 來 reopen 下 logrotate新建立的同名文件。

另外有一個能夠不用重啓的辦法,可是會丟失部分數據,logrotate 提供了 copytruncate。默認的指令 create 作法,是 移動舊文件,建立新文件,而後用腳本reopen新文件;而 copytruncate 是採用的先拷貝再清空, 先複製一份舊的日誌,而後請客原文件,整個過程原來的文件句柄,並無變化,因此不須要reopen,服務能夠不中斷,可是這個過程會致使部分數據丟失。

參考

BASIC CONFIGURATION OF RSYSLOG(最完整的文檔)
Logrotate幫助文檔
using a different log format for all files
Rsyslog官網
如何對Rsyslog進行配置
Rsyslog配置詳解
跟我學Rsyslog
Linux日誌文件與Syslog函數介紹
logback SyslogAppender

相關文章
相關標籤/搜索