1
votes

Comment spécifier une classe de gestionnaire de journal avec un argument requis à l'aide de la syntaxe dictConfig?

Je souhaite utiliser le gestionnaire de journalisation Notifiers dans Django. Mes enregistreurs sont spécifiés en utilisant la syntaxe dictConfig.

Voici un exemple tiré de la documentation de Notifer:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/django/debug.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

La syntaxe dictConfig est comme ceci:

>>> import logging
>>> from notifiers.logging import NotificationHandler

>>> log = logging.getLogger(__name__)
>>> defaults = {
...    'token': 'foo,
...    'user': 'bar
... }

>>> hdlr = NotificationHandler('pushover', defaults=defaults)
>>> hdlr.setLevel(logging.ERROR)

>>> log.addHandler(hdlr)
>>> log.error('And just like that, you get notified about all your errors!')

Comment ajouter le gestionnaire Notifier en utilisant cette dernière syntaxe? Je ne trouve pas de moyen de définir le premier argument requis sur NotificationHandler.


0 commentaires

3 Réponses :


1
votes

Spécifiez peut-être votre propre classe de fabrique pour instancier le gestionnaire. Cela peut être fait avec la syntaxe () décrite ici:

https: //docs.python .org / 3 / library / logging.config.html # logging-config-dict-userdef


0 commentaires

0
votes

Je pense que cela devrait fonctionner en ajoutant un nouveau gestionnaire :

'notify': {
        'level': 'DEBUG',
        'class': 'CustomNotificationHandler',
    },

Mise à jour

Une solution pourrait être comme ceci en remplaçant NotificationHandler:

class CustomNotificationHandler(NotificationHandler):
     def __init__(self, *args, **kwargs):
         defaults = {
           'token': 'foo,
           'user': 'bar
         }
         super(CustomNotificationHandler, self).__init__('pushover', defaults)

et en l'utilisant dans le gestionnaire dans la journalisation django.

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/django/debug.log',
        },
        'notify': {
            'level': 'DEBUG',
            'class': 'notifiers.logging.NotificationHandler',
        },
    },
    'loggers': {
        'django': {  # or you can add any new logger if you want
            'handlers': ['notify'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}


4 commentaires

Mais de cette façon, vous ne pouvez pas spécifier les arguments de notifiers.logging.NotificationHandler .. C'était mon problème en premier lieu.


Oui. Btw, votre réponse a l'air géniale, mais pouvez-vous s'il vous plaît jeter un œil à ma réponse mise à jour. Merci


Oui, cela devrait fonctionner mais l'usine est plus élégante, non ☺️?


Oui, c'est beaucoup plus propre :)



3
votes

Grâce à @jspcal, j'ai trouvé la réponse. Définissez une fabrique de gestionnaires comme ceci:

...

'handlers': {
    'slack': {
        '()': slack_handler_factory,
        'level': 'WARNING',
    },
...

.. et on peut l'ajouter aux gestionnaires en utilisant la ()-syntax:

def slack_handler_factory():
    return NotificationHandler(
        'slack',
        defaults={
            'webhook_url': SLACK_WEBHOOK_URL,
        },
    )


0 commentaires