Tôi biết đây là một câu trả lời đã được giải quyết, nhưng theo django> = 1.3 có một cài đặt ghi nhật ký mới.
Chuyển từ cũ sang mới không phải là tự động, vì vậy tôi nghĩ tôi sẽ viết nó ra đây.
Và tất nhiên, hãy kiểm tra tài liệu django để biết thêm.
Đây là conf cơ bản, được tạo theo mặc định với django-admin createproject v1.3 - số dặm có thể thay đổi với các phiên bản django mới nhất:
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,
}
}
}
Cấu trúc này dựa trên dictConfig ghi nhật ký Python tiêu chuẩn , ra lệnh cho các khối sau:
Tôi thường làm ít nhất điều này:
- thêm tệp .log
- định cấu hình các ứng dụng của tôi để ghi vào nhật ký này
Dịch thành:
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'
},
}
biên tập
Xem ngoại lệ yêu cầu hiện luôn được ghi lại và Vé # 16288 :
Tôi đã cập nhật thông tin mẫu ở trên để bao gồm rõ ràng bộ lọc chính xác cho mail_admins để theo mặc định, email không được gửi khi gỡ lỗi là Đúng.
Bạn nên thêm một bộ lọc:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
và áp dụng nó cho trình xử lý mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
Nếu django.core.handers.base.handle_uncaught_exception
không, lỗi không chuyển đến trình ghi 'django.request' nếu cài đặt.DEBUG là Đúng.
Nếu bạn không làm điều này trong Django 1.5, bạn sẽ nhận được
DeprecationWarning: Bạn không có bộ lọc nào được xác định trên trình xử lý ghi nhật ký 'mail_admins': thêm bộ lọc ngầm gỡ lỗi-false-only
nhưng mọi thứ sẽ vẫn hoạt động chính xác CẢ trong django 1.4 và django 1.5.
** kết thúc chỉnh sửa **
Conf đó được lấy cảm hứng mạnh mẽ từ conf mẫu trong tài liệu django, nhưng thêm phần tệp nhật ký.
Tôi cũng thường làm như sau:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Sau đó, trong mã python của tôi, tôi luôn thêm một NullHandler trong trường hợp không xác định được thông tin ghi nhật ký nào. Điều này tránh các cảnh báo không có Trình xử lý được chỉ định. Đặc biệt hữu ích cho các lib không nhất thiết chỉ được gọi trong Django (tham khảo )
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.')
Hi vọng điêu nay co ich!