ฉันรู้ว่านี่เป็นคำตอบที่ได้รับการแก้ไขแล้ว แต่ตาม django> = 1.3 มีการตั้งค่าการบันทึกใหม่
การย้ายจากเก่าไปใหม่ไม่ใช่เรื่องอัตโนมัติดังนั้นฉันคิดว่าฉันจะเขียนมันไว้ที่นี่
และแน่นอนตรวจสอบ django docสำหรับข้อมูลเพิ่มเติม
นี่คือคอนฟิกพื้นฐานที่สร้างขึ้นโดยค่าเริ่มต้นด้วย django-admin createproject v1.3 - ระยะทางอาจเปลี่ยนแปลงด้วย django เวอร์ชันล่าสุด:
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,
}
}
}
โครงสร้างนี้ยึดตามมาตรฐานPython logging dictConfigซึ่งกำหนดบล็อกต่อไปนี้:
ฉันมักจะทำสิ่งนี้อย่างน้อยที่สุด:
- เพิ่มไฟล์. log
- กำหนดค่าแอปของฉันให้เขียนลงในบันทึกนี้
ซึ่งแปลเป็น:
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'
},
}
แก้ไข
ดูข้อยกเว้นของคำขอจะถูกบันทึกไว้เสมอและตั๋ว # 16288 :
ฉันอัปเดตคอนฟิกตัวอย่างข้างต้นเพื่อรวมตัวกรองที่ถูกต้องสำหรับ mail_admins ไว้อย่างชัดเจนดังนั้นโดยค่าเริ่มต้นอีเมลจะไม่ถูกส่งเมื่อการดีบักเป็น True
คุณควรเพิ่มตัวกรอง:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
และนำไปใช้กับตัวจัดการ mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
มิฉะนั้นdjango.core.handers.base.handle_uncaught_exception
จะไม่ส่งข้อผิดพลาดไปยังตัวบันทึก 'django.request' หากการตั้งค่า DEBUG เป็น True
หากคุณไม่ทำสิ่งนี้ใน Django 1.5 คุณจะได้รับไฟล์
DeprecationWarning: คุณไม่มีตัวกรองที่กำหนดไว้ในตัวจัดการการบันทึก 'mail_admins': การเพิ่มตัวกรองการดีบักโดยนัย - เท็จเท่านั้น
แต่สิ่งต่างๆจะยังคงทำงานได้อย่างถูกต้องทั้งใน django 1.4 และ django 1.5
** สิ้นสุดการแก้ไข **
conf นั้นได้รับแรงบันดาลใจอย่างมากจากตัวอย่าง conf ใน django doc แต่เพิ่มส่วนของไฟล์บันทึก
ฉันมักจะทำสิ่งต่อไปนี้:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
จากนั้นในรหัส python ของฉันฉันจะเพิ่ม NullHandler เสมอในกรณีที่ไม่มีการกำหนด Conf การบันทึกใด ๆ สิ่งนี้หลีกเลี่ยงคำเตือนสำหรับไม่ได้ระบุ Handler มีประโยชน์อย่างยิ่งสำหรับ libs ที่ไม่จำเป็นต้องเรียกเฉพาะใน 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.')
หวังว่านี่จะช่วยได้!