Python 日志记录 - 如何继承根记录器级别和处理程序

Python Logging - How to inherit root logger level & handler

我是 python 新手,正在尝试实现登录到我的代码中。我有两个模块

main.py submodule.py

main.py

import logging
from logging.handlers import RotatingFileHandler
import submodule


import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug('DEBUG LEVEL - MAIN MODULE')
logger.info('INFO LEVEL - MAIN MODULE')

submodule.loggerCall()

submodule.py

import logging
from logging.handlers import RotatingFileHandler


def loggerCall():
    logger = logging.getLogger(__name__)
#    logger.setLevel(logging.DEBUG)

    fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    logger.addHandler(fh)

    logger.debug('SUBMODULE: DEBUG LOGGING MODE : ')
    logger.info('Submodule: INFO LOG')

    return

我认为只要从我的子模块调用 getLogger,它就应该从根记录器继承日志级别和处理程序详细信息。但是,就我而言,我必须在子模块中再次指定日志级别和处理程序,以将它们打印到同一个日志文件。

此外,如果我有很多方法,并且 类 在我的子模块中。我怎样才能做到这一点而不必再次定义我的日志级别和处理程序。

想法是根据主模块中设置的日志级别,在同一个日志中打印主模块和子模块的日志文件。

提前致谢

抱歉,这可能是一个重复的问题,我确实回答了那些类似的问题,但无法弄清楚它是如何工作的。因此发布这个问题。我不是故意创建重复的 bcz 我没有查找它。

这里的问题是您没有初始化根记录器;您正在为您的主模块初始化记录器。

main.py试试这个:

import logging
from logging.handlers import RotatingFileHandler
import submodule

logger = logging.getLogger()  # Gets the root logger
logger.setLevel(logging.DEBUG)

fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug('DEBUG LEVEL - MAIN MODULE')
logger.info('INFO LEVEL - MAIN MODULE')

submodule.loggerCall()

然后尝试 submodule.py:

def loggerCall():
    logger = logging.getLogger(__name__)
    logger.debug('SUBMODULE: DEBUG LOGGING MODE : ')
    logger.info('Submodule: INFO LOG')
    return

既然你说你想从你所有的子模块发送日志消息到同一个地方,你应该初始化根记录器,然后简单地使用消息记录方法(以及适当的 setlevel() 调用)。因为你的子模块没有明确的处理程序,logging.getLogger(__name__) 将遍历树到根,在那里它会找到你在 main.py.

中建立的处理程序