Сегодня я думал о проекте Python, который я написал примерно год назад, где я использовал logging
довольно широко. Я помню, что мне пришлось прокомментировать много вызовов регистрации в сценариях с внутренним циклом (90% -ный код) из-за накладных расходов (hotshot
указал, что это одно из моих самых больших узких мест).
Интересно, есть ли какой-нибудь канонический способ программно отключить протоколирование вызовов в приложениях Python без комментирования и раскола все время. Я бы подумал, что вы можете использовать проверку/перекомпиляцию или манипуляцию байт-кодом, чтобы сделать что-то подобное, а - только объекты кода, которые вызывают узкие места. Таким образом, вы можете добавить манипулятор в качестве этапа последующей компиляции и использовать централизованный файл конфигурации, например:
[Leave ERROR and above]
my_module.SomeClass.method_with_lots_of_warn_calls
[Leave WARN and above]
my_module.SomeOtherClass.method_with_lots_of_info_calls
[Leave INFO and above]
my_module.SomeWeirdClass.method_with_lots_of_debug_calls
Конечно, вы хотели бы использовать его экономно и, возможно, с гранулярностью для каждой функции - только для объектов кода, которые показали, что logging
является узким местом. Кто-нибудь знает что-нибудь подобное?
Примечание.. Есть несколько вещей, которые делают это более трудным для выполнения в соответствии с динамической типизацией и поздним связыванием. Например, любые вызовы метода с именем debug
могут быть обернуты с помощью if not isinstance(log, Logger)
. В любом случае, я предполагаю, что все мелкие детали могут быть преодолены либо с помощью джентльменского соглашения, либо с некоторой проверкой времени выполнения.: -)