当前位置: 首页 > 知识库问答 >
问题:

如何在自定义级别向模块中的类添加日志记录

姜森
2023-03-14

我正在尝试用标准的Python日志记录到文件来替换一种旧的记录信息的方法。该应用程序目前有一个日志文件,它被设置为捕获信息和调试消息,所以我希望它在一个较低的级别,而不是由主日志捕获。

应用程序结构:

- mysite
- legacy
  -- items
     --- item1.py
  -- __init__.py
  -- engine.py

item1.pyengine.py中是对旧的debug()函数的调用,我不希望将该函数记录在legacy.log中,但也不希望它们出现在mysite.log文件中。

理想的工作方式是创建一个带有调试函数的包装器,该函数在新的级别上进行日志记录,我已经了解到这需要logging.logger的扩展。

因此,在legacy/__init__.py中,我编写了;

import logging

LEGACY_DEBUG_LVL = 5

class LegacyLogger(logging.Logger):
    """
    Extend the Logger to introduce the new legacy logging.
    """
    def legacydebug(self, msg, *args, **kwargs):
        """
        Log messages from legacy provided they are strings.

        @param msg: message to log
        @type msg:
        """
        if isinstance(msg, str):
            self._log(LEGACY_DEBUG_LVL, msg, args)

    logging.Logger.legacydebug = legacydebug


logger = logging.getLogger('legacy')
logger.setLevel(LEGACY_DEBUG_LVL)
logger.addHandler(logging.FileHandler('legacy.log'))
logging.addLevelName(LEGACY_DEBUG_LVL, "legacydebug")

engine.pyitem1.py中我可以执行;

from . import logger
debug = logger.legacydebug

编辑

登录主应用设置按此设置;

# settings.py
logging.captureWarnings(True)
logger = logging.getLogger()
logger.addHandler(logging.NullHandler())
logger.addHandler(logging.handlers.FileHandler('mysite.log'))

if DEBUG:
    # If we're running in debug mode, write logs to stdout as well:
    logger.addHandler(logging.StreamHandler())
    logger.setLevel(logging.DEBUG)
else:
    logger.setLevel(logging.INFO)

共有1个答案

龙令
2023-03-14

当使用多个记录器时,logging模块在树结构中隐式地创建它们。结构由记录器名称定义:名为“animal”的记录器将是名为“animal.cat”“animal.dog”的记录器的父记录器。

在您的示例中,settings.py中定义的未命名记录器是名为'legace'的记录器的父记录器。未命名的记录器将接收通过'legacy'记录器发送的消息,并将它们写入mysite.log

尝试为未命名的记录器指定一个名称,例如'mysite'以破坏树结构。

 类似资料:
  • 问题内容: 我想为我的应用程序使用loglevel TRACE(5),因为我认为这还不够。另外不是我想要的。如何将自定义日志级别添加到Python记录器? 我有以下内容: 在我的代码中,我通过以下方式使用它: 现在我想打电话 在此先感谢您的帮助。 编辑 (2016年12月8日):我[pfa的)可接受答案更改为IMHO,这是基于Eric S的非常好的建议的出色解决方案。 问题答案: @Eric S.

  • 我无法在gradle项目中添加自定义源代码集。如何初始化这里的版本号?我的gradle文件看起来像:

  • 使用java.util.Logging时,可以在logging.properties文件中配置特定类的日志级别(即具有类名称的子记录器),如下所示: 我使用类名在MyClass中创建子记录器,如下所示: 在Google Web Toolkit gwt.xml文件中有类似的配置方法吗?

  • 现在,它调用的一个java文件需要花费大量时间来完成。我没有这个类的访问权限,所以我想为那个特定的类设置一个特定的日志记录级别,以试图了解我的实现有什么问题。 我不想改变全局日志记录级别,我只想为某个类添加一个特定的级别,如何实现?

  • 根记录器配置为级别的同步记录器。我还有几个异步记录器。其中一个异步记录器配置在自定义的较高日志级别(789)。这高于级别(600)。 这样做的原因是有一个日志级别,可以用于通过异步记录器及其自己的附加程序记录的特殊事件。 我们不希望将事件发送给同步根记录器或其他记录器。。但仅限于异步记录器及其相应的附加程序。。可能吗?

  • 我有这些具体要求: 需要能够登录致命级别 现在,我的实现如下: 这是我的模式布局(在yaml): 以下是我的日志输出: 你知道如何有效地从日志输出中删除“错误”吗? 非常感谢你