Какой журнал наихудшего уровня я только что зарегистрировал?

1

Я добавил журналы в приложение Python 2 с помощью модуля регистрации. Теперь я хочу добавить заключительный оператор в конце, в зависимости от наихудшей записи.

Если у наихудшей записи был уровень INFO или ниже, напечатайте "УСПЕХ!".

Если у самого плохого зарегистрировался уровень WARNING, напишите "УСПЕХ!" С предупреждениями. Проверьте журналы:

Если у наихудшей записи был уровень ERROR, напишите "FAILURE".

Есть ли способ получить эту информацию от регистратора? Какой-то встроенный метод мне не хватает, например logging.getWorseLevelLogSoFar ?

Мой текущий план заключается в замене всех вызовов журнала (logging.info и др.) На вызовы функций- logging.info в классе, который также отслеживает эту информацию.

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

Есть ли другие варианты? Это не похоже на уникальную проблему.

Я использую корневой регистратор и предпочитаю продолжать его использовать, но при необходимости это может быть изменено на именованный логгер.

Теги:
logging

2 ответа

1
Лучший ответ

Поскольку вы используете только корневой журнал, вы можете прикрепить к нему фильтр, который отслеживает уровень:

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()
  • 0
    Любой прохожий: этот ответ может показаться слишком сложным, но более половины сложности - это код наполнителя, чтобы иметь пример, который стоит сам по себе.
2

Как вы сами сказали, я думаю, что писать функцию обертки было бы самым простым и быстрым подходом. Проблема в том, что вам нужна глобальная переменная, если вы не работаете в классе

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню