использование класса Python Logger для создания нескольких журналов для разных уровней журнала - PullRequest
5 голосов
/ 16 сентября 2011

Я просмотрел учебники по классу журналирования Python и не увидел ничего, что позволило бы мне сделать несколько журналов разных уровней для одного и того же вывода.В конце я хотел бы иметь три журнала: <timestamp>_DEBUG.log (уровень отладки)
<timestamp>_INFO.log (уровень информации)
<timestamp>_ERROR.log (уровень ошибки)

Есть ли способ,в одном сценарии сгенерировать несколько файлов журнала для одного и того же ввода?

<------------- ОБНОВЛЕНИЕ № 1 -------------------------->
Итак, при реализации предложения @ Роберта у меня возникла небольшая проблема, возможно, из-за неполного понимания того, что делается в его коде.

Вот мой код в scriptRun.py

import os
import logging

logger = logging.getLogger("exceptionsLogger")
debugLogFileHandler = logging.FileHandler("Debug.log")
errorLogFileHandler = logging.FileHandler("Error.Log")
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
errorLogFileHandler.setFormatter(formatter)
debugLogFileHandler.setFormatter(formatter)
logger.addHandler(debugLogFileHandler)
logger.addHandler(errorLogFileHandler)

class LevelFilter(logging.Filter):
    def __init__(self, level):
        self.level = level
    def filter(self, record):
        return record.levelno == self.level
debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
errorLogFileHandler.addFilter(LevelFilter(logging.ERROR))

directory = []
for dirpath, dirnames, filenames in os.walk("path\to\scripts"):
    for filename in [f for f in filenames if f.endswith(".py")]:
        directory.append(os.path.join(dirpath, filename))
for entry in directory:
    execfile(entry)
    for lists in x:
        if lists[0] == 2:
            logger.error(lists[1]+"   "+lists[2])
        elif lists[0] == 1:
            logger.debug(lists[1]+"   "+lists[2])

пример того, что это работает:

import sys

def script2Test2():
    print y
def script2Ttest3():
    mundo="hungry"

global x 
x = []

theTests = (test2, test3)

for test in theTests:
    try:
        test()
        x.append([1,test.__name__," OK"])
    except:
        error = str(sys.exc_info()[1])
        x.append([2,test.__name__,error])

Теперь к моей проблеме: запуск scriptRun.py не выдает никаких ошибок, когдая запускаю его, и error.log и debug.log создаются, но только error.log заполняется записями.

есть идеи почему?

<------------------------ Обновление № 2 ----------------------->

ИтакЯ понял, что ничего не регистрируется, что "ниже", чем предупреждение.даже если я уберу фильтры и debugLogFileHandler.setLevel(logging.DEBUG) это не имеет значения.Если я установлю фактическую команду журнала на logger.warning или выше, она будет печататься в журналах.Конечно, когда я раскомментирую debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG)), я не получаю активности журнала в Debug.log.Я испытываю желание просто сделать свой собственный уровень журнала, но это кажется очень плохой идеей, если кто-то / что-либо еще использует этот код.

<------------------------- Окончательное ОБНОВЛЕНИЕ --------------------->
Ну я был тупой и забыл установить регистраторсам регистрировать события уровня DEBUG.Так как по умолчанию класс протоколирования не регистрирует ничего ниже предупреждения, он не регистрировал какую-либо отладочную информацию, которую я ему отправлял.

Заключительная благодарность и привет @Robert за фильтр.

1 Ответ

11 голосов
/ 16 сентября 2011

Создание нескольких обработчиков, каждый для одного выходного файла (INFO.log, DEBUG.log и т. Д.).

Добавить фильтр к каждому обработчику, который разрешает только определенный уровень.

Например:

import logging

# Set up loggers and handlers.
# ...

class LevelFilter(logging.Filter):
    def __init__(self, level):
        self.level = level

    def filter(self, record):
        return record.levelno == self.level

debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
infoLogFileHandler.addFilter(LevelFilter(logging.INFO))
...