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

时间:2017-11-21 21:03:10

标签: python python-2.7 logging error-logging

我是一个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时,它应该继承日志级别&来自root logger的处理程序详细信息但是,在我的情况下,我必须在子模块中再次指定日志级别和处理程序,以使它们打印到相同的日志文件。

另外,如果我的子模块中有很多方法和类。如何在不必定义日志级别的情况下进行操作再次处理。

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

提前致谢

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

1 个答案:

答案 0 :(得分:6)

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

尝试使用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中建立的处理程序。