[英]Custom log level not working with structlog
我正在使用python自定義日志-TRACE是以下代碼中的自定義日志級別。
使用默認記錄器,它可以正常工作
但是,當我為structlog更改它時,它給出了錯誤。
structlog無法在下面的代碼中識別TRACE。
似乎structlog不支持自定義日志級別?
已經嘗試過的解決方法提到了https://github.com/hynek/structlog/issues/47
即
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._NAME_TO_LEVEL
。
可以創建自定義級別,但不是很容易。
您需要記住,不僅要更改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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.