2017-08-31 56 views
0

使用syslog.openlog,我們可以設置一些日誌選項,如LOG_NDELAY,LOG_NOWAIT,它們在<syslog.h>中定義。我正在尋找在logging.handlers.SysLogHander上設置這種日誌選項的方法。在Python中設置`LOG_ *`選項`logging.handlers.SysLogHander`

我發現LOG_CONSLOG_PERROR可以實現額外的logging.handersLOG_NDELAY已被設置,因爲連接在處理程序實例化時打開。我不在乎LOG_NOWAIT,因爲主要是我用的是Linux。

那麼,我該如何設置LOG_ODELAYLOG_PID

回答

1

看着the source for syslog.openlog,它直接將選項整數傳遞給openlog(3)

潛水更深,glibc的openlog調用openlog_internal,它只是將其設置爲全球LogStat

那麼,讓我們來看看你在openlog(3)文檔需要標誌:

LOG_ODELAY:LOG_NDELAY的逆;連接的打開被延遲,直到syslog()被調用。 (這是默認的,並且無需指定。)

這似乎只有相關的,如果你首先使用openlog(),這SysLogHandler不做;它只是connects to the syslog over UDP

你可以實現自己的SyslogFormatter,這確實使用syslog.openlog()syslog.syslog()並通過所有標誌你的心臟的慾望 - 在STDLIB不這樣做的原因,我想,就在於它的不可移植,爲syslog模塊可能不可用於例如視窗。

LOG_PID:在每條消息中包含PID。

這在glibc here中實施。

if (LogStat & LOG_PID) 
    fprintf (f, "[%d]", (int) __getpid()); 

這很容易實現,因爲logging already logs process IDs by defaultexposes it to formatters

所以只需將格式化字符串設定爲

"[%(process)s] %(levelname)s:%(name)s:%(message)s" 

,而不是默認

"%(levelname)s:%(name)s:%(message)s" 
+0

我結束了'os.getpid()','可是%(過程)s'是多少更好。謝謝! – soundlake