我正在尝试将标准Python日志记录信息的旧方法替换为文件。该应用程序当前有一个日志文件,该文件设置为捕获Info和Debug消息,因此我希望在主要日志未捕获的较低级别。
应用程序结构:
- mysite
- legacy
-- items
--- item1.py
-- __init__.py
-- engine.py
在item1.py
和engine.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.py
和item1.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)
答案 0 :(得分:1)
使用多个记录器时,logging
模块会在树结构中隐式创建它们。结构由记录器名称定义:名为'animal'
的记录器将成为名为'animal.cat'
和'animal.dog'
的记录器的父级。
在您的情况下,settings.py
中定义的未命名记录器是名为'legacy'
的记录器的父级。未命名的记录器将接收通过'legacy'
记录器发送的消息,并将其写入mysite.log
。
尝试为未命名的记录器命名,例如'mysite'
以打破树结构。