Python логирование и сторонние модули - PullRequest
0 голосов
/ 13 апреля 2020

Я изо всех сил пытаюсь заставить Python регистрировать, как я хочу. Я добавил некоторый контекст в свои операторы журнала, добавив фильтр и обновив строку формата, чтобы напечатать содержимое фильтра. Это работает, как и ожидалось, пока all код мой.

Но если сторонний модуль что-то регистрирует, он выдает ошибку, потому что этот модуль не знает о моем фильтре.

Как получить контекст в моих журналах, не взрывая журналы сторонних модулей?

Этот код отлично работает в моих модулях. Но если сторонний модуль хочет что-то зарегистрировать, он не знает о моем 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")

1 Ответ

0 голосов
/ 13 апреля 2020

Я смог получить то, что мне было нужно, используя 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

...