Журналирование 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')),

Это также журнал ошибок.

Вернуться на верх