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

12 投票
3 回答
5436 浏览
提问于 2025-04-17 04:35

当我在我的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 个回答

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)

这个方法很简单,我在我的项目中把它当作一个全局的日志记录工具来使用。

15

我觉得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] 发生了什么事?

的内容。

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?

撰写回答