使用Python的logging.handlers.SysLogHandler发送的Syslog消息显示为“Unknown”

12

当我在我的 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?")
它在系统日志中显示为这样:
Oct 18 19:02:06 nick Unknown[4294967295] <Error>: What the crap?

为什么是未知的?它不应该聪明到以脚本名称命名自己吗?

3个回答

15

我认为在syslog头中,指示来源的APP-NAME是可选组件。最新版本的SysLogHandler(适用于Python 3.3)支持一个APP-NAME(根据C syslog API称为ident),但早期版本不支持。请参见此Python问题

如果您将脚本名称添加到所有消息之前,则可以获得所需的效果。例如:

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

日志中将显示:

19/10/2011 13:51:17 foo[2147483647] What's up?


根据Python问题,您可以将属性handler.ident设置为字符串,它将自动添加到所有消息的前面。 - Hubro
@Hubro 确实,这是日志记录代码的后期添加 - 它是由于相关问题而添加的。此解决方案适用于较旧版本的Python。 - Vinay Sajip
测试后更正,仅仅将 handler.ident 赋值为 "app_name" 是不够的,因为它只会按原样加在前面,导致日志行变成类似 "app_nameThis is a test" 的形式。你必须手动包含 ": " - Hubro

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

现在您应该能够按照预期在系统日志中看到条目:
Jul  4 14:34:40 ip-127-0-0-1 script_name.py: [ERROR] What the crap?

2
似乎 Python 的某些版本之间处理程序的 API 有所不同。我只需要执行以下操作来处理我们的两个环境:try: handler.addFormatter(formatter) except AttributeError, e: handler.formatter = formatter - Splee

3

您可以在此链接找到匹配列表中所有单词的内容。

如果需要更多示例,可以进一步查看:

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)

这个方法非常简单,我在我的项目中将其作为全局日志记录包使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接