我很难在structlog中为不同的处理程序设置不同的处理器。
下面是一个我试图实现的最小的例子:
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})控制台输出是:
2021-12-30T21:55:58.793483Z [info ] My log message. [my_logger] extra={'abc': 123}文件输出是:
{"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部分。
发布于 2022-01-05 14:40:37
structlog 21.3.0为structlog.stdlib.ProcessorFormatter添加了一个structlog.stdlib.ProcessorFormatter(复数)参数(作为processor (单数)的替代)。
它需要一个完整的链,所以我认为应该允许您通过在那里添加elastic_format来实现您想要的?
https://stackoverflow.com/questions/70537134
复制相似问题