Beispiel für ein einfaches Protokoll in Datei für Django 1.3+

96

In den Versionshinweisen heißt es:

Django 1.3 bietet Unterstützung auf Framework-Ebene für das Python-Protokollierungsmodul.

Das ist schön. Das möchte ich nutzen. Leider gibt mir die Dokumentation nicht alles auf einem Silbertablett in Form eines vollständigen funktionierenden Beispielcodes, der zeigt, wie einfach und wertvoll dies ist.

Wie richte ich diese funky neue Funktion so ein, dass ich meinen Code damit pfeffern kann?

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

und sehen Sie, wie die Datei "/tmp/application.log" mit gefüllt wird

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

Was ist der Unterschied zwischen der Standard-Python-Protokollierung und dieser Unterstützung auf Framework-Ebene?

John Mee
quelle

Antworten:

182

Ich liebe das wirklich so sehr, hier ist dein Arbeitsbeispiel! Im Ernst, das ist großartig!

Beginnen Sie, indem Sie dies in Ihre 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',
        },
    }
}

Was bedeutet das alles?

  1. Formatierer Ich mag es, wenn es im gleichen Stil wie ./manage.py runserver herauskommt
  2. Handler - Ich möchte zwei Protokolle - eine Debug-Textdatei und eine Infokonsole. Auf diese Weise kann ich mich (falls erforderlich) wirklich vertiefen und in einer Textdatei nachsehen, was unter der Haube passiert.
  3. Logger - Hier legen wir fest, was wir protokollieren möchten. Im Allgemeinen erhält django WARN und höher - die Ausnahme (daher propagieren) sind die Backends, in denen ich die SQL-Aufrufe gerne sehe, da sie verrückt werden können. Als letztes habe ich zwei Handler und schiebe alles darauf.

Wie aktiviere ich MYAPP, um es zu verwenden ...

Fügen Sie dies gemäß der Dokumentation oben in Ihre Dateien ein (views.py).

import logging
log = logging.getLogger(__name__)

Dann tun Sie dies, um etwas herauszuholen.

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

Die Protokollebenen werden hier und für reines Python hier erklärt .

rh0dium
quelle
7
Ich folgte den obigen Schritten. Datei wird erstellt, aber nichts wird darauf geschrieben. Bitte helfen
Vivek S
12
@InternalServerError Sie müssen MYAPP durch den Namen Ihrer App im Abschnitt Logger ersetzen.
Rog
9
Sie wetten! Ersetzen Sie 'MYAPP' durch ''
rh0dium
10
Zur Verdeutlichung muss das, was Sie den Logger aufrufen settings.py, dh MYAPPin diesem Beispiel, auch der Parameter im Aufruf von sein logging.getLogger. Wenn Ihr Projekt viele in sich geschlossene Apps enthält und Sie möchten, dass sie einen gemeinsamen Logger verwenden, müssen Sie logging.getLogger('MYAPP')stattdessenlogging.getLogger(__name__)
rhunwicks
2
Das funktioniert super. Musste 'class' verwenden: 'logging.NullHandler', weil 'django.utils.log.NullHandler' nicht mehr gültig ist, aber der Rest funktionierte für mich in 1.11
JacquelineIO
4

Basierend auf der von rh0dium vorgeschlagenen Protokollierungskonfiguration und einigen weiteren Recherchen, die ich selbst durchgeführt habe, begann ich, ein Beispiel-Django-Projekt mit netten Protokollierungsstandards zusammenzustellen - fail- nice -django .

Beispiel für die Ausgabe einer Protokolldatei:

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.

Die detaillierte Verwendung wird in der README-Datei erläutert. Im Wesentlichen kopieren Sie das Logger- Modul in Ihr Django-Projekt und fügen es from .logger import LOGGINGam Ende Ihrer settings.py hinzu .

Metakermit
quelle