有什么方法可以将当前的日志记录修改为 json 格式,并添加一些其他字段 python 日志记录

Nag*_*nan 3 django django-middleware django-logging python-logging

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

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

rud*_*dra 5

您可以使用json_log_formatter。您可以通过以下方式安装它:

pip install JSON-log-formatter==0.2.0
Run Code Online (Sandbox Code Playgroud)

在 Django 中,您需要像这样更新日志设置:

LOGGING = {
    ...
    'formatters': {
        "json": {
            '()': 'json_log_formatter.JSONFormatter',
        }
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

并在您的代码中使用它,如下所示:

import logging

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

logger.info('Sign up', extra={'referral_code': '52d6ce'})
Run Code Online (Sandbox Code Playgroud)

这里通过这里发送的额外参数将在日志中呈现如下(来自文档):

{
    "message": "Sign up",
    "time": "2015-09-01T06:06:26.524448",
    "referral_code": "52d6ce"
}
Run Code Online (Sandbox Code Playgroud)

覆盖 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',
        }
Run Code Online (Sandbox Code Playgroud)