Exemple Simple Log to File pour django 1.3+

96

Les notes de publication disent:

Django 1.3 ajoute un support au niveau du framework pour le module de journalisation de Python.

C'est zonte. J'aimerais en profiter. Malheureusement, la documentation ne me remet pas tout sur un plateau d'argent sous la forme d'un exemple de code de travail complet qui démontre à quel point cela est simple et précieux.

Comment configurer cette nouvelle fonctionnalité géniale pour que je puisse poivrer mon code avec

logging.debug('really awesome stuff dude: %s' % somevar)

et voir le fichier "/tmp/application.log" se remplir de

18:31:59 Apr 21 2011 awesome stuff dude: foobar
18:32:00 Apr 21 2011 awesome stuff dude: foobar
18:32:01 Apr 21 2011 awesome stuff dude: foobar

Quelle est la différence entre la journalisation Python par défaut et ce `` support au niveau du framework ''?

John Mee
la source

Réponses:

183

J'adore vraiment cela, voici votre exemple de travail! Sérieusement, c'est génial!

Commencez par mettre ceci dans votre settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'null': {
            'level':'DEBUG',
            'class':'django.utils.log.NullHandler',
        },
        'logfile': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': SITE_ROOT + "/logfile",
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console':{
            'level':'INFO',
            'class':'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers':['console'],
            'propagate': True,
            'level':'WARN',
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'MYAPP': {
            'handlers': ['console', 'logfile'],
            'level': 'DEBUG',
        },
    }
}

Maintenant qu'est-ce que tout cela signifie?

  1. Formateurs J'aime qu'il ait le même style que ./manage.py runserver
  2. Gestionnaires - Je veux deux journaux - un fichier texte de débogage et une console d'informations. Cela me permet de vraiment creuser (si nécessaire) et de regarder un fichier texte pour voir ce qui se passe sous le capot.
  3. Enregistreurs - Voici où nous définissons ce que nous voulons enregistrer. En général, django obtient WARN et au-dessus - l'exception (donc propager) est les backends où j'aime voir les appels SQL car ils peuvent devenir fous .. Le dernier est mon application où j'ai deux gestionnaires et y pousse tout.

Maintenant, comment puis-je activer MYAPP pour l'utiliser ...

Selon la documentation, placez-le en haut de vos fichiers (views.py).

import logging
log = logging.getLogger(__name__)

Ensuite, pour sortir quelque chose, faites ceci.

log.debug("Hey there it works!!")
log.info("Hey there it works!!")
log.warn("Hey there it works!!")
log.error("Hey there it works!!")

Les niveaux de journalisation sont expliqués ici et pour python pur ici .

rh0dium
la source
7
J'ai suivi les étapes ci-dessus. Le fichier est créé mais rien n'y est écrit. pleas help
Vivek S
12
@InternalServerError vous devez remplacer MYAPP par le nom de votre application dans la section des enregistreurs.
Rog
9
Tu paries! Remplacez 'MYAPP' par ''
rh0dium
10
Pour clarifier, tout ce que vous appelez l'enregistreur settings.py, c'est- MYAPPà- dire dans cet exemple, doit également être le paramètre dans l'appel à logging.getLogger. Par conséquent, si votre projet contient de nombreuses applications autonomes et que vous souhaitez qu'elles utilisent un enregistreur commun, vous devez utiliser à la logging.getLogger('MYAPP')place delogging.getLogger(__name__)
rhunwicks
3
Cela fonctionne très bien. J'ai dû utiliser 'class': 'logging.NullHandler' car 'django.utils.log.NullHandler' n'est plus valide, mais le reste a fonctionné pour moi en 1.11
JacquelineIO
4

Basé en partie sur la configuration de journalisation suggérée par rh0dium et quelques recherches supplémentaires que j'ai effectuées moi-même, j'ai commencé à assembler un exemple de projet Django avec de jolis paramètres de journalisation par défaut - fail-nicely-django .

Exemple de sortie de fichier journal:

2016-04-05 22:12:32,984 [Thread-1    ] [INFO ] [djangoproject.logger]  This is a manually logged INFO string.
2016-04-05 22:12:32,984 [Thread-1    ] [DEBUG] [djangoproject.logger]  This is a manually logged DEBUG string.
2016-04-05 22:12:32,984 [Thread-1    ] [ERROR] [django.request      ]  Internal Server Error: /
Traceback (most recent call last):
  File "/Users/kermit/.virtualenvs/fail-nicely-django/lib/python3.5/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/kermit/.virtualenvs/fail-nicely-django/lib/python3.5/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/kermit/projekti/git/fail-nicely-django/djangoproject/brokenapp/views.py", line 12, in brokenview
    raise Exception('This is an exception raised in a view.')
Exception: This is an exception raised in a view.

L'utilisation détaillée est expliquée dans le README , mais essentiellement, vous copiez le module de journalisation dans votre projet Django et l'ajoutez from .logger import LOGGINGen bas de votre settings.py .

metakermit
la source