我该如何让记录器在重新写入日志文件之前删除现有的日志文件?

54
使用以下配置,我的日志文件将被命名为“test-debug.log”,每次运行脚本时它都会无限增长。我只想让这个日志文件包含最近一次运行脚本的日志记录。在重新开始之前,应该删除日志。
我该怎么做呢?
logger = logging.getLogger('test') #Create a log with the same name as the script that created it
logger.setLevel('DEBUG')


#Create handlers and set their logging level
filehandler_dbg = logging.FileHandler(logger.name + '-debug.log')
filehandler_dbg.setLevel('DEBUG') 


#Create custom formats of the logrecord fit for both the logfile and the console
streamformatter = logging.Formatter(fmt='%(levelname)s:\t%(threadName)s:\t%(funcName)s:\t\t%(message)s', datefmt='%H:%M:%S') #We only want to see certain parts of the message


#Apply formatters to handlers
filehandler_dbg.setFormatter(streamformatter)


#Add handlers to logger
logger.addHandler(filehandler_dbg)
2个回答

68

试试这个:

filehandler_dbg = logging.FileHandler(
   logger.name + '-debug.log', 
   mode='w')

为了以写入模式而非追加模式打开文件名,覆盖logger.name

更多信息: logging.FileHandler 文档,open() 和模式列表


谢谢,现在它完美地工作了。 我实际上已经查看了“filehandler”的文档,但是没有更多关于为什么“mode = a”是默认值的信息。 现在我想我明白了,它来自fileIO语法之类的东西? - Paul H
2
没错。这里有所有模式的列表:http://docs.python.org/2/library/functions.html#open - dmcc
1
很遗憾,日志记录的文档没有链接回到那个 functions#open 页面,这将非常有用。 - nick fox
5
如果你正在使用 logging.basicConfig,添加 filemode='w' 会产生相同的效果。 - Ken Shirriff

2
如果您正在使用任何外部配置文件,则在处理程序的args中传递“w”以进行写模式。
[loggers]
keys=root

[logger_root]
level=DEBUG
handlers=file_handler

[handlers]
keys=file_handler

[handler_file_handler]
class=FileHandler
formatter=formatter
args=("../log/test" + time.strftime("%%Y%%m%%d%%H%%M%%S") + '.log', 'w')

[formatters]
keys=formatter

[formatter_formatter]
format=%(asctime)s %(levelname)-5s [%(module)s] %(message)s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接