4

我有许多用 python django 编写的应用程序代码,每个应用程序都使用标准的 python 记录器模块,并且只记录了一个简单的消息字符串。

现在有什么方法可以添加我自己的客户中间件或 django 应用程序,当在他们的方法中调用日志记录时,它应该到达我的函数,我将为日志添加更多价值,制作正确的 json 格式,然后写入日志文件。因此,在当前的应用程序开发人员中,除了需要添加我的 django 应用程序或中间件外,不需要做很多更改

4

1 回答 1

9

您可以使用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 日志格式化程序

如果需要,您可以覆盖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',
        }
于 2019-05-06T07:01:22.790 回答