聲明:本文僅限于簡(jiǎn)書發(fā)布乐横,其他第三方網(wǎng)站均為盜版今野,原文地址:Python syslog 淺談
最近在寫一些命令行守護(hù)程序葡公,類似于 Linux 下的一些常運(yùn)行的程序,除了用到一些常見的IO 以及進(jìn)程間通信的內(nèi)容之外条霜,還嘗試了一下 Unix 系列的 syslog催什,在嘗試過程中,發(fā)現(xiàn) Python 已經(jīng)在 logging 模塊中很方便得集成了 syslog 的功能宰睡,很是方便蒲凶;但同時(shí)气筋,Python 的內(nèi)置庫(kù)中也提供了 syslog 的支持,所以旋圆,我就對(duì)這兩種方式都進(jìn)行一個(gè)介紹和總結(jié)宠默。
syslog
開始之前想說說什么是 syslog灵巧,在 Linux 中搀矫,有很多后臺(tái)程序都是以后臺(tái)進(jìn)程的形式存在運(yùn)行,例如 crontab/sshd/nginx 等刻肄,有些是系統(tǒng)的瓤球,有些是我們自己添加的,但是敏弃,他們都有一些相同的特點(diǎn):
我們不能直接從標(biāo)準(zhǔn)輸入給他們輸入卦羡,也不能直接從標(biāo)準(zhǔn)輸出獲得他們的輸出
他們通常在固定的位置有日志可以查看,這個(gè)位置通常在/var/log
... ...
對(duì)于其中的第 2 個(gè)特點(diǎn)麦到,大部分 Linux 后臺(tái)進(jìn)程都通過 syslog 來實(shí)現(xiàn)绿饵。因?yàn)榉?wù)器中很多進(jìn)程的調(diào)試和維護(hù)都需要一個(gè)穩(wěn)定專業(yè)的日志系統(tǒng),因此隅要,Linux 提供了一個(gè)守護(hù)進(jìn)程專門用來處理系統(tǒng)日志蝴罪,而這個(gè)守護(hù)進(jìn)程就是 syslogd,不過步清,現(xiàn)在的系統(tǒng)大都使用rsyslod(syslog 升級(jí)版) 代替。例如以下是我在一臺(tái) Ubuntu16 的機(jī)器上的 syslogd 進(jìn)程:
有一點(diǎn)值得一提的是虏肾,無論是內(nèi)核還是用戶態(tài)廓啊,都可以使用 syslog,只不過他們的路徑不一樣
用戶態(tài):我們調(diào)用 syslog 生成日子封豪,然后這個(gè)函數(shù)將日志輸出到一個(gè) UNIX域套接字類型的文件/dev/log中谴轮,然后 rsyslogd 監(jiān)聽這個(gè)文件來獲取日志
內(nèi)核態(tài)[2]:內(nèi)核日志通過調(diào)用 printk 等函數(shù)打印到內(nèi)核的環(huán)狀緩存中,然后這個(gè)緩存的內(nèi)容和文件/proc/kmsg是直接映射的吹埠,所以 rsyslogd 就可以直接讀取這個(gè)文件獲得日志了
syslog 日志的位置
rsyslogd 在接收到日志之后第步,需要將日志輸出到特定的日志文件中,默認(rèn)情況下
調(diào)試信息會(huì)保存到/var/log/debug文件中
普通信息會(huì)保存到/var/log/messages文件中
內(nèi)核消息會(huì)保存到/var/log/kern.log文件中
但是這些都是可以改變的缘琅,在我的系統(tǒng)中粘都,配置文件的位置是/etc/rsyslog.conf,因?yàn)槲覜]準(zhǔn)備修改這些配置刷袍,所以就沒有研究配置信息翩隧,有需要可以參考資料[3]。
內(nèi)置 syslog 庫(kù)
在 Python 中呻纹,直接就有內(nèi)置的函數(shù)庫(kù)可以使用 syslog堆生,一段很簡(jiǎn)單的代碼如下:
就可以在/var/log/syslog中看到這個(gè)內(nèi)容了:
我們還可以加上日志級(jí)別:
然而专缠,我們會(huì)發(fā)現(xiàn),這些日志有些簡(jiǎn)單淑仆,例如我們不知道是哪個(gè)進(jìn)程打出來的涝婉,這個(gè)時(shí)候,還有一個(gè)函數(shù)值得我們一試蔗怠,那就是openlog
然后再看看我們的日志輸出:
可以看到嘁圈,這些設(shè)置都不是那么好用,畢竟是比較底層的接口蟀淮,所以我們來嘗試一下高層一點(diǎn)的最住。
與 logging 模塊結(jié)合
我們查閱一下 Python 文檔中的 logging 模塊的文檔,可以發(fā)現(xiàn)又一個(gè) handler 叫做:SysLogHandler怠惶,看一下參數(shù)涨缚,并不比 syslog 的原始函數(shù)簡(jiǎn)單,但是策治,我們可以忽略所有這些參數(shù)脓魏,而簡(jiǎn)單得控制日志輸出:
classlogging.handlers.SysLogHandler(address=(‘localhost’, SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)
address: 前面說了 rsyslog 是一個(gè)套接字,這里可以制定套接字的地址通惫,注意:這個(gè)可以是不在同一臺(tái)機(jī)器
facility:這個(gè)參數(shù)的作用是告訴 rsyslog 日志的類型茂翔,從而可以讓他根據(jù)不同的類型執(zhí)行不同的操作
socktype:這個(gè)不用多解釋了
所以使用的話就和其他的 Handler 一致,簡(jiǎn)單得記一下:
這里的 address 用的是/dev/log履腋,因?yàn)槲也榭戳艘幌挛覚C(jī)器上是沒有開放 514 端口的珊燎,查了一下資料[5]發(fā)現(xiàn):/dev/log是一個(gè) Unix 套接字,而我機(jī)器上并不開放所有機(jī)器可用的日志服務(wù)遵湖,所以使用/dev/log就好了悔政。
作者:liuliqiang
鏈接:http://www.reibang.com/p/abb6148c15b4
來源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處延旧。