你們在寫程序時,都喜歡將過程和輸出結果以log的形式保留下來,供參考。大部分朋友都採起的是open方式打開一個文件句柄方式,將其信息write進去,今天我學習的是採起unix或者類unix提供的一個syslog服務。在咱們的python裏提供了一個syslog的模塊,這個模塊就是爲系統syslog程序提供的一個接口。python
如下我將用通俗的語言和例子來講明下面的函數:ubuntu
syslog.openlog(ident[, logopt[, facility]])ide
這個就是初始化syslog接口的函數,在這裏有一個必須的參數和兩個可選的參數。第一個參數,ident這個就是一個標識字符串,是log裏每一行中程序的名程,如:函數
syslog.openlog("test.py")syslog.syslog("The process is test.py") 學習
tail -n 1 /var/log/messagesspa
Apr 22 16:26:52 databak test.py: The process is test.pyunix
第二個參數,logoptrest
選項名稱:LOG_CONS,LOG_NDELAY,LOG_NOWAIT,LOG_PID,LOG_PERROR你們能夠從中選擇一個,或者多個(要藉助或操做符」|」),如:日誌
Syslog.openlog(「test.py」,syslog.LOG_PID|syslog.LOG_PERROR)orm
Syslog.syslog(「The messages print pid and messages print to stderr」)
>>> syslog.syslog("The messages print pid and messages print to stderr")
test.py[16826]: The messages print pid and messages print to stderr
[root@databak scripts]# tail -n 1 /var/log/messages
Apr 22 16:33:32 databak test.py[16826]: The messages print pid and messages print to stderr
看到沒,它一方面將其直接打印出來,另外一方面將日誌記錄到messages中,而且按要且添加了此進程的pid號注:LOG_PERROR 錯誤除了記錄到syslog機構中,同時還會在stderr打印出來。
第三個參數,facility名稱:LOG_AUTH,LOG_CRON,LOG_DAEMON,LOG_KERN,LOG_LOCALx,LOG_LPR,LOG_MAIL,LOG_NEWS,LOG_USER,LOG_UUCP系統管理員使用這些參數配置信息如何分解到不一樣的文件和服務中。
在前面,咱們一直將信息輸出到messages文件中,此次,咱們要結合syslog.conf的配置來將其輸出到其餘文件了。修改syslog.conf,
添加auth.* /var/log/python.auth
將認證的信息輸出到python.auth中,那麼咱們的程序應該如何寫呢?
Syslog.openlog(「test.py」,syslog.LOG_PID,syslog.LOG_AUTH)Syslog.syslog(「Test Auth!」)
[root@databak scripts]# tail -f /var/log/python.auth
Apr 22 16:43:47 databak test.py[16829]: Test Auth!
[root@databak scripts]# tail -n 1 /var/log/messages
Apr 22 16:43:17 databak test.py[16829]: Test Auth!
看到沒,messages和python.auth這兩個文件裏都有了相關的信息了,怎麼回事呢?我想讓其只輸出到python.auth,不想輸出到messages呀?我想是由於咱們沒有配置syslog的優先權,咱們的syslog.syslog默認的優先權是LOG_INFO,天然咱們將其內容一方面輸出到認證的文件裏,一方面又輸出到messages文件裏了。因此,咱們須要修改下syslog.conf的配置,
*.info;*****;auth.none /var/log/messages
這個函數你們明白了吧?
接下來,咱們看syslog函數在上面的例子中,syslog函數一直伴隨着咱們,我相信你們也看到了一點門道了,如今我仍是把函數公示給你們吧。
syslog.syslog([priority], message)
這裏有兩個參數,一個可選一個必寫。
Message就不用說了,個人例子都有了,只是要說明下可選參數了。
Priority,
名稱:LOG_EMERG,LOG_ALERT,LOG_CRIT,LOG_ERR,LOG_WARNING,LOG_INFO,LOG_DEBUG(默認爲LOG_INFO)
咱們想將認證錯誤的信息寫到python.err文件中,那麼修改syslog.conf(ubuntu下是rsyslog.conf,修改完成後須要重啓sudo /etc/init.d/rsyslog restart)
auth.err /var/log/python.err
看程序:Syslog.openlog(「test.py」,syslog.LOG_PID,syslog.LOG_AUTH)Syslog.syslog(syslog.LOG_ERR,「Add error information to python.err file」)
結果:[root@databak ~]# tail -f /var/log/python.err
Apr 22 17:05:00 databak test.py[16933]: Add error information to python.err file
[root@databak ~]# tail -n 1 /var/log/messages
實驗成功,那麼,我改下優先權看下,看程序:
Syslog.openlog(「test.py」,syslog.LOG_PID,syslog.LOG_AUTH)
Syslog.syslog(syslog.LOG_INFO,「Add info information to python.err file」)
結果:
[root@databak ~]# tail -f /var/log/python.err
[root@databak ~]# tail -n 1 /var/log/messages
兩個文件都沒有,由於你的程序沒有符合任合一個(syslog.conf)的要求,因此信息不會寫到任何一個文件中的。
總結:
Openlog,syslog這兩個函數而且結合syslog.conf的配置,就能定製出一種很好的日誌記錄功能。經過openlog的函數,咱們就能夠將信息分門別類的記錄到何種文件下並採起syslog函數參數即可以將何種服務的級別記錄到何種文件下,前提須要syslog.conf的配合。