目錄html
有一個4臺機器的分佈式服務,很少很多,上每臺機器上查看日誌比較麻煩,用Flume,Logstash、ElasticSearch、Kibana等分佈式日誌管理系統又顯得大材小用,因此想到了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
$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
$ModLoad imtcp.so
),在本文中的配置都比較簡單,就採用了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
ModLoad imudp.so
配置加載UDP傳輸模塊selector也由兩部分組成,設施和優先級,由點號.
分隔。第一部分爲消息源或稱爲日誌設施,第二部分爲日誌級別。多個選擇器用;
分隔,如:*.info;mail.none
。數據庫
日誌設施有:vim
日誌級別有(升序):
日誌設施的配置:
.
表明比後面還要高的消息等級都會記錄下來.=
表明只有後面的這個消息等級會被記錄下來.!
表明除了後面的這個消息等級,其餘的都會被記錄下來,我在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是規則描述的一部分,位於選擇器的後面,規則用於處理消息。總的來講,消息內容被寫到一種日誌文件上,但也能夠執行其餘動做,好比寫到數據庫表中或轉發到其餘主機。
在前面的實例中的是寫到本地文件中的:
# 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)指定日誌文件。 文件路徑既能夠是靜態文件也能夠是動態文件。動態文件由模板前加 ? 定義。cron.* ~ 丟棄全部信息,即該配置以後的動做不會看到該日誌。 隨 rsyslog 版本不一樣,若是有以下警告信息,則將 ~ 修改成 stop。
模板容許你指定日誌信息的格式,也可用於生成動態文件名,或在規則中使用。其定義以下所示,其中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
是指接收到消息時的時間戳。
輸出頻道爲用戶可能想要的輸出類型提供了保護,在規則中使用前要先定義.其定義以下所示,其中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"
隨着日誌文件愈來愈大,這不只會帶來性能問題,同時對日誌的管理也很是棘手。 當一個日誌文件被rotated,會建立一個新的日誌文件,同時舊的日誌文件會被重命名。這些文件在一段時間內被保留,一旦產生必定數量的舊的日誌,系統就會刪除一部分舊的日誌。
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份舊的日誌。
咱們能夠經過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