<blockquote>
<p>or if I'm completely off on the wrong track and if that's the case, what I should be doing instead.</p>
</blockquote>
<p>我的强烈建议是,您应将日志记录视为一个已解决的问题,并避免重新发明轮子</p>
<p>如果您需要的不仅仅是标准库的<code>logging</code>模块提供的,那么它可能类似于<a href="https://www.structlog.org/en/stable/" rel="noreferrer">structlog</a>(<code>pip install structlog</code>)</p>
<p>Structlog将为您提供:</p>
<ul>
<li>数据绑定</li>
<li>云本机结构化日志记录</li>
<li>管道</li>
<li>……还有更多</li>
</ul>
<p>它将处理大多数本地和云使用情况</p>
<p>下面是一个常见的配置,它将彩色日志输出到.log文件、stdout,并且可以进一步扩展到日志,例如AWS CloudWatch</p>
<p>注意,其中包含一个处理器:<code>StackInfoRenderer</code>这将包括所有日志调用的堆栈信息,堆栈信息的值为“truthy”(这也在stdlib的日志btw中)。如果您只需要异常的堆栈信息,那么您需要为日志调用执行类似exc_info=True的操作</p>
<p><strong>main.py</strong></p>
<pre class="lang-py prettyprint-override"><code>from structlog import get_logger
from logging_config import configure_local_logging
configure_local_logging()
logger = get_logger()
logger.info("Some random info")
logger.debug("Debugging info with stack", stack_info=True)
try:
assert 'foo'=='bar'
catch Exception as e:
logger.error("Error info with an exc", exc_info=e)
</code></pre>
<p><strong>日志记录\u config.py</strong></p>
<pre class="lang-py prettyprint-override"><code>import logging
import structlog
def configure_local_logging(filename=__name__):
"""Provides a structlog colorized console and file renderer for logging in eg ING tickets"""
timestamper = structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S")
pre_chain = [
structlog.stdlib.add_log_level,
timestamper,
]
logging.config.dictConfig({
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"plain": {
"()": structlog.stdlib.ProcessorFormatter,
"processor": structlog.dev.ConsoleRenderer(colors=False),
"foreign_pre_chain": pre_chain,
},
"colored": {
"()": structlog.stdlib.ProcessorFormatter,
"processor": structlog.dev.ConsoleRenderer(colors=True),
"foreign_pre_chain": pre_chain,
},
},
"handlers": {
"default": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "colored",
},
"file": {
"level": "DEBUG",
"class": "logging.handlers.WatchedFileHandler",
"filename": filename + ".log",
"formatter": "plain",
},
},
"loggers": {
"": {
"handlers": ["default", "file"],
"level": "DEBUG",
"propagate": True,
},
}
})
structlog.configure_once(
processors=[
structlog.stdlib.add_log_level,
structlog.stdlib.PositionalArgumentsFormatter(),
timestamper,
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
],
context_class=dict,
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
cache_logger_on_first_use=True,
)
</code></pre>
<p>Structlog可以做更多的事情。我建议你去看看</p>