我有许多用 python django 编写的应用程序代码,每个应用程序都使用标准的 python 记录器模块,并且只记录了一个简单的消息字符串。
现在有什么方法可以添加我自己的客户中间件或 django 应用程序,当在他们的方法中调用日志记录时,它应该到达我的函数,我将为日志添加更多价值,制作正确的 json 格式,然后写入日志文件。因此,在当前的应用程序开发人员中,除了需要添加我的 django 应用程序或中间件外,不需要做很多更改
我有许多用 python django 编写的应用程序代码,每个应用程序都使用标准的 python 记录器模块,并且只记录了一个简单的消息字符串。
现在有什么方法可以添加我自己的客户中间件或 django 应用程序,当在他们的方法中调用日志记录时,它应该到达我的函数,我将为日志添加更多价值,制作正确的 json 格式,然后写入日志文件。因此,在当前的应用程序开发人员中,除了需要添加我的 django 应用程序或中间件外,不需要做很多更改
您可以使用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.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',
}