syslog這個東西,最先接觸是在Z公司作基線安全加固的時候有啓用遠程日誌服務器一項,而後當時還寫整理了一篇「rsyslog+loganalyzer遠程日誌系統搭建教程(CentOS6.8)」;這形成的結果就是一直先入爲主地認爲syslog就是作遠程日誌用的,近段時間碰到比較多syslog的問題,多加了解後發現這是一個比較大的誤解。html
去O公司面試的時候,被問syslog的進程叫什麼配置文件在哪裏,而後答守護進程是syslogd配置文件應該在/etc目錄下具體名字不記得了。python
事後問以前Z公司作系統集成的同事,他的回答也和我同樣,而後說我應當當場反懟面試官syslog還能夠作遠程日誌他知道嗎。我當時的反應是,懟不動啊兄弟,syslog難道不是原本就是接收遠程日誌用的嗎,彷佛個人理解有點錯誤啊。linux
回頭再問領導,他的回答也和我同樣,而後他問你知道哪些日誌過syslog哪些日誌不過syslog嗎。我不知道,但到此我基本知道syslog確實是先處理本地日誌用的。nginx
前段時間去T公司面試,又被問系統日誌通常在/var/log目錄下若是想要改變日誌格式該如何操做,綜合以前的認識答我沒這麼配置過但我推測應該是經過syslog配置文件/etc/syslog.conf。面試
在Z公司的時候知道了syslog,另外還知道dmsg,當時只是按部就搬看磁盤網卡等硬件問題時就用dmsg看;直到領導說內核態的日誌運dmsg用戶態日誌過syslog(原話應該不是這樣),才意識到有這麼個區分關係。安全
如今感受應該這麼理解,syslog是一個用戶態的進程,若是硬件和內核都沒就緒那確定就沒到用戶態進程啓動這一步,那日誌想過syslog也是不可能的,這時日誌就發往dmsg;syslog就緒後內核的日誌也能夠過syslog。服務器
syslog是一個能夠記錄日誌的服務進程,在確認這一事實後還有兩個疑問,「過syslog」究竟是什麼意思爲何日誌必定要過syslog?若是我想本身的打印的日誌「過syslog」應當怎麼操做?tcp
咱們平時打印日誌通常都是使用print或者logging打印,而對於一個系統會有成百上千個應用,若是每一個應用都本身print或logging一是說工做重複二是說格式很難統一三是說日誌配置散落在各地很難管理,此時咱們何不專門啓動一個服務專門管理日誌,其餘進程只管把日誌發給他他來專門記錄呢?這正是syslog的設計來由。回到爲何日誌必定要過syslog這個問題上來,日誌在技術上確實不必定要過syslog,這只是linux系統開發者的約定俗成。(nginx等應用開發者也跟着使用syslog)ide
至於怎麼使用syslog,簡單而言就是先使用openlog()打開通道,而後使用syslog()發出日誌,最後使用closelog()關閉通道。咱們後邊再以python具體演示。函數
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-七、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。
咱們前面說使用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。結果也正是如此,以下:
參考: