我在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
答案 0 :(得分:1)
这里的关键是你在eventlet.greenpool.DEBUG
启用时会发生的事情(默认情况下)。它打印了未捕获异常的回溯。你应该把它包裹在try / except中。如果没有安全保护调试print_exc,您就会遇到丢失的错误。忘记错误是不好的。
正如您在代码中指出的那样,它使用traceback.print_exc()
,因此可以将问题重写为没有Eventlet到#34;如何将traceback.print_exc重定向到日志记录"。甚至"如何将sys.stderr重定向到日志记录"。您可以找到更好的解决方案。
除了重定向,您的选择:
GreenPool.spawn()
,它会在获取结果的线程中重新引用异常(通常以pool.waitall()
的形式)