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

标签 python debugging logging exception eventlet

我正在使用 eventlet 和 Python 来生成一些线程。我正在使用 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

最佳答案

这里的关键是您观察到启用 eventlet.greenpool.DEBUG 时发生的情况(默认情况下)。它会打印未捕获的异常的回溯。你应该用 try/except 包装的东西。如果没有这种保护措施 debug print_exc,您就会丢失错误。忘记错误是不好的。

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

除了重定向之外,您的选择:

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

关于python - 如何将traceback.print_exc重定向到日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49461205/

相关文章:

python - 如何将 Python 中作为文本导入的数据分离为日期数组和数字数据

python - 如何在python中将azure自定义视觉注释格式更改为yolo v8格式

c++ - 为什么这个删除仍然导致运行时异常即使我在删除后将指针设置为NULL

javascript - 是否可以使用 ie 选项卡 View 在 chrome 上调试 javascript?

java - 如何在我的类中正确实例化 log4j Logger 对象?

python - 将实时数据从服务器(例如 Tornado)推送到客户端的 python Web 框架是什么?

python - 当项目包含时如何对 urls.py 进行单元测试?

Windows 性能分析器缺少 ImageId 事件

apache-spark - 抑制 Apache Spark 日志中的 OutputRedirector 文本

部署时的 GWT 日志文件