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

时间:2014-01-10 11:19:45

标签: python logging

我正在尝试将标准Python日志记录信息的旧方法替换为文件。该应用程序当前有一个日志文件,该文件设置为捕获Info和Debug消息,因此我希望在主要日志未捕获的较低级别。

应用程序结构:

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

item1.pyengine.py内调用了一个旧的debug()函数,我不想登录legacy.log但不会将它们显示在mysite.log中1}}文件。

理想情况下,它的工作方式是创建一个带有调试功能的包装器,它在新级别执行日志记录,我已经读过这需要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 个答案:

答案 0 :(得分:1)

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

在您的情况下,settings.py中定义的未命名记录器是名为'legacy'的记录器的父级。未命名的记录器将接收通过'legacy'记录器发送的消息,并将其写入mysite.log

尝试为未命名的记录器命名,例如'mysite'以打破树结构。