2015-08-19 2 views
1

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

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

3) В конце функции я закрываю обработчик.

Моя проблема являются:

1), даже если я закрываю обработчик, в следующий раз я бегу ту же функцию, я получаю ошибку, что файл я пытаюсь удалить (как часть установки регистратора file handler) все еще используется.

2) Кроме того, регистратор печатает все на консоль, который я не хочу, я просто хочу, чтобы все это записывало в файл.

Вот ЗК функции:

def setLogger(path): 

""" 
@purpose: Intializes basic logging directory and file 
""" 
LOG_FILENAME = path + "\\" + "log.txt" 
#logging.basicConfig(filename=LOG_FILENAME, 
#    format='%(levelname)s %(asctime)s %(message)s',level=logging.INFO 
#    ) 
logger = logging.getLogger() 
logger.setLevel(logging.INFO) 
file_handler = logging.FileHandler(LOG_FILENAME) 
file_handler.setLevel(logging.INFO) 
formatter = logging.Formatter("%(levelname)s %(asctime)s %(message)s") 
file_handler.setFormatter(formatter) 
logger.addHandler(file_handler) 
return logger 


def unsetLogger(logger): 

""" 
@purpose: performs a basic shutdown of logger 
""" 

logger.handlers[0].close() 
logger.removeHandler(logger.handlers[0]) 
logging.shutdown 

Путь я использую их есть: для например:

def fun(): 
     os.remove(path) 
     logger = setLogger(path) 
`  logging.info("hi") #this writes to file and prints on the console as well 
     unsetLogger(logger) 

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

Спасибо заранее. learningNinja

+0

Почему вы удаляете файл каждый раз, когда запускаете метод еще раз? Вы действительно не хотите больше одного исполнения в журнале за раз? Почему бы не добавить к существующему файлу (который по умолчанию) и использовать что-то вроде TimedRotatingFileHandler, которое поможет предотвратить слишком большой размер файла? –

+0

Фактически я делал это согласно требованию. Я не могу добавить файлы, которые еще сделал бы. – LearningNinja

ответ

0

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

import os 
import logging 

def setLogger(path): 
    """ 
    @purpose: Intializes basic logging directory and file 
    """ 
    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 
    # Simplified log file path (I just use full value passed in, and don't append "\log.txt") 
    file_handler = logging.FileHandler(path) 
    file_handler.setLevel(logging.INFO) 
    formatter = logging.Formatter("%(levelname)s %(asctime)s %(message)s") 
    file_handler.setFormatter(formatter) 
    logger.addHandler(file_handler) 
    return logger 

def unsetLogger(logger): 
    """ 
    @purpose: performs a basic shutdown of logger 
    """ 
    logger.handlers[0].close() 
    logger.removeHandler(logger.handlers[0]) 
    logging.shutdown 

def fun(): 
    try: 
     # Was getting error trying to remove a file that didn't exist on 
     # first execution... 
     os.remove("log.txt") 
    except: 
     pass 
    logger = setLogger("log.txt") 
    logging.info("hi") 
    unsetLogger(logger) 

fun() 
fun() 
fun() 

Посмотрите, есть ли что-то, что я делаю иначе, чем ваш фактический код, и, возможно, это может вам помочь.

+0

Он даже не заходил на консоль? Я знаю, что это странно даже. Это работало для меня, и я не помню, чем я отличался сегодня, и все это начиналось. Я пытаюсь с утра и независимо от того, что я делаю, я продолжаю получать эти ошибки не всегда, а с перерывами. Даже я попытался поместить код файла журнала удаления в блок try. но если он не удаляется, он добавляется. – LearningNinja

+0

Я поместил полное содержимое того, что я разместил выше, в файл под названием «testlog.py» и запустил его, и я не видел никакого вывода на консоль. Он создал файл журнала и в конце выполнения, как и ожидалось, регистрировалась только одна строка. Я даже отлаживал и переходил через каждый вызов к 'fun()', и он каждый раз создавал и удалял файл журнала, как и ожидалось. –

+0

О, а также, я не видел, чтобы какой-либо журнал был напечатан на консоли, так как ваш комментарий к коду указывает, что вы видели. В вышедшем коде регистратор не добавлен «StreamHandler», поэтому этого не должно произойти. У вас есть код в другом месте, который добавляет 'StreamHandler'? Это может быть вашей проблемой, потому что тогда 'logger.handlers [0]' не может быть 'FileHandler'. Попробуйте добавить уникальное имя регистратора к вызову 'logging.getLogger()' (например, 'logging.getLogger (« mylogger »)) и посмотреть, помогает ли это вообще. Он должен, по крайней мере, удалить консольный вывод. –

Смежные вопросы