Как проверить, существует ли регистратор - PullRequest
0 голосов
/ 03 ноября 2018

Мне пришлось расширить существующую библиотеку журналов, чтобы добавить некоторые функции. Одной из них является функция, которая позволяет обработчику прослушивать любой существующий журнал, не зная, существует ли он заранее. Следующее позволяет обработчику прослушивать, но не проверяет, существует ли журнал:

def listen_to_log(target, handler):
    logging.getLogger(target).addHandler(handler)

Проблема в том, что я не хочу, чтобы какой-либо обработчик слушал журнал, в который не ведется журнал, и хочу вызвать ValueError, если журнал еще не существует. В идеале я бы сделал что-то вроде следующего:

def listen_to_log(target, handler):
    if not logging.logExists(target):
        raise ValueError('Log not found')
    logging.getLogger(target).addHandler(handler)

Пока мне не удалось найти такую ​​функцию, как logging.logExists, есть ли такая функция или удобный обходной путь?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

ПРЕДУПРЕЖДЕНИЕ. Это не задокументировано. Может изменяться без уведомления.

Модуль ведения журнала внутренне использует один объект Manager для хранения иерархии средств ведения журнала в файле, доступном как:

import logging
logging.Logger.manager.loggerDict

Все логгеры , за исключением корневого логгера , хранятся под этим именем под своим именем.

В сети есть несколько примеров: http://code.activestate.com/lists/python-list/621740/ а также https://michaelgoerz.net/notes/use-of-the-logging-module-in-python.html (используется печать Python 2)

0 голосов
/ 03 ноября 2018

Конечно, если вы прикрепите обработчик к корневому логгеру, вы (как правило) получите все сообщения (если автор библиотеки не решит не распространять его на корневые обработчики).

Почему вас должно волновать, что обработчик прослушивает журнал, который еще не был создан? Вы можете применить фильтры к обработчику, который игнорирует определенные события.

Это конкретно не отвечает на ваш вопрос, потому что я вижу ваш вопрос как пример XY Задачи .

...