我目前的解决方案分为两部分(当然,我还是很欣赏其他方法):
-
在中设置基于级别的处理程序
__init__
__name__
-
添加一个助手函数
getModuleLogger()
模仿
getLogger()
在内部
__初始化__
,但也添加了一个特定于该模块的文件处理程序。
getModuleLogger(__name__)
就像它通常所说的那样
logging.getLogger(__name__)
从…起
__init__.py
__all__ = ()
import logging
import logging.config
import logging.handlers
import os
_levels = ("debug", "info", "warning", "error", "critical")
_level_handlers = {
level: {
"class": "logging.handlers.RotatingFileHandler",
"filename": "/tmp/level-{}.log".format(level),
"maxBytes": 750_000,
"backupCount": 5,
"level": level.upper()
} for level in _levels
}
LOGGING = {
"version": 1,
"loggers": {
# Using the package name means modules in the package are nested
# as children of this parent logger and will inherit its handlers
__name__: {
"handlers": _levels,
}
}
}
LOGGING['handlers'] = _level_handlers
logging.config.dictConfig(LOGGING)
def getModuleLogger(name):
"""Call this from modules instead of standard logging.getLogger()."""
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
filename="/tmp/module-{}.log".format(name),
maxBytes=750_000, backupCount=5
)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
return logger
从…起
a.py
from logtest import getModuleLogger
logger = getModuleLogger(__name__)
def test_a():
logger.info("info from a.py")
logger.critical("critical from a.py")
>>> from logtest import a, b
>>> a.test_a()
>>> b.test_b()
>>> from logtest.a import logger
>>> logger.handlers
[<RotatingFileHandler /tmp/module-logtest.a.log (DEBUG)>]
>>> from pprint import pprint
>>> pprint(logger.parent.handlers)
[<RotatingFileHandler /tmp/level-debug.log (DEBUG)>,
<RotatingFileHandler /tmp/level-info.log (INFO)>,
<RotatingFileHandler /tmp/level-warning.log (WARNING)>,
<RotatingFileHandler /tmp/level-error.log (ERROR)>,
<RotatingFileHandler /tmp/level-critical.log (CRITICAL)>]
>>> exit()
[logtest/] $ cat /tmp/module-logtest.a.log
info from a.py
critical from a.py
[logtest/] $ cat /tmp/module-logtest.b.log
info from b.py
critical from b.py
[logtest/] $ cat /tmp/level-critical.log
critical from a.py
critical from b.py