2016-06-20 3 views
1

Итак, когда я скопирую вставку следующие x раз в приглашение python, , он добавляет журнал x раз в конец указанного файла.Python logger: не будет перезаписывать исходный журнал?

Как я могу изменить код так, чтобы каждый раз, когда я копировать вставить это приглашение, я просто перезаписать существующий файл (код кажется не принимать mode = 'w' варианта или я, кажется, не понимает его смысл)

def MinimalLogginf(): 
    import logging 
    import os 
    paths = {'work': ''} 
    logger = logging.getLogger('oneDayFileLoader') 
    LogHandler = logging.FileHandler(os.path.join(paths["work"] , "oneDayFileLoader.log"), mode='w') 
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    LogHandler.setFormatter(formatter) 
    logger.addHandler(LogHandler) 
    logger.setLevel(logging.DEBUG) 
    #Let's say this is an error: 
    if(1 == 1): 
     logger.error('overwrite') 

Так что я запустить его однажды: MinmalLoggingf()

Теперь я хочу новый файл журнала, чтобы перезаписать файл журнала, созданный на предыдущем прогоне:

MinmalLoggingf() 

ответ

4

Если я правильно понимаю, вы работаете в определенный процесс Python в течение нескольких дней в то время, и вы хотите, чтобы повернуть бревно каждый день. Я бы порекомендовал вам пойти другим путем, используя обработчик, который автоматически поворачивает файл журнала, например. http://www.blog.pythonlibrary.org/2014/02/11/python-how-to-create-rotating-logs/

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

Ваша проблема заключается в том, что каждый раз, когда вы вставляете код, вы создаете новый FileHandler и добавляете его в объект Logger. В итоге вы получаете регистратор, к которому прикреплено X FileHandlers, все из которых записываются в один и тот же файл. Попробуйте следующее:

import logging 
paths = {'work': ''} 
logger = logging.getLogger('oneDayFileLoader') 
if logger.handlers: 
    logger.handlers[0].close() 
    logger.handlers = [] 
logHandler = logging.FileHandler(os.path.join(paths["work"] , "oneDayFileLoader.log"), mode='w') 
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
logHandler.setFormatter(formatter) 
logger.addHandler(logHandler) 
logger.setLevel(logging.DEBUG) 
logger.error('overwrite') 

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

import logging 
from logging.handlers import TimedRotatingFileHandler 

logPath = os.path.join('', "fileLoaderLog") 
logger = logging.getLogger('oneDayFileLoader') 
logHandler = TimedRotatingFileHandler(logPath, 
            when="midnight", 
            interval=1) 
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
logHandler.setFormatter(formatter) 
logger.addHandler(logHandler) 
logger.setLevel(logging.DEBUG) 
logger.error('overwrite') 
+0

Решение с вращающимся журналом выглядит лучше, но как вы его используете? – user189035

+0

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

+0

Я действительно пытаюсь изучить этот материал. Я добавлю более подробный пример к вопросу (также для будущих читателей) – user189035

2

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

Если вы хотите, чтобы убедиться, что файл создан с нуля, добавить дополнительную строку кода, чтобы удалить его:

os.remove(os.path.join(paths["work"], "oneDayFileLoader.log")) 
2

режим указан как часть logging.basicConfig и передается через использование FileMode ,

logging.basicConfig(
    level = logging.DEBUG, 
    format = '%(asctime)s %(levelname)s %(message)s', 
    filename = 'oneDayFileLoader.log, 
    filemode = 'w' 
) 

https://docs.python.org/3/library/logging.html#simple-examples

+0

Подождите, какая часть кода в вопросе заменит? – user189035

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