Логирование. Логирование. Логирование.

Логирование.

Open in new window

Логгирование в Python

Логирование это вывод отладочной информации.

Процесс логирования исключительно важен, особенно при написании больших приложений.

Хорошей привычкой будет включение и использование объекта логера в каждом из ваших модулей.

С помощью логера программист выводит сообщения о том что и как происходит в его программе.

Это очень удобно при отладки и поиска ошибок.

Например так может выглядеть лог ошибки открытия файла:

try:
    open('/path/to/does/not/exist', 'rb')
except e:
    logger.error('Failed to open file')

За работу с логами отвечает встроенный Python модуль logging.

import logging

После импорта необходимо создать объект этой библиотеки.

loger = logging.getLogger(__name__)

Лучшей практикой по созданию этого объекта - это использование глобальной переменной модуля name. В ней содержится имя модуля, по которому потом можно определить место вывода в лог.

У обекта логера существует ряд уровней логирования.

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

Таких уровней 5: debug, info, warning, error и critical по порядку степени их важности.

DEBUG: информация самого низкого уровня
INFO: общая информация
WARNING: небольшие проблемы
ERROR: просто проблемы
CRITICAL: большие проблемы

Чтобы установить уровень логирования, необходимо воспользоваться функцией basicConfig.

logging.basicConfig(level=logging.DEBUG)

Вывод информации в лог.

logger.info('Start reading database')

Получение лога.

Обычно, лог выводится в стандартный поток вывода (используя StreamHandler) т.е. в консоль.

Однако, мы можем переопределить это поведение и записать лог в файл или отправить на email.

Для этого нам нужно применить нужный обработчик, например вывода в файл:

handler = logging.FileHandler('hello.log')
logger.addHandler(handler)

Существует много готовых обработчиков логов, вот некоторые из них.

NullHandler - выводит в никуда WatchedFileHandler - работает подобно FileHandler но отслеживает изменение файла другими програмами и если их обнаружит, то откроет файл заново не потеряв изменения. RotatingFileHandler - обеспечивает ротацию файлов. SocketHandler - выводит лог в сетевой сокет. SMTPHandler - шлет лог на email. HTTPHandler - шлет, используя HTTP запросы.

С польным списком можно ознакомиться по адресу. https://docs.python.org/3/library/logging.handlers.html

Форматирование.

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

Мы можем установить этот формат на наш вкус, передав строку форматирования в метод Formatter и установив форматирование:

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

Конфигурирование.

Самым удобным способом задать конфигурацию логера и указать формат, обработчики и что использовать для конкретного уровня - это определить словарь с конфигурационными данными и прередать его функции config.

import logging.config

logging.config.dictConfig({
    'version': 1,              
    'disable_existing_loggers': False

    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'INFO',    
            'class':'logging.StreamHandler',
        },  
        'file': {
            'level':'INFO',    
            'class':'logging.FileHandler',
            'filename': 'root.log',
        }, 
    },
    'loggers': {
        '': {                  
            'handlers': ['file'],        
            'level': 'INFO',  
            'propagate': True  
        }
    }
})

Фильтры

Используются для содания правил, которые пропускают только интересующие нас сообщения.

Например мы можем определить фильтр, который пропустит только сообщения с уровнем INFO.

import logging

class InfoFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno == logging.INFO

 'filters': {
     'my_filter': {
         '()': 'mymodule.InfoFilter'
     }
 },

 'mail_admins': {
     'level': 'ERROR',
     'filters': ['my_filter'],
     'class': 'django.utils.log.AdminEmailHandler'
 }

Как видим, фильтр - это класс-наследник от logging.Filter c определенной функцией filter, которая возвращает логическое значение.

Ссылка на исотчик

Other topics