【发布时间】:2018-10-15 18:08:58
【问题描述】:
我对 Python 有点陌生,尤其是在多个文件中编写模块和函数,而不仅仅是原始脚本。
我正在编写一个命令行应用程序,我想要一个函数(我称之为argpconf)来解析命令行参数并相应地设置日志级别。最重要的是,我希望在此函数中设置一次日志级别,并且在创建记录器时以最小开销在所有模块中保持相同。此外,我希望能够在使用通用格式化程序时识别消息来自的模块:
logging.Formatter("%(levelname)s : %(name)s : %(message)s")
部分基于a cookiecutter template,我创建了以下文件:
├── api
│ ├── __init__.py
│ └── some_functionality.py
├── cli.py
├── core
│ ├── argpconf.py
│ ├── __init__.py
│ ├── logger.py
│ └── __version__.py
├── __init__.py
└── __main__.py
core/logger.py有以下内容:
from logging import Formatter, Logger as _Logger, NullHandler, StreamHandler
class Logger(_Logger):
def __init__(self, name=None):
super(Logger, self).__init__(name or __name__.split(".")[0])
self.addHandler(NullHandler()) # default to no output
def start(self, level="WARN", stream=None,
fmt="%(levelname)s : %(name)s : %(message)s"):
handler = StreamHandler(stream)
handler.setFormatter(Formatter(fmt))
self.addHandler(handler)
self.setLevel(level.upper())
def stop(self):
for handler in self.handlers[1:]:
# Remove everything but the NullHandler.
self.removeHandler(handler)
logger = Logger()
与这些问题的答案中建议的想法相比:
- How to share a file between modules for logging in python
- Python logging - multiple modules
- How to use logging.getLogger(__name__) in multiple modules
- Using Python logging in multiple modules
我真的很喜欢 cookiecutter 模板中使用记录器的方法,因为它只允许您使用 import logger 并拥有一个 logger 对象,它的日志级别在所有模块中都是相同的。但是,我对此并不完全满意,因为在我的情况下,argpconf.py 是第一个启动 logger 的模块,因此来自所有模块的所有日志消息都将其 %(name)s 替换为 core,因为它是 @987654337 @的__name__.split(".")[0]。
如何改进logger 模块,以便它检测调用它的模块并打印带有%(name)s 模块的日志消息,甚至打印它们的函数?
【问题讨论】:
-
logging.basicConfig(level=LOGLEVEL)不满足您的需求吗? -
我用示例代码的链接更新了我的答案(有点太多代码要内联添加到答案中)。