【问题标题】:Python logging & 3rd party modulesPython 日志记录和第 3 方模块
【发布时间】:2020-04-13 15:47:03
【问题描述】:

我正在努力让 Python 以我想要的方式记录。我通过添加过滤器并更新格式字符串以打印过滤器中的内容,为我的日志语句添加了一些上下文。只要所有代码是我的,就可以按预期工作。

但如果第 3 方模块记录了某些内容,则会引发错误,因为该模块不知道我的过滤器。

如何在不破坏 3rd 方模块日志记录的情况下将上下文添加到我的日志中?

此代码在我的模块中运行良好。但是如果第 3 方模块想要记录某些内容,他们不知道我的 ContextFilter,它详细说明了我想要在我的日志消息中的 nstid

import logging
import sys

import boto3
from ContextFilter import ContextFilter

logging.basicConfig(
    format='%(asctime)s %(levelname)-8s nstid:%(nstid)8s %(message)s',
    handlers=[logging.StreamHandler(sys.stdout)],
    level=logging.INFO,
    datefmt='%Y-%m-%d %H:%M:%S'
)
log = logging.getLogger(__name__)
log.addFilter(ContextFilter())

log.info("important information")

【问题讨论】:

  • 您配置了您的记录器,而不是他们的。您需要查看文档,或者在最坏的情况下查看代码,以查看其他模块使用的记录器。
  • 或者,您需要配置根记录器(logging.getLogger())。
  • @chepner,将我的过滤器添加到根记录器?

标签: python logging


【解决方案1】:

我能够使用 CustomAdapter 而不是 ContextFilter 获得所需的内容,但我仍然对其他解决方案感兴趣:

CustomAdapter.py:

import logging
import os

class CustomAdapter(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        nstid = os.environ['NSTID'] if 'NSTID' in os.environ else None
        return '[NSTID: %s] %s' % (nstid, msg), kwargs

import logging
import os
import sys

import boto3
from CustomAdapter import CustomAdapter

logging.basicConfig(
    format='%(asctime)s %(levelname)-8s %(message)s',
    handlers=[logging.StreamHandler(sys.stdout)],
    level=logging.INFO,
    datefmt='%Y-%m-%d %H:%M:%S'
)
log = CustomAdapter(logging.getLogger(__name__), {})

log.info("important information")

sqs = boto3.resource('sqs', region_name=os.environ['AWS_REGION'])

输出:

2020-04-13 13:24:38 INFO     [NSTID: 24533] important information
2020-04-13 13:24:38 INFO     Found credentials in shared credentials file: ~/.aws/credentials

第一行来自我的代码,第二行来自 boto3

【讨论】:

  • 你的第二行仍然没有 NSTID
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2011-11-29
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多