我在 Python 设置中有一个基本的记录器处理程序来记录到文件。我希望此日志处理程序记录通常会打印到控制台的任何/所有标准输出或标准错误消息,但我不想重定向或捕获它。换句话说,我仍然希望以通常的方式打印所有内容。
这里的用例是我不想用
try:
do_something_that_could_raise_exception()
except Exception as e:
logger.exception(e)
相反,我只想让应用程序运行,并能够查看日志文件以查看遇到的任何错误的堆栈跟踪。我只希望所有 stdout/stderr 消息也出现在我的日志文件中。
这似乎是一个在 SO 上被多次询问的主题的转折。我已经阅读了Logging Python stdout to File... with active stdout (backspacing/updating) , Redirect stdout to a file in Python? ,以及许多其他人,但这些似乎并没有解决我的情况。我见过的所有问题都在谈论如何使用多个处理程序同时打印到日志和标准输出,或者如何将标准输出重定向到日志以便终端中不显示任何内容。
编辑
为后代编辑。经过更多搜索后,我发现https://code.tutsplus.com/tutorials/professional-error-handling-with-python--cms-25950,它演示了如何添加一个函数装饰器,将异常定向到给定的日志处理程序. 这并不像我希望的那样简洁(因为我仍然必须将函数装饰器添加到我的所有函数定义中),但它比将我的所有函数调用包装在 try-except 中要简洁得多。
def log_error(logger)
def decorated(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception as e:
if logger:
logger.exception(e)
raise
return wrapped
return decorated
Here is how to use it:
01
02
03
04
05
06
07
08
09
10
11
import logging
logger = logging.getLogger()
@log_error(logger)
def f():
raise Exception('I am exceptional')
千巷猫影
相关分类