Переопределение логирования корневого логгера - PullRequest
12 голосов
/ 15 сентября 2011

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

logging.info("bla-bla-bla")

Я не хочу менять все эти строки, но я бы изменил поведение журнала.Моя идея состоит в том, чтобы изменить root logger на другой Experimental logger, который настроен ini-файлом:

[loggers]
keys =  Experimental

[formatter_detailed]
format = %(asctime)s:%(name)s:%(levelname)s %(module)s:%(lineno)d:  %(message)s

[handler_logfile]
class = FileHandler
args = ('experimental.log', 'a')
formatter = detailed

[logger_Experimental]
level = DEBUG
qualname = Experimental
handlers = logfile
propagate = 0

Теперь установка нового root logger выполняется с помощью этого фрагмента кода:

logging.config.fileConfig(path_to_logger_config)
logging.root = logging.getLogger('Experimental')

Безопасно ли переопределение корневого логгера?Может быть, есть более удобный способ?

Я пытался использовать Google и просматривал вопросы stackoverflow, но не нашел ответа.

Ответы [ 2 ]

13 голосов
/ 15 сентября 2011

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

logger = logging.getLogger(__name__)

в каждом модуле, в котором вы ведете журналирование, а затем вызывать logger.info ()и т. д.

Если все, что вам нужно, это войти в файл, почему бы просто не добавить обработчик файла в корневой логгер?Вы можете использовать, например,

if __name__ == '__main__':
    logging.basicConfig(filename='experimental.log', filemode='w')
    main() # or whatever your main entry point is called

или через файл конфигурации.

Обновление: Когда я говорю «вам советуют», я имею в виду, здесьв этом ответе ;-) Хотя вы можете не столкнуться с какими-либо проблемами в вашем сценарии, не рекомендуется перезаписывать атрибут модуля, который не был предназначен для перезаписи.Например, корневой регистратор является экземпляром другого класса (который не является частью общедоступного API), и в механизме ведения журнала есть другие ссылки на него, которые все еще указывают на старое значение.Любой из этих фактов может привести к трудным для отладки проблемам.Поскольку пакет ведения журнала позволяет достичь желаемого (например, войти в файл, а не в консоль) несколькими способами, вам следует использовать предоставленные механизмы.

1 голос
/ 02 февраля 2017

logger = logging.getLogger() Если оставить имя пустым, вы вернетесь к корневому логгеру.

logger = logging.getLogger('name') Дает вам еще один регистратор.

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