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

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

Если самое плохое в журнале имело уровень INFO или ниже, выведите «SUCCESS!»

Если самое плохое зарегистрированное имеет уровень ПРЕДУПРЕЖДЕНИЕ, напишите «УСПЕХ !, с предупреждениями. Пожалуйста, проверьте журналы»

Если самое плохое в журнале имело уровень ОШИБКИ, напишите «СБОЙ».

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

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

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 голосов
/ 30 августа 2018

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

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...