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

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

Open in new window

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

Зоздание логов является неотьемлемой частью проектирования сложных приложений.

При помощи логов разработчик может проанализировать ход выполенения программы и выявить ее проблемные участки.

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

import logging

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

loger = logging.getLogger(__name__)

Существует несколько уровней логирования в зависимости от важности события для логера.

DEBUG: Самый низкий уровень для отладки. INFO: Общая информация о работе системы. WARNING: Информация о незначительных неполадках. ERROR: Информация об основных существенных ошибках. CRITICAL: Критические проблемы.

Установка уровня и вывод лога.

logging.basicConfig(level=logging.DEBUG)
logger.info('Start reading database')

Запись лога в файл установкой обработчика FileHandler.

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

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

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

Существует много обработчиков логов, включая отсылку лога на email и даже на удаленный сервер.

Вы можете написать свой собственный обработчик.

try:
    open('/path/to/does/not/exist', 'rb')
except (SystemExit, KeyboardInterrupt):
    raise
except Exception, e:
    logger.error('Failed to open file', exc_info=True)

Конфигурация логера словарем.

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'
 }

http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python

Other topics