如何使用 Python 在日志文件中复制/捕获标准输出

我在 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')


倚天杖
浏览 115回答 1
1回答

千巷猫影

由于您似乎只对可以使用的异常sys.excepthook而不是包装器感兴趣,如下所述:Logging uncaught exceptions in Python这样,它只需要定义一次,并且在定义新函数时不会忘记它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python