Я добавил журналы в приложение Python 2 с помощью модуля регистрации. Теперь я хочу добавить заключительный оператор в конце, в зависимости от наихудшей записи.
Если у наихудшей записи был уровень INFO или ниже, напечатайте "УСПЕХ!".
Если у самого плохого зарегистрировался уровень WARNING, напишите "УСПЕХ!" С предупреждениями. Проверьте журналы:
Если у наихудшей записи был уровень ERROR, напишите "FAILURE".
Есть ли способ получить эту информацию от регистратора? Какой-то встроенный метод мне не хватает, например logging.getWorseLevelLogSoFar
?
Мой текущий план заключается в замене всех вызовов журнала (logging.info
и др.) На вызовы функций- logging.info
в классе, который также отслеживает эту информацию.
Я также рассмотрел как-то выпуск файла журнала, чтение и разбор его, а затем добавление к нему. Это кажется хуже моего нынешнего плана.
Есть ли другие варианты? Это не похоже на уникальную проблему.
Я использую корневой регистратор и предпочитаю продолжать его использовать, но при необходимости это может быть изменено на именованный логгер.
Поскольку вы используете только корневой журнал, вы можете прикрепить к нему фильтр, который отслеживает уровень:
import argparse
import logging
import random
LEVELS = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
class LevelTrackingFilter(logging.Filter):
def __init__(self):
self.level = logging.NOTSET
def filter(self, record):
self.level = max(self.level, record.levelno)
return True
def main():
parser = argparse.ArgumentParser()
parser.add_argument('maxlevel', metavar='MAXLEVEL', default='WARNING',
choices=LEVELS,
nargs='?', help='Set maximum level to log')
options = parser.parse_args()
maxlevel = getattr(logging, options.maxlevel)
logger = logging.getLogger()
logger.addHandler(logging.NullHandler()) # needs Python 2.7
filt = LevelTrackingFilter()
logger.addFilter(filt)
for i in range(100):
level = getattr(logging, random.choice(LEVELS))
if level > maxlevel:
continue
logger.log(level, 'message')
if filt.level <= logging.INFO:
print('SUCCESS!')
elif filt.level == logging.WARNING:
print('SUCCESS, with warnings. Please check the logs.')
else:
print('FAILURE')
if __name__ == '__main__':
main()
Как вы сами сказали, я думаю, что писать функцию обертки было бы самым простым и быстрым подходом. Проблема в том, что вам нужна глобальная переменная, если вы не работаете в классе
global worst_log_lvl = logging.NOTSET
def write_log(logger, lvl, msg):
logger.log(lvl, msg)
if lvl > worst_log_lvl:
global worst_log_lvl
worst_log_lvl = lvl
или сделать worst_log_lvl
членом пользовательского класса, где вы эмулируете подпись logging.logger
, которую вы используете вместо фактического регистратора
class CustomLoggerWrapper(object):
def __init__(self):
# setup of your custom logger
self.worst_log_lvl = logging.NOTSET
def debug(self):
pass
# repeat for other functions like info() etc.