如何将traceback.print_exc重定向到日志记录

时间:2018-03-24 04:25:38

标签: python debugging logging exception-handling eventlet

我在Python中使用eventlet来生成一些线程。我正在使用eventlet.spawn_n()。我可以从这里的实现中看到,如果你运行的方法抛出异常,它会打印一个堆栈跟踪:https://github.com/eventlet/eventlet/blob/79292bd16a6a1384d8c3d11bcefa40eb53bbeae4/eventlet/greenpool.py#L93

此堆栈跟踪将转至stderr。但是我的程序中其他所有内容的日志记录都使用WatchedFileHandler转到文件。这会导致堆栈跟踪不显示在日志文件中,其中发生了我的应用程序的其余日志记录,这导致了一些问题。

有没有办法让eventlet的堆栈跟踪打印到我的应用程序其余部分记录到的同一文件,而不是打印到stderr?

以下是我目前使用的日志配置:

[loggers]
keys = root

[handlers]
keys = watchedfile

[formatters]
keys = default

[logger_root]
level = INFO
handlers = watchedfile

[handler_watchedfile]
class = handlers.WatchedFileHandler
args = ('my_log.txt',)
formatter = default

[formatter_default]
format = %(asctime)s %(levelname)s [%(name)s] %(pathname)s:%(funcName)s:%(lineno)s %(message)s

1 个答案:

答案 0 :(得分:1)

这里的关键是你在eventlet.greenpool.DEBUG启用时会发生的事情(默认情况下)。它打印了未捕获异常的回溯。你应该把它包裹在try / except中。如果没有安全保护调试print_exc,您就会遇到丢失的错误。忘记错误是不好的。

正如您在代码中指出的那样,它使用traceback.print_exc(),因此可以将问题重写为没有Eventlet到#34;如何将traceback.print_exc重定向到日志记录"。甚至"如何将sys.stderr重定向到日志记录"。您可以找到更好的解决方案。

除了重定向,您的选择:

  • 只需使用GreenPool.spawn(),它会在获取结果的线程中重新引用异常(通常以pool.waitall()的形式)
  • 使用stderr处理程序,使用外部程序(如syslog)写入文件,它解决了比重新打开旋转日志更多的问题
  • 捕获衍生函数中的错误并使用日志记录