Установка маски уровня для указанного обработчика журнала c - PullRequest
0 голосов
/ 07 мая 2020

У меня есть инструмент командной строки, написанный на python, который использует модуль logging для записи как в терминал, так и в системный журнал. Регистратор root имеет как терминал (StreamHandler), так и syslog (SysLogHandler) в своем списке обработчиков. Уровень журнала обработчика root имеет значение по умолчанию, которое можно изменить, указав параметр командной строки.

Обычно обработчик терминала имеет тот же уровень, что и средство ведения журнала root, но я хочу предоставить «тихий» режим, в котором к обработчику терминала применяется маска, позволяющая установить ее до заданного минимума (ПРЕДУПРЕЖДЕНИЕ), но не ниже. Это позволит использовать инструмент в cron с относительно низким уровнем ведения журнала для системного журнала (например, INFO), одновременно выводя на терминал только сообщения об ошибках (уменьшая потенциальную электронную почту, генерируемую cron).

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

Кажется очевидным решение использовать противоположность logging.getLevelName() для преобразования строковых представлений в целые числа и сравнения их, но такой функции publi c не существует (я могу найти). Лучшее, что я могу придумать, использует функцию private logging._checkLevel(), например:

def mask_level(log_level, minimum_level=logging.WARNING):
   return (
      log_level
      if logging._checkLevel(log_level) >= minimum_level
      else minimum_level
   )

Я знаю, что использование частных функций не одобряется, и я рискую использовать эту функцию исчезнув в какой-то момент, нарушив мой код. Но единственный другой вариант, который я вижу, - это действительно запутанный беспорядок кода, в котором я вручную конвертирую строки уровня в целые числа (например, getattr(logging, 'INFO')), чтобы построить свою собственную карту преобразования строки в целое число. Это кажется глупым, когда logging._nameToLevel и logging._checkLevel() сидят прямо здесь.

Это лучшее, что есть, или мне не хватает какой-то действительно очевидной альтернативы?

...