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

Posted

技术标签:

【中文标题】当我使用 Python 的 logging.handlers.SysLogHandler 时,系统日志消息显示为“未知”【英文标题】:Syslog messages show up as "Unknown" when I use Python's logging.handlers.SysLogHandler 【发布时间】:2011-10-19 02:10:06 【问题描述】:

当我在我的 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?

为什么它是未知的?以脚本的name命名不应该足够聪明吗?

【问题讨论】:

【参考方案1】:

我认为 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] 怎么了?

在日志中。

【讨论】:

根据python问题,您可以将属性handler.ident设置为字符串,它将自动添加到所有消息中。 @Hubro 是的,这是后来添加到日志代码的 - 它是由于链接问题而添加的。此解决方案适用于较旧的 Python 版本。 测试后更正,仅仅给handler.ident"app_name" 是不够的,因为它会按原样添加它,最后你会得到一个像"app_nameThis is a test" 这样的日志行。您必须手动添加": "【参考方案2】:

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

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?

【讨论】:

在某些版本的 Python 中,处理程序的 API 似乎有所不同。我只需要执行以下操作来处理我们的 2 个环境:try: handler.addFormatter(formatter) except AttributeError, e: handler.formatter = formatter【参考方案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)

这很简单,我在我的项目中将此方法用作全局日志记录包。

【讨论】:

以上是关于当我使用 Python 的 logging.handlers.SysLogHandler 时,系统日志消息显示为“未知”的主要内容,如果未能解决你的问题,请参考以下文章

当我使用Process.Start运行python程序时,我的python程序中的日志不起作用?

当我仅使用脚本名称在 Windows 上运行 Python 脚本时无法重定向输出

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

Python:当我导入 RandomForestClassifier 时出现“TypeError:无法使用块值操作”

当我使用 matplotlib.pyplot 时,python 3.6 中没有名为 PyQt4 的模块

当我需要在 python 编程中使用@staticmethod 和@classmethod 时? [复制]