如何装饰python日志记录输出?

2024-06-02 07:58:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用import logging模块在AWS lambda中使用python 3.7运行时进行日志记录。

在将日志语句刷新到标准输出之前,我希望对它们执行某些操作,例如,将消息包装为json并添加跟踪数据,以便Kibana解析器能够解析它们

我不想为此编写自己的装饰器,因为这对底层依赖项不起作用

理想情况下,它应该类似于记录器的配置回调 这样它就可以为我做以下工作:

    log_statement = {}
    log_statement['message'] = 'this is the message'
    log_statement['X-B3-TraceId'] = "76b85f5e32ce7b46"
    log_statement['level'] = 'INFO'
    sys.stdout.write(json.dumps(log_statement) + '\n')

仍然有logger.info('this is the message')

我该怎么做


Tags: 模块thelambdaimportawslogjsonmessage
1条回答
网友
1楼 · 发布于 2024-06-02 07:58:17

回答我自己的问题:

  1. 我不得不使用LoggerAdapter,这非常适合预处理日志语句:
import logging

class CustomAdapter(logging.LoggerAdapter):

    def process(self, msg, kwargs):
        log_statement = '{"X-B3-TraceId":"%s", "message":"%s"}' % (self.extra['X-B3-TraceId'], msg) + '\n'
        return log_statement, kwargs

见:https://docs.python.org/3/howto/logging-cookbook.html#using-loggeradapters-to-impart-contextual-information

  1. 通常,下一步只需插入适配器,如:
import logging
...
logging.basicConfig(format='%(message)s')
logger = logging.getLogger()
logger.setLevel(LOG_LEVEL)
custom_logger = CustomAdapter(logger, {'X-B3-TraceId': "test"})
...
custom_logger.info("test")

注意:我必须将格式设置为message,因为我需要将整个语句作为JSON字符串。不幸的是,因此我丢失了一些预定义的日志语句部分,例如aws_request_id。这是LoggerAdapter#process的限制,因为它只处理message部分。如果有人在这里有更好的方法,请建议

  1. AWS lambda python运行时似乎以某种方式干扰了日志记录功能,并且像上面那样更改格式不起作用。因此,我还必须这样做:
FORMAT = "%(message)s"
logger = logging.getLogger()
for h in logger.handlers:
    h.setFormatter(logging.Formatter(FORMAT))

见:https://gist.github.com/niranjv/fb95e716151642e8ca553b0e38dd152e

相关问题 更多 >