use*_*853 7 python django logging request
我有一个自定义日志处理程序,我想处理所有日志消息级别(INFO,WARN,DEBUG,ERROR等)并将其发送到数据分析服务器.对于每条消息,数据将包括记录和原始请求对象上的字段.
问题是我没有看到附加到任何记录的请求对象.我在官方文档中发现只有django.request消息将请求对象附加到记录中,但没有提到具体的django.request消息.(https://docs.djangoproject.com/en/1.9/topics/logging/#django-request).
什么是django.request消息?他们如何/何时开除?如何重新路由每个日志消息以在其上包含请求对象,以便我的处理程序可以附加将发送到代理服务器的数据?
---- ----处理
class LogHandler(logging.Handler):
request = None
def __init__(self, request=None):
logging.Handler.__init__(self)
def parse_record_to_json(self, record):
import json
created = datetime.datetime.fromtimestamp(record.created)
return {
'timestamp': created.strftime('%m/%d/%Y %H:%M:%S'),
'method': record.funcName,
'level': record.levelname,
'line': record.lineno,
'module': record.module,
'message': record.getMessage(),
'path': record.pathname,
}
def emit(self, record):
user_id = None
try:
self.request = record.request
if self.request.user.is_authenticated():
user_id = self.request.user.id
except:
print "this must not be a django.request message"
self.request = None
from .event import SendEvent
json_record = self.parse_record_to_json(record)
level = json_record.pop('level', None)
SendEvent(key="server_log",
name=level,
request=self.request,
obj=json_record,
user=user_id)
Run Code Online (Sandbox Code Playgroud)
----- ----- settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(levelname)s %(name)s %(asctime)s %(filename)s:%(lineno)s] %(message)s',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'standard',
},
'null': {
'level': 'DEBUG',
'class': 'django.utils.log.NullHandler',
},
'splunk':{
'class':'proj.common.handlers.LogHandler',
}
},
# 'root': {
# 'handlers': ['console', 'loghandler',],
# 'level': 'INFO',
# 'formatter':'standard',
# },
'loggers': {
'django':{
'handlers':['console'],
'level':'INFO',
'formatter':'standard',
},
'py.warnings':{
'handlers': ['null',],
'propagate': False,
},
'django.request':{
'handlers':['console','loghandler'],
'propogate':False,
},
}
}
Run Code Online (Sandbox Code Playgroud)
要回答 \xe2\x80\x9cdjango.request消息是什么\xe2\x80\x9d:记录器是Django 提供的 Python 记录器django.request之一。因此,消息是发送到记录器的日志消息。正如您所发现的,Django 文档说django.requestdjango.request:
\n\n\n发送至此记录器的消息具有以下额外上下文:
\n\n\n
\n- \n
status_code:与请求关联的 HTTP 响应代码。- \n
request:生成日志消息的请求对象。
可能不明显的是 \xe2\x80\x9cextra context\xe2\x80\x9d 随日志消息一起提供,并且这些项目成为LogRecord。
所以是的,在LogHandler.emit您定义的方法中,record参数是LogRecord. 如果记录是在记录器上创建的,则该record.request属性将是 HTTP 请求对象。django.request
仅当您将消息定向到那里时,您LogHandler才会收到消息,例如通过 Django 设置LOGGING[\'loggers\'][\'django.request\'][\'handlers\']。
| 归档时间: |
|
| 查看次数: |
1036 次 |
| 最近记录: |