首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义日志级别不使用structlog

自定义日志级别不使用structlog
EN

Stack Overflow用户
提问于 2019-02-04 01:22:31
回答 2查看 1.4K关注 0票数 1

我正在使用python自定义日志-跟踪在下面的代码中是自定义日志级别。

使用默认的记录器,它工作得很好

但是当我把它改为structlog时,它给出了错误。

结构日志无法识别以下代码中的跟踪。

看起来structlog不支持自定义日志级别?

已经尝试过https://github.com/hynek/structlog/issues/47中提到的解决方法

i.e

代码语言:javascript
复制
    structlog.stdlib.TRACE = TRACE = 5
    structlog.stdlib._NAME_TO_LEVEL['trace'] = TRACE

但是它不起作用。

代码语言:javascript
复制
    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")
EN

回答 2

Stack Overflow用户

发布于 2019-06-06 05:03:27

创建自定义关卡是可能的,但不是很容易。

您需要记住不仅要更改structlog.stdlib._NAME_TO_LEVEL,还要更改structlog.stdlib._LEVEL_TO_NAME

然后,您至少需要向structlog.stdlib._FixedFindCallerLogger添加一个trace方法(如果您还向structlog.stdlib.BoundLogger添加了一个trace方法,那么您可以调用LOG.trace,这很好)。

下面的代码应该可以工作:

代码语言:javascript
复制
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')
票数 1
EN

Stack Overflow用户

发布于 2019-02-04 16:43:04

目前还没有正式的方法,因为你可能已经从相关问题中收集到了you commented on

你现在应该可以通过加密structlog.stdlib._NAME_TO_LEVEL来绕过这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54505487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档