繁体   English   中英

Python子记录器应向根记录器报告,而不是应用其自己的记录配置

[英]Python child logger should report back to root logger instead of applying its own logging configs

如此处提到https://stackoverflow.com/a/4150322/1526342 登录到子记录器时,它将消息传递给其父记录器,其父记录器会将消息传递给根记录器。 现在考虑以下示例

import logging
import logging.handlers
child_logger = logging.getLogger(__name__)
f = logging.Formatter(
        fmt='%(asctime)s; %(name)s; % (filename)s:%(lineno)d:%(message)s',
        datefmt="%Y-%m-%d %H:%M:%S")
handler = logging.handlers.RotatingFileHandler('/tmp/info.log',
                                               encoding='utf8',
                                               maxBytes=500000000,
                                               backupCount=5)
handler.setFormatter(f)
child_logger.setLevel(logging.INFO)
child_logger.addHandler(handler)
child_logger.info('1 + 1 is %d', 1+1)

child_logger应该已经报告回根记录器,而不是将输出打印到child_logger的日志文件中。

我糊涂了。

该日志记录流程图所示,记录器将日志记录传递给自己的处理程序父记录器对象。 尝试将处理程序添加到父记录器中,您还将看到日志记录也在其中被处理。

在这种情况下,您的“ child_logger”是您的根记录器。 如果您像这样初始化它:

logger = getLogger('root')
child_logger = getLogger('root.child')

child_loggerlogger的子项,其定义如下:

该名称可能是用句点分隔的分层值,例如foo.bar.baz(例如,也可以是纯foo)。 层次结构列表中位于最下方的记录器是列表中较高处的记录器的子级。 例如,给定名称为foo的记录器,名称为foo.bar,foo.bar.baz和foo.bam的记录器都是foo的后代。 记录程序名称层次结构类似于Python包层次结构,如果您使用建议的构造logging.getLogger( __name__ )在每个模块的基础上组织记录程序,则记录程序名称层次结构与Python包层次结构相同。 这是因为在模块中, __name__是Python包命名空间中模块的名称。

如果您不希望孩子进行logger.propagate ,则可以设置logger.propagate = False

此外,如果您只希望将某些级别写入子记录器文件(即仅调试),但又希望继续传播更高级别,则可以创建处理程序的子类,如我的此处所示:

from logging import DEBUG, INFO, WARN, ERROR, CRITICAL, handlers

class DebugRotatingFileHandler(handlers.RotatingFileHandler):
    def __init__(self, filename, mode, maxBytes, backupCount, encoding, delay):
        super(DebugRotatingFileHandler, self).__init__(
                  self, filename, mode, maxBytes, backupCount, encoding, delay)

    def emit(self, record):
        if record.levelno != DEBUG:
            return
        super(DebugRotatingFileHandler, self).emit(self, record)

(是的,我知道可以进行一些改进,这是旧代码。)

例如,执行debug_logger.info("Info Message")不会将任何内容打印到debug_logger的指定文件,但是,如果root_logger的级别设置为info或debug,它将在文件中打印出来。 我将其用于调试日志记录,同时仍保留使记录器进行错误消息调用并将其打印到根日志的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM