LINUX.ORG.RU

Python logging

 


1

1

Всем привет,

Кто хорошо понимает в библиотеке logging в Python? Есть такой кусок простого кода:

import logging
import sys

# main logger
log=logging.getLogger()
log.setLevel(logging.DEBUG)

# debug, info loggind to stdout
handler=logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s]: %(message)s (stdout)"))
log.addHandler(handler)

# warning, error, critical logging to stderr
handler=logging.StreamHandler(sys.stderr) 
handler.setLevel(logging.WARNING)
handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s]: %(message)s (stderr)"))
log.addHandler(handler)

# test
log.debug("This is DEBUG message")
log.info("This is INFO message")
log.warning("This is WARNING message")
log.error("This is ERROR message")
log.critical("This is CRITICAL message")

На выходе получаем:

2016-09-17 19:00:30,252 [DEBUG]: This is DEBUG message (stdout)
2016-09-17 19:00:30,252 [INFO]: This is INFO message (stdout)
2016-09-17 19:00:30,252 [WARNING]: This is WARNING message (stdout)
2016-09-17 19:00:30,252 [WARNING]: This is WARNING message (stderr)
2016-09-17 19:00:30,252 [ERROR]: This is ERROR message (stdout)
2016-09-17 19:00:30,252 [ERROR]: This is ERROR message (stderr)
2016-09-17 19:00:30,252 [CRITICAL]: This is CRITICAL message (stdout)
2016-09-17 19:00:30,252 [CRITICAL]: This is CRITICAL message (stderr)

Видно, что сообщения уровня WARNING, ERROR и CRITICAL показываются двумя обработчиками сразу.

Как этого избежать? Как запретить первому обработчику трогать все, начиная с WARNING ?


Видно, что сообщения уровня WARNING, ERROR и CRITICAL показываются двумя обработчиками сразу.

Естественно, потому что setLevel отфильтровывает только все что уровнем ниже.

anonymous ()
Ответ на: комментарий от Shtsh

Да, магическая конструкция:

class LogFilter(object):
  def __init__(self, level):
    self.__level = level
  def filter(self, logRecord):
    return logRecord.levelno <= self.__level
handler.addFilter(LogFilter(logging.INFO))

Помогла мне. Спасибо.

XTerm ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.