Python logger:不会覆盖原始日志?

时间:2016-06-20 14:52:50

标签: python logging

因此,当我将以下x次粘贴到python提示符时,  它将日志x次添加到指定文件的末尾。

如何更改代码,以便每次复制粘贴到提示时, 我只是覆盖了现有的文件(代码似乎不接受 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()

3 个答案:

答案 0 :(得分:5)

如果我理解正确,您一次只能运行几天的Python流程,并希望每天轮换日志。我建议您使用自动旋转日志文件的处理程序,例如,使用不同的路径。 http://www.blog.pythonlibrary.org/2014/02/11/python-how-to-create-rotating-logs/

但是,如果你想用相同的方法控制日志,那么你很熟悉(Python控制台,粘贴代码......非常不合适且容易出错,但有时候快速肮脏就足够了对于手头的任务),好吧......

您的问题是,每次粘贴代码时都会创建一个新的FileHandler,并将其添加到Logger对象中。最终得到一个附有X FileHandler的记录器,所有记录器都写入同一个文件。试试这个:

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添加了一个示例。注意我还没有在本地测试它,所以如果你有问题ping回来。

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')

答案 1 :(得分:3)

您的日志消息正在重复,因为您多次致电addHandler。每次调用addHandler都会添加其他日志处理程序。

如果您想确保从头开始创建文件,请添加额外的代码行以将其删除:

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

答案 2 :(得分: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

相关问题