Переопределение регистрационного корневого регистратора

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

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

Я не хочу менять все эти строки, но я бы изменил поведение журнала. Моя идея заключается в изменении корневого регистратора на другой регистратор Experimental, который настраивается 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

Теперь установка нового корневого регистратора выполняется с помощью этой части кода:

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

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

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

Ответ 1

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

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), и есть другие ссылки на него в механизме регистрации, который все равно указывает на старое значение. Любой из этих фактов может привести к трудным для отладки проблемам. Поскольку пакет протоколирования позволяет реализовать несколько способов достижения желаемого результата (по-видимому, для входа в файл, а не в консоль), вы должны использовать предоставленные механизмы.

Ответ 2

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

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