我正在使用 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/