Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

logging et record_factory pour mettre ses propres properties dans les logs

+2 votes

Avec Django je veux écrire dans une table, des logs relatives à un trigger

j'ai trouvé un point de départ ici http://james.lin.net.nz/2012/09/19/creating-custom-log-handler-that-logs-to-database-models-in-django/

le modele

class LogTriggerService(models.Model):
    """
    LogTriggerService
    """
    level = models.CharField(max_length=200)
    msg = models.CharField(max_length=200)
    trigger = models.ForeignKey(TriggerService)
    date_log = models.DateTimeField(auto_now=True)

Le Handler

class DBHandler(Handler, object):
    """
    This handler will add logs to a database model defined in settings.py
    If log message (pre-format) is a json string, it will try to apply the array onto the log event object
    """
    def __init__(self, model="LogTriggerService", expiry=0):
    super(DBHandler, self).__init__()
    self.model_name = model
    self.expiry = int(expiry)

    def emit(self, record):
            from django_th.models import LogTriggerService
    LogTriggerService(level=record.levelname, message=self.format(record), trigger=record.trigger_id)

j'ai tenté d'utiliser ce que la doc explique ici https://docs.python.org/3/howto/logging-cookbook.html#customizing-logrecord

avec ca

 old_factory = logging.getLogRecordFactory()

 def record_factory(*args, **kwargs):
     record = old_factory(*args, **kwargs)
     record.trigger_id = 0
     return record

 logging.setLogRecordFactory(record_factory)
 logger = logging.getLogger('django_th.trigger_happy')
 logger.critical('rate', **{'trigger_id': id})

mais je dois m'y prends de traviole car je me coltine une erreur

  File "/usr/lib/python3.4/logging/__init__.py", line 1274, in info
     self._log(INFO, msg, args, **kwargs)
TypeError: _log() got an unexpected keyword argument 'trigger_id'

Si vous avez déjà taté record_factory je suis preneur :)

demandé 1-Oct-2016 par foxmask (2,670 points)

Pourquoi j'ai toujours pas appris à utiliser django? )='

À priori ce que je veux faire n'est pas réalisable en tripotant logger()
Et faire un truc qui le mime je trouve ça dommage de surcharger le code
Ça fait tarte.
Je teste cet après-midi un autre solution

Tiens nous au courant fox !

1 Réponse

+1 vote
 
Meilleure réponse

je me suis résigné en faisant une fonction toute QQ à chaque fois que j'ai une Exception :

def update_result(trigger_id, msg):
    TriggerService.objects.filter(id=trigger_id).update(result=msg)

genre pour créer une note Evernote :

# create the note !
try:
    created_note = note_store.createNote(note)
    sentence = str('note %s created') % created_note.guid
    logger.debug(sentence)
    return True
except EDAMSystemException as e:
    if e.errorCode == EDAMErrorCode.RATE_LIMIT_REACHED:
        sentence = "Rate limit reached {code} " \
                   "Retry your request in {msg} seconds".format(
                    code=e.errorCode, msg=e.rateLimitDuration)
        logger.warn(sentence)
        update_result(trigger_id, msg=sentence)
        return True
    else:
        logger.critical(e)
        return False
except EDAMUserException as e:
    if e.errorCode == EDAMErrorCode.ENML_VALIDATION:
        sentence = "Data ignored due to validation" \
                   " error : err {code} {msg}".format(
                    code=e.errorCode, msg=e.parameter)
        logger.warn(sentence)
        update_result(trigger_id, msg=sentence)
        return True
except Exception as e:
    logger.critical(e)
    update_result(trigger_id, msg=e)
    return False
répondu 8-Oct-2016 par foxmask (2,670 points)
sélectionné 9-Oct-2016 par foxmask
...