Ho un gestore di registrazione personalizzato che desidero gestire tutti i livelli dei messaggi di registrazione (INFO, WARN, DEBUG, ERROR, ecc.) E inviarlo a un server di analisi dei dati. Per ogni messaggio, i dati includeranno i campi sul record e sull'oggetto di richiesta originale.Recupero dell'oggetto di richiesta in un gestore di logging Django personalizzato
Il problema è che non ho visto l'oggetto richiesta collegato a nessuno dei record. Ho trovato nella documentazione ufficiale che solo i messaggi di django.request hanno l'oggetto richiesta allegato al record, ma non menzionano cosa siano specificamente i messaggi di django.request. (https://docs.djangoproject.com/en/1.9/topics/logging/#django-request).
Che cosa sono i messaggi di django.request? Come/quando vengono licenziati? Come posso reindirizzare ogni messaggio di registrazione per avere l'oggetto richiesta su di esso in modo che il gestore possa allegare i dati che verranno inviati a un server proxy?
---- ---- gestore
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,
},
}
}
Il codice di esempio che si presenta non utilizza mai il gestore di registri "splunk". Hai configurato il logger 'django.request' in modo che i suoi gestori siano 'console' e 'loghandler'. – bignose