一、說明
1.1 背景說明
syslog這個東西,最早接觸是在Z公司做基線安全加固的時候有啟用遠程日志服務器一項,然后當時還寫整理了一篇“rsyslog+loganalyzer遠程日志系統搭建教程(CentOS6.8)”;這造成的結果就是一直先入為主地認為syslog就是做遠程日志用的,近段時間碰到比較多syslog的問題,多加了解后發現這是一個比較大的誤解。
去O公司面試的時候,被問syslog的進程叫什么配置文件在哪里,然后答守護進程是syslogd配置文件應該在/etc目錄下具體名字不記得了。
過后問之前Z公司做系統集成的同事,他的回答也和我一樣,然后說我應當當場反懟面試官syslog還可以做遠程日志他知道嗎。我當時的反應是,懟不動啊兄弟,syslog難道不是本來就是接收遠程日志用的嗎,似乎我的理解有點錯誤啊。
回頭再問領導,他的回答也和我一樣,然后他問你知道哪些日志過syslog哪些日志不過syslog嗎。我不知道,但到此我基本知道syslog確實是先處理本地日志用的。
前段時間去T公司面試,又被問系統日志一般在/var/log目錄下如果想要改變日志格式該如何操作,綜合之前的認識答我沒這么配置過但我推測應該是通過syslog配置文件/etc/syslog.conf。
1.2 syslog用途說明
在Z公司的時候知道了syslog,另外還知道dmsg,當時只是按部就搬看磁盤網卡等硬件問題時就用dmsg看;直到領導說內核態的日志運dmsg用戶態日志過syslog(原話應該不是這樣),才意識到有這么個區分關系。
現在感覺應該這么理解,syslog是一個用戶態的進程,如果硬件和內核都沒就緒那肯定就沒到用戶態進程啟動這一步,那日志想過syslog也是不可能的,這時日志就發往dmsg;syslog就緒后內核的日志也可以過syslog。
syslog是一個可以記錄日志的服務進程,在確認這一事實后還有兩個疑問,“過syslog”到底是什么意思為什么日志一定要過syslog?如果我想自己的打印的日志“過syslog”應當怎么操作?
我們平時打印日志一般都是使用print或者logging打印,而對於一個系統會有成百上千個應用,如果每個應用都自己print或logging一是說工作重復二是說格式很難統一三是說日志配置散落在各地很難管理,此時我們何不專門啟動一個服務專門管理日志,其他進程只管把日志發給他他來專門記錄呢?這正是syslog的設計來由。回到為什么日志一定要過syslog這個問題上來,日志在技術上確實不一定要過syslog,這只是linux系統開發者的約定俗成。(nginx等應用開發者也跟着使用syslog)
至於怎么使用syslog,簡單而言就是先使用openlog()打開通道,然后使用syslog()發出日志,最后使用closelog()關閉通道。我們后邊再以python具體演示。
1.3 syslog配置及日志格式說明
syslog基本已被rsyslog代替,相應的配置文件也就改成了/etc/rsyslog.conf。Ubuntu 16.04版本內容如下:

# /etc/rsyslog.conf Configuration file for rsyslog. # # For more information see # /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html # # Default logging rules can be found in /etc/rsyslog.d/50-default.conf ################# #### MODULES #### ################# module(load="imuxsock") # provides support for local system logging module(load="imklog") # provides kernel logging support #module(load="immark") # provides --MARK-- message capability # provides UDP syslog reception #module(load="imudp") #input(type="imudp" port="514") # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514") # Enable non-kernel facility klog messages $KLogPermitNonKernelFacility on ########################### #### GLOBAL DIRECTIVES #### ########################### # # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # Filter duplicated messages $RepeatedMsgReduction on # # Set the default permissions for all log files. # $FileOwner syslog $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 $PrivDropToUser syslog $PrivDropToGroup syslog # # Where to place spool and state files # $WorkDirectory /var/spool/rsyslog # # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf
基本都是一些公共能力的配置,所各項名字及說名大概也能知道其意思,最主要的還是在最后包含了/etc/rsyslog.d/目錄下的.conf文件
/etc/rsyslog.d/目錄下有20-ufw.conf和50-default.conf兩個文件;首先20和50這個應該是和/etc/security/limits.conf.d一樣開頭數值小的先被加載大的后被加載,后被加載的可覆蓋之前加載的;然后20-ufw.conf是針對內核生成的防火牆日志的配置文件,我不懂為什么單獨出來,這里主要講50-default.conf的格式,50-default.conf在Ubuntu 16.04版本默認內容如下:

