Есть ли способ изменить текущее ведение журнала в формате JSON с немногими другими полями, добавлены ведение журнала Python - PullRequest
1 голос
/ 06 мая 2019

У меня есть много кода приложения, написанного на python django, и каждое приложение использует стандартный модуль python logger, и просто регистрируются простые строки сообщений.

Теперь есть какой-нибудь способ, где я могу добавить свое собственное клиентское промежуточное ПО или приложение django, где когда бы ни вызывалось ведение журнала в их методах, оно должно достигать моей функции, и я добавлю больше значения в журналы, сделаю правильный формат json и затем запишите в файл журнала. Так что в текущем приложении разработчику не нужно вносить много изменений, кроме того, что ему нужно добавить мое приложение django или промежуточное ПО

1 Ответ

2 голосов
/ 06 мая 2019

Вы можете использовать json_log_formatter .Вы можете установить его следующим образом:

pip install JSON-log-formatter==0.2.0

В django вам необходимо обновить настройки журналов следующим образом:

LOGGING = {
    ...
    'formatters': {
        "json": {
            '()': 'json_log_formatter.JSONFormatter',
        }
    },
    ...
}

И использовать его в своем коде следующим образом:

import logging

logger_name = 'some_name'
logger = logging.getLogger(logger_name)

logger.info('Sign up', extra={'referral_code': '52d6ce'})

Здесь дополнительный параметр, передаваемый здесь, будет отображаться в журнале следующим образом (из документации):

{
    "message": "Sign up",
    "time": "2015-09-01T06:06:26.524448",
    "referral_code": "52d6ce"
}

Переопределить Json Log Formatter

Вы можете переопределить json_log_formatter.JSONFormatter класс, чтобы добавить дополнительную информацию, такую ​​как IP-адрес, если это необходимо.Как это:

import json_log_formatter


class CustomJsonFormatter(json_log_formatter.JSONFormatter):

    def json_record(self, message, extra, record):
        request = extra.pop('request', None)
        if request:
            extra['IP_ADDRESS'] = request.META.get('HTTP_X_FORWARDED_FOR')  # or other ways to get ip
        return super(CustomJsonFormatter, self).json_record(message, extra, record)

# usage
logger.info('Sign up', extra={'referral_code': '52d6ce', 'request': request })  # django request object
# Django Settings
     'formatters': {
        "json": {
            '()': 'path.to.CustomJsonFormatter',
        }
...