当前位置: 首页 > 面试题库 >

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

龚志
2023-03-14
问题内容

我是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,我没有查找它。


问题答案:

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

试试这个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中建立的处理程序。



 类似资料:
  • 我计划用log4j one替换旧的记录器。我需要创建继承Logger的新类LocalLogger,而不是直接使用Logger。这样做的原因-我需要旧记录器中可用的新日志方法名称。 我有log4j记录器: 如何以与Logger相同的方式实现LocalLogger的功能? 如何将c类传递给超级本地记录器? LocalLogger的草稿:

  • 我在一个类中创建了3个不同的slf4j记录器: 奇怪的是,即使在调试级别配置了X.Y.Z.MyClass,MyClass-a和MyClass-b记录器也不是在调试级别记录日志,而是在配置的根级别记录日志(在我的例子中是info)。如下所示,即使为-a和-b指定特定的记录器也不起作用。在我将根更改为debug之前,它们不会在debug级别进行日志记录。真的被这个难住了,有什么想法吗?

  • 本文向大家介绍Java记录级别,包括了Java记录级别的使用技巧和注意事项,需要的朋友参考一下 示例 Java Logging Api具有7个级别。级别降序为: SEVERE (最高值) WARNING INFO CONFIG FINE FINER FINEST (最低值) 默认级别为INFO(但这取决于系统和使用的虚拟机)。 注意:也有两个级别OFF(可用于关闭登录)和ALL(的相反OFF)。

  • 问题内容: 我正在使用python日志记录模块在python代码中记录事件。我也希望记录2个日志文件,一个包含用户信息,另一个包含针对开发人员的更详细的日志文件。我已将两个日志文件设置为所需的级别(usr.log = INFO和dev.log = ERROR),但无法解决如何将日志记录限制为usr.log文件,因此仅写入INFO级别日志到日志文件,而不是INFO以及上面的所有其他内容,例如INFO

  • 问题内容: 从java.util.logging的日志记录级别如何映射到SLF4J? SLF4J 跟踪 调试 信息 警告 错误 致命 java.util.logging 最好的 更好 精细 配置 信息 警告 严重 问题答案: 通过SLF4JBridgeHandler文档和测试:

  • 从java.util.logging到SLF4J的日志级别如何映射? SLF4J null java.util.Logging null

  • 我正在使用log4j进行日志记录。我有一个场景,我必须为不同的严重性使用单独的日志记录。例如,对于软件包foo,我必须在控制台中打印具有严重性ERROR的消息,而我必须在日志文件中打印具有严重性WARN的消息。我如何配置我的log4j.xml相同。

  • 现在,问题是,当我以以下方式进行日志记录时: 尽管根记录器级别被设置为“错误”,但日志条目仍然存在于两个日志文件中。然而,当我去掉“it.pkg.testpkg.service”记录器(通过注释或删除它)时,条目停止进入根记录器。我不太清楚这是怎么回事。 目前,我已经找到了一个临时解决方案,方法是在“root_file_appender”中添加以下条目: 谢了。