为什么python不记录syslog的异常(但是呢,它呢?)

时间:2015-05-07 15:29:01

标签: python logging syslog rsyslog

Python 2.x documentationemit()函数的SysLogHandler说:

  

记录已格式化,然后发送到syslog服务器。如果   异常信息存在,不会发送到服务器。

...为什么? source并非tell。我错过了什么吗?

但是,当我尝试以下代码时:

import logging
from logging.handlers import SysLogHandler

rootlogger = logging.getLogger()
rootlogger.setLevel(logging.DEBUG)
syslogh = SysLogHandler('/dev/log')
rootlogger.addHandler(syslogh)
# to see what's happening too
consoleh = logging.StreamHandler()
rootlogger.addHandler(consoleh)

# this appears in the log
rootlogger.info('foobar')
try:
    a = 42
    a / 0
except ZeroDivisionError as e:
    rootlogger.exception('myException!: {}'.format(e))

它会将以下内容写入syslog:

  

5月7日16:25:59 localhost foobar
  5月7日16:25:54 localhost myException!:整数除法或模数   零#012Traceback(最近一次调用最后一次):#012文件“syslogonly.py”,   第16行,#012 a / 0#012ZeroDivisionError:整数   划分或模数为零

我在Debian wheezy系统上使用rsyslog 8.4.2。

另外,我知道多线有问题,但是这有关系吗?

1 个答案:

答案 0 :(得分:1)

您没有致电Logger.emit()。您正在调用Logger.exception(),根据documentation,始终会在邮件中添加例外信息:

  

在此记录器上记录级别为ERROR的消息。参数被解释为debug(),除了没有检查任何传递的exc_info。始终将异常信息添加到日志记录消息中。只应从异常处理程序调用此方法。

我没有深入了解源代码以确定调用emit()以及在什么情况下调用。