Ich verfüge über einen benutzerdefinierten Protokollierungshandler, mit dem alle Protokollierungsebenen (INFO, WARN, DEBUG, ERROR usw.) verarbeitet und an einen Datenanalyseserver gesendet werden sollen. Für jede Nachricht enthalten die Daten Felder im Datensatz und im ursprünglichen Anforderungsobjekt.Abrufen des Anforderungsobjekts in einem benutzerdefinierten Django-Protokollierungshandler
Das Problem ist, dass ich das Anforderungsobjekt, das keinem der Datensätze beigefügt ist, nicht gesehen habe. Ich fand auf der offiziellen Dokumentation, dass nur django.request Nachrichten haben das Anfrageobjekt an den Datensatz angehängt, aber keine Erwähnung, was speziell django.request Nachrichten sind. (https://docs.djangoproject.com/en/1.9/topics/logging/#django-request).
Was sind django.request-Nachrichten? Wie/Wann werden sie gefeuert? Wie kann ich jede Logging-Nachricht umleiten, um das Anfrageobjekt darauf zu haben, damit mein Handler die Daten anhängen kann, die an einen Proxy-Server gesendet werden?
---- ---- Handler
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)
----- ----- 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,
},
}
}
Der Beispielcode, den Sie verwenden, verwendet niemals Ihren 'Splunk' Log-Handler. Sie haben den Logger 'django.request' so konfiguriert, dass die Handler 'console' und 'loghandler' sind. – bignose