当我使用Python的logging.handlers.SysLogHandler时,Syslog消息显示为“未知”

时间:2011-10-19 02:10:06

标签: python logging syslog

当我在我的Mac上运行时:

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?")

它在syslog中显示如下:

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

为什么不知道?在剧本的名称之后,它不应该足够聪明吗?

3 个答案:

答案 0 :(得分:15)

我认为APP-NAME(表示源)是syslog标头中的可选组件。最新版本的SysLogHandler(适用于Python 3.3)包括对APP-NAME的支持(根据C syslog API称为ident),但在早期版本中不可用。请参阅this Python issue

如果您将脚本名称添加到所有邮件中,您将获得所需的效果。例如,

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

将显示例如。

  

19/10/2011 13:51:17 foo [2147483647]怎么了?

在日志中。

答案 1 :(得分:6)

要获得所需内容,您应该向处理程序添加格式化程序,这样您就不必自己手动格式化每条消息。

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?")

您现在应该发现您在syslog中看到了您期望的条目:

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

答案 2 :(得分:3)

可以在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)

这很简单,我在项目中使用此方法作为全局日志包。