Logging - простая и удобная библиотека для логирования

Posted on 02 Dec 2015

Сегодня я хочу немного рассказать о прекрасной библиотеке logging. Данная библиотека предназначена для логирования в Вашем проекте или модуле. Полезный инструмент когда Вам нужно найти какую то проблему или выяснить что не так происходит в Вашем коде.

Основные преимущества данной библиотеки:

  • позволяет писать логи в файл (ротировать файл)
  • выводить логи в консоль
  • позволяет хранить настройки логера в отдельном файле

Дальше я приведу несколько простых примеров использования библиотеки и расскажу как правильно её использовать.

Давайте для начала познакомимся с азами библиотеки:

>>>import logging

#Как правило в качестве имени используют имя модуля
>>>logger = logging.getLogger(__name__)

#определяет минимальный уровень выводимых сообщений
>>>logger.setLevel(logging.DEBUG)

# Вывод разных сообщений
>>>logger.debug('Test debug message')
DEBUG:__main__:Test debug message
>>>logger.error('Test error message')
ERROR:__main__:Test error message
>>>logger.info('Test info message')
INFO:__main__:Test info message
>>>logger.warning('Test warning message')
WARNING:__main__:Test warning message
>>>logger.error('Test error message')
ERROR:__main__:Test error message

# logger.exception  аналогично error но еще выводит дамп трасировки 
>>>try:
    raise ValueError('Incorrect value')
except ValueError as e:
    logger.exception("My error")

ERROR:__main__:My error
Traceback (most recent call last):
  File "<ipython-input-28-56976f097f35>", line 2, in <module>
    raise ValueError('Incorrect value')
ValueError: Incorrect value

Если посмотреть на пример выше, все достаточно просто и ясно. Давайте немного усложним задачу. Пускай все сообщение уровня выше error будут писаться в файл, а все debug сообщения будут выводится на консоль. Настройки логера мы будем хранить в отдельном файле. Пример файла настроек можно посмотреть тут. Пример использования:

>>>import logging
>>>import logging.config
>>>logging.config.fileConfig('logger.ini')
>>>logger=logging.getLogger(__name__)

# По умолчанию установлен INFO level
>>>logger.setLevel(logging.DEBUG)

#Будет выведено на консоль
>>>logger.debug('My debug message')
DEBUG:__main__: My debug message 

#Будет выведено на консоль и записано в файл
>>logger.error('My error message')
ERROR:__main__: My error message 

Думаю пока все ясно. Иногда возникают ситуации когда Вы работаете с несколькими модулями и не понятно где и почему произошла ошибка. Предположим у нас есть модуль test_logger, в нем есть функция get_status для вывода кода HTTP ответа с удаленного сайта. Которая использует модуль request, для получения статуса. Давайте попробуем с помощью логов выяснить как проходить весь процесс получения статуса HTTP ответа.

# Импортируем наш модуль
>>>import test_logger
>>>import logging
>>>logging.basicConfig()
# Получаем код ответа от сайта 
>>>test_logger.get_status('http://myarik.com')
200

# Изменим уровень логирования нашего модуля
>>>logging.getLogger("test_logger").setLevel(logging.DEBUG)
#Повторно получим статус ответа от сайта с отображеним логов из модуля test_logger
>>test_logger.get_status('http://myarik.com')
INFO:test_logger:Start parsing
DEBUG:test_logger:My debug message
INFO:test_logger:Parsing took 0.21805691719055176 seconds
200

# Включим debug логирование для модуля urllib3
>>>logging.getLogger("requests.packages.urllib3").setLevel(logging.DEBUG)
#Посмотрим на результат
>>test_logger.get_status('http://myarik.com')
NFO:test_logger:Start parsing
DEBUG:test_logger:My debug message
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): myarik.com
DEBUG:requests.packages.urllib3.connectionpool:"GET / HTTP/1.1" 200 None
INFO:test_logger:Parsing took 0.21605205535888672 seconds
200

#Отключаем логирование одного из модулей
>>logging.getLogger("test_logger").setLevel(logging.NOTSET)

Успешного Вам логирования :)