Bunun zaten çözülmüş bir cevap olduğunu biliyorum, ancak django> = 1.3'e göre yeni bir kayıt ayarı var.
Eskiden yeniye geçmek otomatik değildir, bu yüzden buraya yazacağımı düşündüm.
Ve elbette biraz daha fazlası için django belgesine bakın.
Bu, django-admin createproject v1.3 ile varsayılan olarak oluşturulan temel yapılandırmadır - kilometre, en son django sürümleriyle değişebilir:
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,
}
}
}
Bu yapı, aşağıdaki blokları dikte eden standart Python günlük kaydı dictConfig'e dayanmaktadır :
Genellikle en azından şunu yapıyorum:
- .log dosyası ekle
- uygulamalarımı bu günlüğe yazacak şekilde yapılandır
Bunun anlamı:
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'
},
}
Düzenle
İstisnaları görün artık her zaman günlüğe kaydedilir ve Bilet # 16288 :
Yukarıdaki örnek conf'i mail_admins için doğru filtreyi açıkça içerecek şekilde güncelledim, böylece hata ayıklama True olduğunda e-postalar varsayılan olarak gönderilmez.
Bir filtre eklemelisiniz:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
ve bunu mail_admins işleyicisine uygulayın:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
Aksi takdirde django.core.handers.base.handle_uncaught_exception
settings.DEBUG True ise hataları 'django.request' günlükçüsüne iletmez.
Bunu Django 1.5'te yapmazsanız, bir
Kullanımdan kaldırma Uyarı: 'mail_admins' günlük işleyicisinde tanımlanmış hiçbir filtre yok: örtük hata ayıklama yalnızca yanlış filtre ekleme
ancak her şey yine de django 1.4 ve django 1.5'te düzgün çalışacaktır.
** düzenlemeyi bitir **
Bu conf, django belgesindeki örnek conf'den esinlenmiştir, ancak günlük dosyası kısmı eklenir.
Sık sık şunları da yaparım:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Daha sonra python kodumda, herhangi bir günlüğe kaydetme conf tanımlanmaması durumunda her zaman bir NullHandler eklerim. Bu, hiçbir İşleyici belirtilmemiş için uyarıları önler. Özellikle sadece Django'da çağrılması gerekmeyen kitaplıklar için kullanışlıdır ( 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.')
Bu yardımcı olur umarım!