Ich weiß, dass dies bereits eine gelöste Antwort ist, aber gemäß django> = 1.3 gibt es eine neue Protokollierungseinstellung.
Der Wechsel von alt zu neu erfolgt nicht automatisch, daher dachte ich, ich schreibe ihn hier auf.
Und natürlich sehen Sie sich das Django-Dokument noch einmal an.
Dies ist die grundlegende Konfiguration, die standardmäßig mit django-admin createproject v1.3 erstellt wurde. Der Kilometerstand kann sich mit den neuesten django-Versionen ändern:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
}
}
}
Diese Struktur basiert auf der Standard- Python-Protokollierung dictConfig , die die folgenden Blöcke vorschreibt:
formatters
- Der entsprechende Wert ist ein Diktat, bei dem jeder Schlüssel eine Formatierungs-ID ist und jeder Wert ein Diktat ist, das beschreibt, wie die entsprechende Formatierungsinstanz konfiguriert wird.
filters
- Der entsprechende Wert ist ein Diktat, bei dem jeder Schlüssel eine Filter-ID ist und jeder Wert ein Diktat ist, das beschreibt, wie die entsprechende Filterinstanz konfiguriert wird.
handlers
- Der entsprechende Wert ist ein Diktat, bei dem jeder Schlüssel eine Handler-ID und jeder Wert ein Diktat ist, das beschreibt, wie die entsprechende Handler-Instanz konfiguriert wird. Jeder Handler verfügt über die folgenden Schlüssel:
class
(verpflichtend). Dies ist der vollständig qualifizierte Name der Handlerklasse.
level
(Optional). Das Level des Handlers.
formatter
(Optional). Die ID des Formatierers für diesen Handler.
filters
(Optional). Eine Liste der IDs der Filter für diesen Handler.
Normalerweise mache ich mindestens Folgendes:
- Fügen Sie eine .log-Datei hinzu
- Konfigurieren Sie meine Apps so, dass sie in dieses Protokoll schreiben
Was bedeutet:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# I always add this handler to facilitate separating loggings
'log_file':{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(VAR_ROOT, 'logs/django.log'),
'maxBytes': '16777216', # 16megabytes
'formatter': 'verbose'
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'apps': { # I keep all my of apps under 'apps' folder, but you can also add them one by one, and this depends on how your virtualenv/paths are set
'handlers': ['log_file'],
'level': 'INFO',
'propagate': True,
},
},
# you can also shortcut 'loggers' and just configure logging for EVERYTHING at once
'root': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO'
},
}
bearbeiten
Siehe Anforderungsausnahmen werden jetzt immer protokolliert und Ticket Nr. 16288 :
Ich habe das obige Beispiel conf so aktualisiert, dass es explizit den richtigen Filter für mail_admins enthält, sodass standardmäßig keine E-Mails gesendet werden, wenn das Debugging True ist.
Sie sollten einen Filter hinzufügen:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
und wenden Sie es auf den handler mail_admins an:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
Andernfalls werden django.core.handers.base.handle_uncaught_exception
keine Fehler an den Logger 'django.request' übergeben, wenn settings.DEBUG True ist.
Wenn Sie dies in Django 1.5 nicht tun, erhalten Sie eine
DeprecationWarning: Im Protokollierungshandler 'mail_admins' sind keine Filter definiert: Hinzufügen eines impliziten Debug-False-Only-Filters
Aber in Django 1.4 und Django 1.5 werden die Dinge immer noch korrekt funktionieren.
** Bearbeitung beenden **
Diese conf ist stark von der Beispielkonf im Django-Dokument inspiriert, fügt jedoch den Teil der Protokolldatei hinzu.
Ich mache oft auch folgendes:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Dann füge ich in meinem Python-Code immer einen NullHandler hinzu, falls überhaupt keine Protokollierungskonfiguration definiert ist. Dadurch werden Warnungen vermieden, für die kein Handler angegeben wurde. Besonders nützlich für Bibliotheken, die nicht unbedingt nur in Django aufgerufen werden ( ref )
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
class NullHandler(logging.Handler): #exists in python 3.1
def emit(self, record):
pass
nullhandler = logger.addHandler(NullHandler())
# here you can also add some local logger should you want: to stdout with streamhandler, or to a local file...
[...]
logger.warning('etc.etc.')
Hoffe das hilft!