Настройка поля в конфигурации pythonjsonlogger, которое используется как модуль - PullRequest
0 голосов
/ 08 мая 2020

В моей организации мы пишем много кода python. У нас есть организационный стандарт ведения журнала как json с новыми полями c, специфичными для организации.

Чтобы сохранить единообразие конфигурации ведения журнала во всей организации, я хотел создать модуль, который выглядел бы так :

import logging
from pythonjsonlogger import jsonlogger
import datetime
import sys


class CustomJsonFormatter(jsonlogger.JsonFormatter):

    def add_fields(self, log_record, record, message_dict):
        super(CustomJsonFormatter, self).add_fields(log_record, record, message_dict)
        if not log_record.get('timestamp'):
            # this doesn't use record.created, so it is slightly off
            log_record['timestamp'] = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ')
        if log_record.get('level'):
            log_record['logLevel'] = log_record['level'].upper()
        else:
            log_record['logLevel'] = record.levelname

        log_record['applicationName'] = "APP_NAME"
        log_record['applicationVersion'] = "APP_VERSION"


# Set up logging
logger = logging.getLogger(__name__)
logHandler = logging.StreamHandler(sys.stdout)
formatter = CustomJsonFormatter('(timestamp) (logLevel) (name) (message)')
logHandler.setFormatter(formatter)
logger.addHandler(logHandler)
logger.setLevel(logging.INFO)
logger.propagate = False  # This is required to prevent lambdas logging twice (see https://forums.aws.amazon.com/thread.jspa?threadID=235774)

Итак, теперь, если организация хочет использовать это, они просто импортируют модуль.

Например

from myorg.logger import logger
logger.info("Hello world")

Это работает, но имеет следующие недостатки:

  1. Я не могу установить настраиваемые поля log_record['applicationName'] и log_record['applicationVersion']
  2. Я не могу изменить свой уровень ведения журнала (например, если был передан флаг --debug)

Есть ли у кого-нибудь предложения по решению этих проблем?

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

В основном у меня будут приложения, которые могут выглядеть так, и я хочу получать журналы от всех из них с параметры applicationName: my_app, et c

|- myapp.py
|--- org/logging.py
|--- org/something.py
...