2011-10-19 41 views
10

當我運行這個在我的Mac:Syslog消息顯示爲 「未知」 時,我使用Python的logging.handlers.SysLogHandler

import logging.handlers 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

syslog_address = '/var/run/syslog' 
logger.addHandler(logging.handlers.SysLogHandler(syslog_address)) 
logger.error("What the crap?") 

它顯示了這樣的系統日誌:

Oct 18 19:02:06 nick Unknown[4294967295] <Error>: What the crap? 

爲什麼它是未知的?在劇本的名稱之後,它應該足夠聰明嗎?

回答

5

爲了得到你所需要的,你應該在處理程序中添加一個格式化程序,這樣你就不必親自手動格式化每條消息。

import logging.handlers 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

syslog_address = '/var/run/syslog' 

handler = logging.handlers.SysLogHandler(syslog_address) 
# create the formatter 
formatter = logging.Formatter('%(name)s: [%(levelname)s] %(message)s') 
# plug this formatter into your handler(s) 
handler.setFormatter(formatter) 

logger.addHandler(handler) 
logger.error("What the crap?") 

您現在應該發現,你看到在系統日誌條目如你所期望:

Jul 4 14:34:40 ip-127-0-0-1 script_name.py: [ERROR] What the crap? 
+2

似乎處理程序的API在某些版本的Python中有所不同。我不得不做以下處理我們的2個環境: 嘗試: handler.addFormatter(格式化) 除AttributeError的,E: handler.formatter =格式化 – Splee

15

我認爲APP-NAME(表示源代碼)是syslog頭文件中的一個可選組件。最新版本的SysLogHandler(用於Python 3.3)包括對APP-NAME(根據C系統日誌API稱爲ident)的支持,但在早期版本中不可用。請參閱this Python issue

如果您將腳本名稱添加到所有郵件中,您將獲得所需的效果。例如,

logger.error('foo: What\'s up?') 

將顯示例如,

19/10/2011 13:51:17 foo [2147483647]這是怎麼回事?

在日誌中。

+0

根據python的問題,你可以將屬性'handler.ident'設置爲一個字符串,它會自動添加到所有的消息。 – Hubro

+0

@Hubro真的,這是日誌代碼的後來增加 - 它被添加爲鏈接問題的結果。此解決方案適用於較舊的Python版本。 –

+0

更正經過測試後,僅僅給'handler.ident'這個值'「app_name」'是不夠的,因爲它只是將它預先設置爲原樣,並且最終得到一個像「'app_name這樣的測試」的日誌行。 '。你必須手動包含':「''。 – Hubro

2

可以發現哪個詞相匹配,你可以在this link

在列表中找到什麼都列表

如果你需要更多的,你可以看看另一個例子:

from logging.handlers import SysLogHandler 
import logging 

def log(self, severity=logging.DEBUG, message=None): 
    """ 
    Log utility for system wide logging needs 
    @param severity Log severity 
    @param message Log message 
    @return 
    """ 
    logger = logging.getLogger() 
    logger.setLevel(severity) 
    syslog = SysLogHandler(address="/dev/log") 
    syslog.setFormatter(
      logging.Formatter("%(module)s-%(processName)s[%(process)d]: %(name)s: %(message)s") 
    ) 
    logger.addHandler(syslog) 
    logger.log(severity, message) 

這很簡單,我在項目中使用這種方法作爲全局日誌記錄包。