web-dev-qa-db-fra.com

Aucun gestionnaire n'a pu être trouvé pour l'enregistreur

Je suis un débutant à Django. J'essaie pour Django se connecter maintenant. Pendant que j'essaye, j'obtiens cette erreur ["Aucun gestionnaire n'a pu être trouvé pour le logger" sample ""]] .. voici mon code,

(Dans mon settings.py)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': '/home/linuxuser/mani/f/logs/msg.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'simple',
        },
    },
    'loggers': {
        'sample': {
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

(Dans mes vues.py)

import logging
import logging.handlers
from Django.conf import settings
logger = logging.getLogger('sample')

def empdel(request,id):
    e = get_object_or_404(emp, pk=id)
    e.delete()
    logger.info('A row is deleted successfully !!!')
    return HttpResponseRedirect('/empthanks/')

Lors de l'exécution de ce code, j'ai eu cette erreur, c'est-à-dire ["Aucun gestionnaire n'a pu être trouvé pour" exemple "de l'enregistreur]] .. Quel est le problème avec mon code? Pourquoi j'obtiens une telle erreur même si j'utilise un gestionnaire dans LOGGING? et j'essaie également d'enregistrer le message de journal dans le fichier que j'ai utilisé dans la journalisation ... une idée ?? Merci d'avance !!!

21
Mani

Les documents ne sont pas assez clairs à ce sujet, mais lorsque vous utilisez la fonctionnalité intégrée pour spécifier les paramètres de journalisation, vous n'avez pas besoin d'obtenir une instance de l'enregistreur.

Vous feriez simplement ce qui suit:

import logging

def empdel(request,id):
    e = get_object_or_404(emp, pk=id)
    e.delete()
    logging.info('A row is deleted successfully !!!')
    return HttpResponseRedirect('/empthanks/')
23
xeeton

Je pense que vous avez mal compris ce qu'est un Handler dans le contexte du package logging.

Un gestionnaire est un objet que vous attachez à un enregistreur. Chaque fois que l'enregistreur a un message à traiter, il envoie le message à tous ses gestionnaires. En outre, les enregistreurs existent dans une structure arborescente, avec l'enregistreur "racine" bien nommé à sa racine. Après avoir envoyé un message à ses gestionnaires, un enregistreur peut le transmettre à son parent dans l'arborescence (déterminé par l'attribut propagate de l'instance de l'enregistreur).

À part un peu humoristique, j'ai trouvé un bogue d'application dans lequel quelqu'un a commencé à utiliser le Logger nommé "root", qui est différent du Root Logger.

N'utilisez pas l'enregistreur racine (accessible par logging.info Et la société, ou logging.getLogger()). Les gestionnaires que vous attachez ou les paramètres que vous modifiez affecteront également les bibliothèques qui se comportent correctement et propagent leurs erreurs jusqu'à l'enregistreur racine. Exemple: j'ai par le passé écrit un script simple en utilisant le root logger par paresse. J'ai ensuite incorporé quelques appels à boto et obtenu une explosion de messages de débogage qui étaient propagés à l'enregistreur racine. Il est recommandé de toujours créer un enregistreur dont le nom correspond au nom de votre package dans l'espace de noms (cela conduit également à une structure d'héritage Nice avec l'interprétation de getLogger de .) En créant des enregistreurs avec logging.getLogger(__name__)

Je recommande fortement de lire attentivement la section sur les objets enregistreurs dans les documents logging: https://docs.python.org/2/library/logging.html

Vous remarquerez peut-être que votre configuration spécifie également un Formatter. Les formateurs gèrent la présentation d'un message lorsqu'il est traité par un gestionnaire, de sorte qu'un seul message peut être formaté différemment pour la sortie du terminal que pour, par exemple, rsyslog.


Tout cela étant dit, pour corriger votre code, vous pouvez utiliser l'enregistreur que vous avez créé et y attacher simplement un gestionnaire. Je recommanderais de créer un StreamHandler (la classe de base Handler n'est pas destinée à être instanciée, mais pour des raisons horribles n'est pas un ABC), car cela couvre un grand nombre de cas d'utilisation typiques.

myhandler = logging.StreamHandler()  # writes to stderr
myformatter = logging.Formatter(fmt='%(levelname)s: %(message)s')
myhandler.setFormatter(myformatter)
logger.addHandler(myhandler)

Cependant, il semble que Django config inclut déjà une grande partie de ces informations, pas configuré de la façon dont je fais les choses ci-dessus, bien sûr. Ne pas avoir réellement écrit Django = apps, je ne veux pas vous donner de mauvaises informations à ce sujet, mais Django fournit de beaux documents ici: https://docs.djangoproject.com/en/dev/ topics/logging /

13
sirosen