В моей организации мы пишем много кода 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")
Это работает, но имеет следующие недостатки:
- Я не могу установить настраиваемые поля
log_record['applicationName']
и log_record['applicationVersion']
- Я не могу изменить свой уровень ведения журнала (например, если был передан флаг --debug)
Есть ли у кого-нибудь предложения по решению этих проблем?
Я думал о создании функции в модуле ведения журнала, которая только что вернула регистратор, а затем я мог бы передать несколько параметров, таких как журнал уровень до этого, но это не сработает, если я хочу получить журналы из других моих модулей.
В основном у меня будут приложения, которые могут выглядеть так, и я хочу получать журналы от всех из них с параметры applicationName: my_app
, et c
|- myapp.py
|--- org/logging.py
|--- org/something.py