0,0
рейтинг
25 мая 2012 в 18:31

Разработка → Logging — библиотека для удобного ведения логов в Python из песочницы

В любой разработке приходится рано или поздно вести логи, ведь не отдашь же заказчику программу где отладочные сообщения выводятся с помощью print, да и в дальнейшем если у заказчика что то пойдет не так то можно просто попросит показать лог и понять в чем проблема(в большинстве случаев), так вот в питоне есть очень мощная и удобная библиотека и дальше я попробую про нее рассказать.

Для начала подключим библиотеку и попробуем вывести на консоль сообщения разного типа:

#log.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging

# Сообщение отладочное
logging.debug( u'This is a debug message' )
# Сообщение информационное
logging.info( u'This is an info message' )
# Сообщение предупреждение
logging.warning( u'This is a warning' )
# Сообщение ошибки
logging.error( u'This is an error message' )
# Сообщение критическое
logging.critical( u'FATAL!!!' )


При выводе мы получаем:

WARNING:root:This is a warning
ERROR:root:This is an error message
CRITICAL:root:FATAL!!!


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

logging.basicConfig(level = logging.DEBUG)


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

#log.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging

logging.basicConfig(level = logging.DEBUG)

# Сообщение отладочное
logging.debug( u'This is a debug message' )
# Сообщение информационное
logging.info( u'This is an info message' )
# Сообщение предупреждение
logging.warning( u'This is a warning' )
# Сообщение ошибки
logging.error( u'This is an error message' )
# Сообщение критическое
logging.critical( u'FATAL!!!' )


Теперь после вывода мы получим все сообщения:

DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning
ERROR:root:This is an error message
CRITICAL:root:FATAL!!!


Но все равно как то скудно выглядит вывод из него мало чего поймешь, для это так же в конфиге логера можно задать формат выводимого сообщения, посмотреть все атрибуты можно (вот здесь):

logging.basicConfig(format = u'%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s]  %(message)s', level = logging.DEBUG)


теперь после вывода мы получаем вот такие сообщения:

log.py[LINE:33]# DEBUG    [2012-05-25 00:11:58,466]  This is a debug message
log.py[LINE:34]# INFO     [2012-05-25 00:11:58,466]  This is an info message
log.py[LINE:35]# WARNING  [2012-05-25 00:11:58,466]  This is a warning
log.py[LINE:36]# ERROR    [2012-05-25 00:11:58,467]  This is an error message
log.py[LINE:37]# CRITICAL [2012-05-25 00:11:58,467]  FATAL!!!


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

logging.basicConfig(format = u'%(levelname)-8s [%(asctime)s] %(message)s', level = logging.DEBUG, filename = u'mylog.log')


теперь логи будут писать в файл указанный в параметре filename, на самом деле у этого логера очень много возможностей я показал лишь те которые нужны для начала работы с логером более подробную информацию можно прочитать на офф. сайте docs.python.org/library/logging.html
Саратовский Даниил @FenixGnom
карма
2,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (13)

  • +2
    По-моему, самое вкусное в этой библиотеке, что она покрывает множество нужд, в том числе благодаря logging.handlers можно писать в файл с ротацией (автоматическое разбиение на тома), разбиением на подкаталоги, отправлять лог по сети, по почте, писать в системный лог и т. п.
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Да не спорю настройки сложные но если один раз разобраться и написать для себя модуль где уже заданны все настройки то потом можно легко и просто использовать в любом проекте.
  • 0
    сначала argparse, теперь logging — какой стандартный модуль в скромном переводе без сравнений с аналогами, жизненными примерами, подводными камнями и прочими интересными вещами, будет следующим? перевели бы всю документацию на русский язык тогда уж.

    P.S. касательно logging — чем лучше/хуже logbook? как обстоят дела с многопоточностью, в том числе и многопроцессорной среде(via multiprocessing)? есть ли параллели с log4j? как можно шарить конфиги между разными логгерами? как писать свои хендлы и форматтеры?
    • –1
      Да не спорю статья маленькая и в ней раскрыт не весь потенциал логера, но но хабре сидят не только проффи но и новички которым легче разобраться в кратком обзоре чем в статье где полно профессиональных примеров, и еще так же много людей которые только начинаю учить язык программирования и при этом знание английского нету поэтому документацию прочитать сложно к тому же техническую, не спорю можно было бы написать статью где идет сравнения разных логеров, пример всех возможностей но тогда возникает вопрос новичок открыв такую статью поймет ли он как работать именно с этой библиотекой?!
      • 0
        А потом — море вопросов «я делаю по статье XXX, у меня не работает, скажите почему». А в статье тупо опечатка или версия древняя, и всего-то надо посмотреть в код или доку.
      • 0
        ух ты! спасибо за ссылку.
  • 0
    Подскажите, а чем концептуально отличается:

    import logging
    logging.warning(u'This is a warning')

    от

    import warnings
    warnings.warn(u'This is a warning', DeprecationWarning)

    ?

    Что-то никак понять не могу. Спасибо.
    • 0
      модуль warning генерирует исключения типа Warning*, тогда как logging.warn просто отправляет сообщение c уровнем события logging.WARN или 30 — аналогично можно записать logging.log(logging.WARN, 'warner brothers').
      • 0
        Ну, если генерирует исключение, тогда в чем отличие от:
        raise DeprecationWarning(u'This is a warning')
        ?
        • 0
          по факту — ни в чем. в деталях, если загнянуть в модуль warnings и в его документацию, то можно найти фильтры варнингов, какие будут вызываться, а какие «глушиться», куда сообщения будут направляться (можно отправлять через logging.warning), а так же форматирование сообщений и прочие плюшки, недоступные обычным исключениям.
  • 0
    А на email отправляет, как, например, этот инструмент?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.