logging.raiseExceptions = True 不会重新引发异常

bls*_*sqr 2 python logging python-3.x

我试图在我的代码中具有以下功能:

  • 在不中断程序流程的情况下记录信息和错误消息以及控制台和/或文件的异常(即吞下异常,某种运行模式
  • 通过设置标志进入开发模式,在那里引发异常develop = True

目前,我正在使用 Python3logging模块,它(根据this)应该具有内置的功能。标志是logging.raiseExceptions = True

但是,我没有让它在 MWE 中工作:无论我的标志设置是什么,我抛出的异常都不会重新引发。

# mwe.py
import logging
import logging.config

if __name__ == '__main__':
    # Configure logging and set flag to raise exceptions
    logging.config.fileConfig('log.conf')
    logging.raiseExceptions = True

    logger = logging.getLogger('root')

    logger.info('Started')

    # Test whether exceptions get raised
    try:
        raise RuntimeError("Ooops.")
    except RuntimeError:
        try:
            logger.exception('There was an oops.')
            # which is the same as logger.error('...', exc_info=True)
        except:
            print("GOTCHA! Exception was re-raised.")

    logger.info('Finished')
Run Code Online (Sandbox Code Playgroud)

对应的配置文件

# log.conf
[loggers]
keys=root

[handlers]
keys=consoleHandler

[formatters]
keys=consoleFormatter

[logger_root]
handlers=consoleHandler
level=DEBUG

[handler_consoleHandler]
class=logging.StreamHandler
formatter=consoleFormatter
args=(sys.stdout,)

[formatter_consoleFormatter]
format=%(filename)s (%(lineno)d) %(levelname)-8s - %(message)s
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出

mwe.py (12) INFO     - Started
mwe.py (19) ERROR    - There was an oops.
Traceback (most recent call last):
  File "mwe.py", line 16, in <module>
    raise RuntimeError("Ooops.")
RuntimeError: Ooops.
mwe.py (24) INFO     - Finished
Run Code Online (Sandbox Code Playgroud)

为什么我没有进入该GOTCHA部分,尽管默认值为raiseExceptionsisTrue并且另外我也将其设置为True?我的配置有什么问题?
或者我对logging用于此目的的使用有什么大的误解?

(小问题:有没有办法raiseExceptionlog.conf文件中配置标志?)

Elm*_*lmo 7

你理解错了。这不会重新引发任何自定义异常。这是为了更改日志模块的默认行为,该模块正在吞下内部日志记录异常,即错误配置的记录器试图写入没有写入权限的文件。这将失败默默默认设置,并logging.raiseException = True会造成错误配置记录仪或任何其他问题记录模块,以提高你将不得不处理异常。

现在到了你想要达到的目的。在不抑制异常(让它传播)的情况下记录异常回溯是默认行为。如果未配置日志记录,则回溯将转到 stderr。如果配置了日志记录,日志处理程序会将其写入所需的位置。
所以基本上为了实现你的目标,你根本不应该处理异常。但是,如果您知道如何处理异常(意味着您知道导致异常的原因),那么通常您不需要记录回溯。
如果你坚持你仍然可以logger.exception(...)在你的except RuntimeError子句中使用并用 pure 重新引发异常raise

try:
    raise RuntimeError("Ooops.")
except RuntimeError:
    logger.exception('There was an oops.')
    raise
Run Code Online (Sandbox Code Playgroud)