【问题标题】:Python logging: display only information from debug levelPython 日志记录:仅显示调试级别的信息
【发布时间】:2013-06-14 12:56:10
【问题描述】:

对于我在 Python (2.7) 中的第一个日志记录实验,我正在创建一个基本的日志记录模块,它将快速创建一个记录器(因此我不必为每个模块/类配置它)。

我要做的是创建一个记录器,在控制台上显示所有信息级别及更高级别的消息,并将所有调试级别信息移动到一个文本文件中。

到目前为止,我已经创建了一个记录器,它将 INFO 打印到控制台,并将每个日志消息打印到一个文本文件。但是,我不希望文本文件中包含所有 INFO 和更高级别的消息。

我创建了一个Python Fiddle 来保存我的代码。

我使用了教程中的以下调试消息:

log.debug('All systems operational')
log.info('Airspeed 300 knots')
log.warn('Low on fuel')
log.error('No fuel. Trying to glide.')
log.critical('Glide attempt failed. About to crash.')

控制台上产生的内容:

[INFO] root: Airspeed 300 knots
[WARNING] root: Low on fuel
[ERROR] root: No fuel. Trying to glide.
[CRITICAL] root: Glide attempt failed. About to crash.

在我的 debug_log.txt 文件中:

2013-06-14 14:51:46,963:DEBUG:root:All systems operational
2013-06-14 14:51:46,964:INFO:root:Airspeed 300 knots
2013-06-14 14:51:46,964:WARNING:root:Low on fuel
2013-06-14 14:51:46,964:ERROR:root:No fuel. Trying to glide.
2013-06-14 14:51:46,964:CRITICAL:root:Glide attempt failed. About to crash.

在上面的块中,后四行不应该在文件中。我正在尝试做的事情是否可行,我将如何获得想要的结果?

【问题讨论】:

    标签: logging python-2.7


    【解决方案1】:

    您必须创建自己的handler object

    来自文档:位于核心日志记录包中的 FileHandler 类将日志记录输出发送到磁盘文件。它继承了 StreamHandler 的输出功能。 所以这里的想法是扩展FileHandler 类,并在emit() 方法中,过滤掉所有不在logging.DEBUG 级别的record 对象。

    我没有对此进行测试,但我认为它可以完成这项工作:

    from logging import FileHandler, DEBUG
    
    log = logging.getLogger('foo')
    
    
    class DebugFileHandler(FileHandler):
        def __init__(self, filename, mode='a', encoding=None, delay=False)
            super().__init__(filename, mode, encoding, delay)
        
        def emit(self, record):
            if not record.levelno == DEBUG:
                return
            super().emit(record)
    
    log.addHandler(DebugFileHandler())
    

    当然,您必须使此代码适应您的代码。而且,老实说,record.level 是一个疯狂的猜测,但我认为这是有道理的 :-) 而且,I got it right

    在此示例中,处理程序将仅应用于 foo 记录器。您可能希望为您的主处理程序激活它,或者只为某些特定的处理程序激活它,如您所愿。

    【讨论】:

    • 这里,我只是把它写出来:-)
    • 谢谢,我得看看什么代码能正常工作,但有了这些信息,我就会到达那里。 :)
    • 对于未来的参考,我认为指出以下几点是很好的:上面的代码主要工作。课程结束时缺少一些冒号,但很容易发现。如果将if record.level != DEBUG: 行替换为if not record.levelno == DEBUG:,则所有非DEBUG 日志都会被很好地过滤掉。
    • 创建filter object 并将其附加到处理程序不是更合适吗?
    • 确实可以,但我认为这不合适。作为一般规则,越简单越好,无论如何您都需要FileHandler 来完成这项工作,因此无需添加另一个实例来处理它。正如您链接的文档所述:Although filters are used primarily to filter records based on more sophisticated criteria than levels [...],即它可以做到,但它的设计不仅仅是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多