自定义日志级别不structlog工作

问题描述 投票:1回答:2

我使用Python自定义日志工作 - TRACE是在下面的代码自定义日志级别。

在默认记录器,其做工精细

但是,当我改变它structlog它给错误。

structlog不能在下面的代码来识别跟踪。

看来,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")
python logging structlog
2个回答
0
投票

目前,是你可能已经从you commented on相关问题目前聚集没有正式的办法。

您应该能够规避,对于现在的Monkeypatching structlog.stdlib._NAME_TO_LEVEL


0
投票

它可以创建一个自定义级别,但不是很容易的。

你需要记住不仅改变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')
© www.soinside.com 2019 - 2024. All rights reserved.