Фильтровать разные сообщения уровня журнала в разные файлы журнала - PullRequest
1 голос
/ 02 мая 2019

Итак, я пытаюсь создать систему ведения журнала для моего проекта Django, где мне нужно сохранять все сообщения разных уровней журнала в разные файлы.

TLDR

Мне удалось заставить Журналы определенного уровня появляться в соответствующих файлах, но

  • Debug.log содержит все сообщения уровня журнала

  • Info.log содержит все сообщения уровня журнала, оставляющие отладку

  • warning.log содержит сообщения уровня журнала WARN, ERROR & CRITICAL

  • error.log содержит сообщения об ошибках и КРИТИЧЕСКИЕ сообщения уровня журнала

  • crit.log содержит только сообщения уровня журнала CRITICAL

Итак, я последовал за официальным https://docs.djangoproject.com/en/2.2/topics/logging/

Получил более четкую картинку из этого Django rest framework, регистрирующий разные уровни на разных файлах

Затем написал следующий код.

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'
        },
    },
    'handlers': {
        'debug_logs': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'logs/debug.log',
            'formatter': 'verbose',
        },
        'error_logs': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': 'logs/error.log',
            'formatter': 'verbose',
        },
        'warn_logs': {
            'level': 'WARN',
            'class': 'logging.FileHandler',
            'filename': 'logs/warn.log',
            'formatter': 'verbose',
        },
        'info_logs': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': 'logs/info.log',
            'formatter': 'verbose',
        },
        'critical_logs': {
            'level': 'CRITICAL',
            'class': 'logging.FileHandler',
            'filename': 'logs/critical.log',
            'formatter': 'verbose',
        },

    },
    'loggers': {
        '': {
            'handlers': ['error_logs', 'warn_logs', 'info_logs', 'critical_logs', 'debug_logs'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

Итак, теперь я получаю следующий результат:

debug.log

INFO 2019-05-02 05: 36: 22,888 автозагрузка 1683 4558792128 Отслеживание изменений файлов с помощью StatReloader ОШИБКА 2019-05-02 05: 36: 26 604 getQuestions 1683 123145336807424 Ошибка! DEBUG 2019-05-02 05: 36: 26,604 getQuestions 1683 123145336807424 отладка ИНФОРМАЦИЯ 2019-05-02 05: 36: 26 604 getQuestions 1683 123145336807424 info ПРЕДУПРЕЖДЕНИЕ 2019-05-02 05: 36: 26 605 getQuestions 1683 123145336807424 предупреждение КРИТИЧЕСКИЙ 2019-05-02 05: 36: 26 605 getQuestions 1683 123145336807424 критический

info.log

INFO 2019-05-02 05: 36: 22,888 автозагрузка 1683 4558792128 Отслеживание изменений файлов с помощью StatReloader ОШИБКА 2019-05-02 05: 36: 26 604 getQuestions 1683 123145336807424 Ошибка! ИНФОРМАЦИЯ 2019-05-02 05: 36: 26 604 getQuestions 1683 123145336807424 info ПРЕДУПРЕЖДЕНИЕ 2019-05-02 05: 36: 26 605 getQuestions 1683 123145336807424 предупреждение КРИТИЧЕСКИЙ 2019-05-02 05: 36: 26 605 getQuestions 1683 123145336807424 критический

warn.log

ОШИБКА 2019-05-02 05: 36: 26 604 getQuestions 1683 123145336807424 Ошибка! ПРЕДУПРЕЖДЕНИЕ 2019-05-02 05: 36: 26 605 getQuestions 1683 123145336807424 предупреждение КРИТИЧЕСКИЙ 2019-05-02 05: 36: 26 605 getQuestions 1683 123145336807424 критический

error.log

ОШИБКА 2019-05-02 05: 36: 26 604 getQuestions 1683 123145336807424 Ошибка! КРИТИЧЕСКИЙ 2019-05-02 05: 36: 26 605 getQuestions 1683 123145336807424 критический

critical.log

КРИТИЧЕСКИЙ 2019-05-02 05: 36: 26 605 getQuestions 1683 123145336807424 критический

1 Ответ

1 голос
/ 02 мая 2019

Как вы упомянули в своем вопросе, DEBUG содержит все сообщения уровня журнала, INFO содержит все сообщения уровня журнала, кроме DEBUG и так далее.Так работает уровень журнала, DEBUG - самый высокий уровень, а CRITICAL - самый низкий.Таким образом, DEBUG будет содержать все остальные сообщения уровня журнала, а CRITICAL получит одно.Более подробную информацию можно найти в Документация Python

Если честно, наличие разных файлов для разных уровней журнала не является хорошим дизайном.Потому что когда вы пишете логи в своем коде, он будет поддерживать последовательность выполнения.С помощью этих последовательных журналов вы сможете понять, как выполнялся код и почему в конце концов произошла ошибка.Существует много инструментов для анализа журналов ошибок из одного файла, содержащего журналы различного уровня, например, Kibana или ELK .Вы также можете использовать Sentry для отслеживания журналов ошибок.

Я бы порекомендовал вести специальные регистраторы приложений Django.Таким образом, все журналы из приложения Django будут в одном файле регистратора.Но это зависит от вашей архитектуры приложения / необходимости того, как вы должны настроить свой регистратор.

Наконец, даже если вы хотите получать журналы разного уровня в разных файлах, вам нужно настроить разные регистраторы, например:

'loggers': {
    'error_logger': {
        'handlers': ['error_logs'],
        'level': 'DEBUG',
        'propagate': True,
    },
   'warn_logger': {
        'handlers': ['warn_logs'],
        'level': 'WARN',
        'propagate': True,
    }
    # in same way configure info_logs, debug_logs and so on.
}

Затем в ваших файлах вам нужноимпортировать регистраторы, как это:

info_logger = logging.getLogger('info_logger')
error_logger = logging.getLogger('error_logger')

#inside code
info_logger.info("some info")
error_logger.error("error")
...