【问题标题】:Syslog messages show up as "Unknown" when I use Python's logging.handlers.SysLogHandler当我使用 Python 的 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命名不应该足够聪明吗?

【问题讨论】:

    标签: python logging syslog


    【解决方案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)
    

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

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多