python - 自定义日志级别不适用于 structlog
问题描述
我正在使用 python 自定义日志 - TRACE 是下面代码中的自定义日志级别。
使用默认记录器,它工作正常
但是当我将它更改为 structlog 时,它给出了错误。
structlog 无法识别以下代码中的 TRACE。
似乎 structlog 不支持自定义日志级别?
已经尝试过提到的解决方法https://github.com/hynek/structlog/issues/47
IE
structlog.stdlib.TRACE = TRACE = 5
structlog.stdlib._NAME_TO_LEVEL['trace'] = TRACE
但它不工作
TRACE = 19
logging.addLevelName(TRACE, "TRACE")
logging.basicConfig(
level=os.environ.get("LOGLEVEL", "TRACE"),
format=os.environ.get("LOGFORMAT", '%(levelname)-8s= %(asctime)-15s = %(message)s'))
structlog.configure(
processors=[
structlog.stdlib.filter_by_level,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
structlog.processors.UnicodeDecoder(),
structlog.stdlib.render_to_log_kwargs,
],
context_class=dict,
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
cache_logger_on_first_use=True,
)
#LOG = logging.getLogger() ->> Working fine
LOG = structlog.getLogger()
LOG.log(TRACE, "hello") ->> error on this line
LOG.info("testing")
解决方案
可以创建自定义关卡,但不是很容易。
你需要记住不仅要改变structlog.stdlib._NAME_TO_LEVEL
,还要改变structlog.stdlib._LEVEL_TO_NAME
。
trace
然后,您至少需要添加一个方法structlog.stdlib._FixedFindCallerLogger
(如果您也添加了一个trace
方法,structlog.stdlib.BoundLogger
那么您可以调用LOG.trace
,这很好)。
此代码应该可以工作:
import logging
import os
import structlog
TRACE = 19
structlog.stdlib.TRACE = TRACE = 5 # this overrides the 19 above with a 5, is that right?
structlog.stdlib._NAME_TO_LEVEL['trace'] = TRACE
structlog.stdlib._LEVEL_TO_NAME[TRACE] = 'trace'
def trace(self, msg, *args, **kw):
return self.log(TRACE, msg, *args, **kw)
structlog.stdlib._FixedFindCallerLogger.trace = trace
structlog.stdlib.BoundLogger.trace = trace
logging.basicConfig(
level=int(os.environ.get("LOGLEVEL", TRACE)),
format=os.environ.get("LOGFORMAT", '%(levelname)-8s= %(asctime)-15s = %(message)s'))
structlog.configure(
processors=[
structlog.stdlib.filter_by_level,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
structlog.processors.UnicodeDecoder(),
structlog.stdlib.render_to_log_kwargs,
],
context_class=dict,
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
cache_logger_on_first_use=True,
)
logging.addLevelName(TRACE, "TRACE")
LOG = structlog.getLogger()
LOG.trace('test')
推荐阅读
- python - 使用 ElementTree 添加 HTML 实体
- python - 在元组列表中,我们如何获得第二个元素
- tensorflow - 参数传递到 tensorflow/keras 中的扁平层后去哪里
- python - 调用多个函数时关闭窗口
- r - 为 data.frame 中的每个 id 值创建错误消息
- layout - Sapper 嵌套布局与根布局冲突
- python - TypeError:预期的 str、字节或 os.PathLike 对象,而不是槌中的 _io.BufferedReader
- html - 悬停时网格单元格缩小
- javascript - 如何在输入时在屏幕上显示句子中的表单输入
- javascript - 数组代码战 (Javascript) 中的差异总和