首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Structlog将处理器添加到处理程序

Structlog将处理器添加到处理程序
EN

Stack Overflow用户
提问于 2021-12-30 22:03:44
回答 1查看 381关注 0票数 0

我很难在structlog中为不同的处理程序设置不同的处理器。

下面是一个我试图实现的最小的例子:

代码语言:javascript
复制
import logging
import structlog
import sys

from logging.handlers import TimedRotatingFileHandler


def elastic_format(logger: logging.Logger, method_name: str, event_dict: dict):
    # Elastic requires the message to be under 'message' and not under 'event'
    if isinstance(event_dict, dict) and event_dict.get('event') and not event_dict.get('message'):
        event_dict['message'] = event_dict.pop('event')

    return event_dict

structlog.configure_once(
    # Don't mess up the order of this!
    # Note this https://www.structlog.org/en/stable/standard-library.html
    # On the structlog side, the processor chain must be configured to end with
    # structlog.stdlib.ProcessorFormatter.wrap_for_formatter as the renderer.
    processors=[
        structlog.stdlib.add_log_level,
        structlog.stdlib.add_logger_name,
        structlog.processors.TimeStamper(fmt='iso'),
        structlog.processors.StackInfoRenderer(),
        structlog.processors.format_exc_info,
        structlog.stdlib.ProcessorFormatter.wrap_for_formatter
    ],
    context_class=structlog.threadlocal.wrap_dict(dict),
    logger_factory=structlog.stdlib.LoggerFactory(),
    wrapper_class=structlog.stdlib.BoundLogger,
    cache_logger_on_first_use=True
)

console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(structlog.stdlib.ProcessorFormatter(processor=structlog.dev.ConsoleRenderer(colors=True)))

file_handler = TimedRotatingFileHandler(filename='./my_logs.log', interval=1, backupCount=48, encoding='utf-8')
file_handler.setFormatter(structlog.stdlib.ProcessorFormatter(processor=structlog.processors.JSONRenderer()))

root_logger = logging.getLogger()
root_logger.addHandler(console_handler)
root_logger.addHandler(file_handler)

root_logger.setLevel('INFO')

logger = structlog.getLogger('my_logger')
logger.info('My log message.', extra={'abc': 123})

控制台输出是:

代码语言:javascript
复制
2021-12-30T21:55:58.793483Z [info     ] My log message.                [my_logger] extra={'abc': 123}

文件输出是:

代码语言:javascript
复制
{"extra": {"abc": 123}, "event": "My log message.", "level": "info", "logger": "my_logger", "timestamp": "2021-12-30T21:55:58.793483Z"}

然而,对于文件处理程序来说,上面的输出正是我所期望的,我想添加代码示例中包含的elastic_format函数。

我不认为有一种方法可以单独地在处理程序上设置处理器。这目前只是更改日志数据,但一旦完全实现,将对数据应用一些转换。如何使用structlog实现这一点?

为了澄清,我希望这只适用于文件处理程序,而不是控制台处理程序,因此我不认为它可以添加到structlog.configure_once部分。

EN

回答 1

Stack Overflow用户

发布于 2022-01-05 14:40:37

structlog 21.3.0为structlog.stdlib.ProcessorFormatter添加了一个structlog.stdlib.ProcessorFormatter(复数)参数(作为processor (单数)的替代)。

它需要一个完整的链,所以我认为应该允许您通过在那里添加elastic_format来实现您想要的?

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

https://stackoverflow.com/questions/70537134

复制
相关文章

相似问题

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