Saya tahu ini adalah jawaban yang sudah dipecahkan, tetapi menurut django> = 1.3 ada pengaturan logging baru.
Pindah dari lama ke baru tidak otomatis, jadi saya pikir saya akan menuliskannya di sini.
Dan tentu saja periksa dokumen django untuk lebih banyak lagi.
Ini adalah konfigurasi dasar, dibuat secara default dengan django-admin createproject v1.3 - jarak tempuh mungkin berubah dengan versi django terbaru:
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,
}
}
}
Struktur ini didasarkan pada dictConfig logging Python standar , yang menentukan blok-blok berikut:
Saya biasanya melakukan setidaknya ini:
- tambahkan file .log
- konfigurasikan aplikasi saya untuk menulis ke log ini
Yang diterjemahkan menjadi:
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'
},
}
edit
Lihat pengecualian permintaan sekarang selalu dicatat dan Tiket # 16288 :
Saya memperbarui contoh conf di atas untuk secara eksplisit menyertakan filter yang benar untuk mail_admins sehingga, secara default, email tidak dikirim ketika debug adalah True.
Anda harus menambahkan filter:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
dan terapkan ke penangan mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
Jika django.core.handers.base.handle_uncaught_exception
tidak, kesalahan tidak akan lolos ke pencatat 'django.request' jika pengaturan.DEBUG adalah True.
Jika Anda tidak melakukan ini di Django 1.5 Anda akan mendapatkan
DeprecationWarning: Anda tidak memiliki filter yang ditentukan pada penangan logging 'mail_admins': menambahkan filter implisit debug-false-only
tetapi semuanya masih akan bekerja dengan benar KEDUA di django 1.4 dan django 1.5.
** akhiri edit **
Conf itu sangat terinspirasi oleh contoh conf di dokumen django, tetapi menambahkan bagian file log.
Saya sering juga melakukan hal berikut:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Kemudian dalam kode python saya, saya selalu menambahkan NullHandler jika tidak ada konfigurasi logging yang ditentukan sama sekali. Ini menghindari peringatan karena tidak ada Handler yang ditentukan. Terutama berguna untuk lib yang tidak perlu dipanggil hanya di Django ( 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.')
Semoga ini membantu!