Управление регистраторами с помощью Python - PullRequest
3 голосов
/ 09 ноября 2010

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

Проблема в том, что если logging.basicConfig () установлен, он будет регистрироваться на консоли, но его необходимо установить в главном потоке.

Он также может быть установлен с помощью logging.basicConfig (filename = 'logger.log') для записи в файл.

Установка дескриптора для ведения журнала консоли (logging.StreamHandler ()) или ведения журнала файлов (logging.FileHandler ()) дополняет набор параметров logging.baseconfig ().

Проблема в том, что настройки не являются независимыми. Я имею в виду, что уровень логирования logging.baseConfig () должен включать уровень обработчика, иначе он не будет регистрироваться.

Так что, если я установлю baseConfig для входа в файл, а StreamHandler для входа в консоль, уровень журнала файла должен быть ниже уровня консоли. (Кроме того, опция basicConfig регистрирует все остальные журналы.)

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

Есть ли способ отключить вывод basicConfig ()? Или каким-либо другим способом реализовать эти варианты?

Спасибо.

1 Ответ

4 голосов
/ 10 ноября 2010

Вы не говорите в своем вопросе, какие именно уровни вы хотите использовать в своей консоли и регистрации файлов. Однако вам не нужно вызывать basicConfig(), так как это всего лишь вспомогательная функция. Вы можете сделать, например, (код только что введен, не проверен):

import logging

logger = logging.getLogger(__name__)
configured = False

def configure_logging():
    global configured
    if not configured:
        logger.setLevel(logging.DEBUG) # or whatever
        console = logging.StreamHandler()
        file = logging.FileHandler('/path/to/file')
        #set a level on the handlers if you want;
        #if you do, they will only output events that are >= that level
        logger.addHandler(console)
        logger.addHandler(file)
        configured = True

События сначала передаются в регистратор, и если событие должно быть обработано (из-за сравнения уровня регистратора и события), то событие передается каждому обработчику регистратора и всем обработчикам его предков как Что ж. Если в обработчике установлен уровень, то обработчик может его отбросить, иначе он выведет событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...