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

标签 python python-2.7 logging error-logging

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

main.py submodule.py

主.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()

子模块.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 中建立的处理程序。

关于Python 日志记录 - 如何继承根记录器级别和处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47422689/

相关文章:

python - 如何在不传递记录器变量的情况下使用不同的记录器? (Python 日志记录)

python - 从线程取回变量

python - 从 python 作为 google 组发送电子邮件

python - 使用 Python 提取(而不是读取)大型 gzip 文件

Python 中的 OpenCV 2.4 estimateAffine3D

ruby-on-rails-3 - 使用 Active Support 记录器将 Ruby 记录到多个后端

python - python中env变量的继承

Python:Unix 中的 Socket.error 连接被拒绝 [Errno 111]

python - 如何使用Python生成器

logging - 将进程 ID 添加到 log4cxx 中的日志文件名