# Default rules for rsyslog. # # For more information see rsyslog.conf(5) and /etc/rsyslog.conf # # First some standard log files. Log by facility. # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log #lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log #user.* -/var/log/user.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # #mail.info -/var/log/mail.info #mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # # Logging for INN news system. # news.crit /var/log/news/news.crit news.err /var/log/news/news.err news.notice -/var/log/news/news.notice # # Some "catch-all" log files. # #*.=debug;\ # auth,authpriv.none;\ # news.none;mail.none -/var/log/debug #*.=info;*.=notice;*.=warn;\ # auth,authpriv.none;\ # cron,daemon.none;\ # mail,news.none -/var/log/messages # # Emergencies are sent to everybody logged in. # *.emerg :omusrmsg:* # # I like to have messages displayed on the console, but only on a virtual # console I usually leave idle. # #daemon,mail.*;\ # news.=crit;news.=err;news.=notice;\ # *.=debug;*.=info;\ # *.=notice;*.=warn /dev/tty8 # The named pipe /dev/xconsole is for the `xconsole' utility. To use it, # you must invoke `xconsole' with the `-file' option: # # $ xconsole -file /dev/xconsole [...] # # NOTE: adjust the list below, or you'll go crazy if you have a reasonably # busy site.. # daemon.*;mail.*;\ news.err;\ *.=debug;*.=info;\ *.=notice;*.=warn |/dev/xconsole
其實歸結起來就如下一條配置格式:
facility[,facility].priority_level[;facility[,facility].priority_level] [-]log_file_path
[]----表示可選
facility----生成日志的設備(服務)。包括LOG_AUTH、LOG_AUTHPRIV、LOG_CRON、LOG_DAEMON、LOG_FTP、LOG_KERN、LOG_LOCAL0-7、LOG_LPR、LOG_MAIL、LOG_NEWS、LOG_SYSLOG、LOG_USER、LOG_UUCP。我們自己寫程序去調用syslog時,默認以USER身份生成。
priority_level----日志優先級別。由輕到重依次包括LOG_DEBUG、LOG_INFO、LOG_NOTICE、LOG_WARNING、LOG_ERR、LOG_CRIT、LOG_ALERT、LOG_EMERG。我們寫程序未指定時默認是INFO
log_file_path----前邊指定的日志及日志級別要輸出到的日志文件的路徑。
更多說明參見man syslog。
二、python3使用syslog代碼實現
我們前面說使用syslog,總的流程就是先使用openlog()打開通道,然后使用syslog()發出日志,最后使用closelog()關閉通道。
這三個函數在python中的定義如下:
# ident----不太懂 # logoption----日期和日志內容之間要要多打印的信息 # logoption----可為LOG_PID, LOG_CONS, LOG_NDELAY,LOG_ODELAY, LOG_NOWAIT, LOG_PERROR # facility----聲稱自己是何種設備 openlog([ident[, logoption[, facility]]]) # priority----日志優先級;默認是LOG_INFO # message----要輸出的日志信息 syslog([priority,] message) # 關閉 closelog()
在python中你並不需要調用openlog()和closelog()去打開和關閉syslog通道,直接使用syslog()發送日志即可;但使用openlog則可指定多打印的信息及另聲稱自己是何種設備:
import syslog # 以默認的LOG_INFO級別,直接發送日志信息 # 最終輸出到哪個文件,要看配置了user.info配置輸出到哪個文件 syslog.syslog('info, send syslog directly') # 以LOG_WARNING級別,直接發送日志信息 # 最終輸出到哪個文件,要看配置了user.warning配置輸出到哪個文件 # 注意syslog.LOG_WARNNING中的syslog,是python的syslog模塊,而不是Linux中的syslog設備 syslog.syslog(syslog.LOG_WARNING, 'warnning,send syslog directly') # 使用openlog,則可指定多打印的信息及另聲稱自己是何種設備 syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_MAIL) # 最終輸出到哪個文件,要看emil.info配置輸出到了哪個文件 syslog.syslog('send syslog support by openlog')
從1.3小節的50-default.conf默認配置可以看到,*.*都會被發送到/var/log/syslog,user設備是沒有指定專門的日志文件,mail.*則被發送到/var/log/mail.log。
所以運行以上代碼的期望結果是:三次日志打印都被發送到/var/log/syslog,另外對於最后的一次打印還會發送到/var/log/mail.log。結果也正是如此,如下:
參考: