Журналирование Django не работает должным образом, и журналы не сохраняются в специальные файлы
Я пытаюсь сделать протоколирование в Django.
Я хочу, чтобы обработчик all_logs записывал все журналы в общий файл. Обработчик error_file записывает журналы в файл ошибок, warning_file - в файл предупреждений, а info_file - в файл информативных сообщений.
Но в результате я вижу ошибки в error_file и вижу все в info_file: info, warnings и errors. А файла warning_file вообще нет.
Только обработчик для записи all_logs работает хорошо.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{asctime} | {threadName}({thread}) [{levelname}] {message} ({name} {module}:{lineno})',
'style': '{',
},
'simple': {
'format': '{asctime} [{levelname}] {message} ({name}:{lineno})',
'datefmt': '%H:%M:%S',
'style': '{',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
'all_logs': {
'class': 'logging.handlers.WatchedFileHandler',
'filename': str(BASE_DIR.joinpath('log', 'all.log')),
'formatter': 'verbose',
},
'error_file': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': str(BASE_DIR.joinpath('log', 'error.log')),
'formatter': 'verbose',
},
'warning_file': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': str(BASE_DIR.joinpath('log', 'error.log')),
'formatter': 'verbose',
},
'info_file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': str(BASE_DIR.joinpath('log', 'info.log')),
'formatter': 'verbose',
},
},
'loggers': {
'django': {
'handlers': ['all_logs', 'console', 'error_file', 'warning_file', 'info_file'],
'propagate': False,
'formatter': 'verbose'
},
# my app
'applications': {
'handlers': ['all_logs', 'console', 'error_file', 'warning_file', 'info_file'],
'propagate': False,
'formatter': 'verbose'
},
},
}
Итак, я ожидаю, что каждый уровень журнала будет записываться в отдельный файл. Я также хотел бы знать, как я могу ограничить размер файла журнала и разделить журналы на разные файлы, если файл журнала слишком большой.
Но в результате я вижу ошибки в error_file и вижу все в info_file: info, warnings и errors.
Это вызвано тем, как работает level
в Django. Вот что говорится в документации :
Когда сообщение передается регистратору, уровень журнала сообщения сравнивается с уровнем журнала регистратора. Если уровень журнала сообщения соответствует уровню журнала самого регистратора или превышает его, то сообщение будет обработано. Если нет, то сообщение будет проигнорировано.
.
Другими словами, журнал уровня INFO
содержит INFO
сообщения, а все, что серьезнее -
И вообще нет никакого файла warning_file.
Посмотрите на файл, связанный с ним:
'filename': str(BASE_DIR.joinpath('log', 'error.log')),
Это также журнал ошибок.