Получить текущую (или базовую) конфигурацию регистрации Python как словарь - PullRequest
0 голосов
/ 28 октября 2018

Я использую стандартную конфигурацию регистрации Python в сочетании с yaml для загрузки файла конфигурации с функцией dictConfig():

import logging
import yaml

with open('logging.yaml','r') as f:
    logConfig = yaml.safe_load(f.read())
logging.config.dictConfig(logConfig)

Поскольку инкрементная конфигурация регистрации в python ограничивает возможности , каждый файл регистрации должен содержать минимальный объем информации, что-то вроде этого:

version: 1
formatters:
    simple:
        format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

handlers:
    console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: simple

loggers:
    my_module:
        level: ERROR

root:
    level: INFO
    handlers: [console] 

Что либо заставляет человека изучать это по голове, хранить его где-нибудь, либо искать каждый раз. Поскольку ни один из них на самом деле не работает для меня, я хотел бы найти способ его создания. Это подводит меня к вопросу:

Есть ли способ получить текущую (или базовую) конфигурацию ведения журнала в виде словаря?

Это упростит создание исходного конфигурационного файла, выполнив один раз следующий код и просто удалите / отредактируйте то, что вы хотите:

import logging
import yaml

logConfig = logging.get_current_config_as_a_dictionary()
with open('logging.yaml','w') as f:
    f.write(yaml.dump(logConfig))

Yaml - это, конечно, мое личное предпочтение, тот же вопрос может быть задан для чего-то вроде JSON.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

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

Вот вывод, который он генерирует в данный момент со своей домашней страницы:

>>> logging.getLogger('a')
>>> logging.getLogger('a.b').setLevel(logging.DEBUG)
>>> logging.getLogger('x.c')
>>> from logging_tree import printout
>>> printout()
<--""
   Level WARNING
   |
   o<--"a"
   |   Level NOTSET so inherits level WARNING
   |   |
   |   o<--"a.b"
   |       Level DEBUG
   |
   o<--[x]
       |
       o<--"x.c"
           Level NOTSET so inherits level WARNING
0 голосов
/ 29 октября 2018

Я не уверен, есть ли чистый способ сделать это через любую публичную функцию logging.Просматривая пакет CPython source , значения по умолчанию не откладываются и четко определены в любой структуре (например, dict).Вместо этого они жестко закодированы в функцию logging.basicConfig.В частности, эта функция содержит несколько общих ключевых слов «по умолчанию», но, к сожалению, для ваших целей они жестко закодированы в функцию.Например:

style = kwargs.pop("style", '%')

При этом используется регистратор root (который сам по себе root = RootLogger(logging.WARNING)) и добавляет к нему некоторую конфигурацию.

Один способ работы с этим, который действительноне идеально, было бы посмотреть на конфигурацию «до и после», связанную с logging.root до и после вызова logging.basicConfig()*.Например:

>>> root = logging.root
>>> root.handlers
[]
>>> logging.basicConfig()
>>> root.handlers
[<StreamHandler <stderr> (NOTSET)>]

Наконец, я хотел бы отметить, что стиль по умолчанию исходит из:

logging._STYLES['%']

, который получается %(levelname)s:%(name)s:%(message)s.

* Если вы вызываете эту функцию без аргументов, на самом деле не так уж много сделано;Основным изменением является добавление StreamHandler (stdout) к корневому логгеру, а затем добавление Formatter к этому.

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