每次启动应用程序时旋转日志文件(Python)

24 投票
5 回答
23419 浏览
提问于 2025-04-16 09:45

我在用Python的日志模块,想让它每次我的应用启动时都创建一个新的日志文件。旧的日志文件应该被轮换,比如说:logfile.txt 变成 logfile1.txt,依此类推。

我已经找到了一些资料:

http://docs.python.org/library/logging.html

BaseRotatingHandler是一个基础类,用于处理在特定时刻轮换日志文件的功能。这个类不应该直接使用。相反,你可以使用RotatingFileHandler或者TimedRotatingFileHandler。

RotatingFileHandler会在日志文件达到一定大小时进行轮换,而TimedRotatingFileHandler则是根据时间间隔来轮换。我并不想要这两种方式,我希望在我的应用启动时就立即进行轮换。

5 个回答

2

日志轮换和RotatingFileHandler通常是在应用程序运行很长时间(比如几天)时使用的,这样可以让日志文件不断更新。如果我需要在应用程序重启时就进行日志轮换,我发现把这个操作放在日志处理器之外会更简单。具体来说,就是在第一次调用日志写入之前,我会先检查一下日志文件是否已经存在。如果存在,就把它重命名,然后再创建一个新的日志文件。这里的重命名和处理器的重命名机制是不同的。

7

最简单的方法就是在日志文件的名字里加上日期,这样每次你启动应用的时候,就会生成一个新的日志文件。

比如:

dateTag = datetime.datetime.now().strftime("%Y-%b-%d_%H-%M-%S")
logging.basicConfig(filename="myapp_%s.log" % dateTag, level=logging.DEBUG)

这样每次你就会得到类似 myapp_2011-Jan-11_12-27-29.log 的日志文件。

另一个好处是,你可以把这个和 RotatingFileHandler 结合起来,这样每次运行应用时都会有一个单独的日志,而每个日志又可以进一步分成多个固定大小的日志。

41

我可能只需要使用 RotatingFileHandler,而不设置 maxBytes,然后在应用程序启动时调用 doRollover()

没错,这样看起来没问题。下面的代码每次运行应用程序时都会创建一个新的日志文件,并在日志的开始和结束时间上加上时间戳。运行这段代码会打印出可用的日志文件列表。你可以查看这些文件,确认它们的行为是否正常。这段代码是参考了Python文档中的示例:

import os
import glob
import logging
import logging.handlers
import time

LOG_FILENAME = 'logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Check if log exists and should therefore be rolled
needRoll = os.path.isfile(LOG_FILENAME)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, backupCount=50)

my_logger.addHandler(handler)

# This is a stale log, so roll it
if needRoll:    
    # Add timestamp
    my_logger.debug('\n---------\nLog closed on %s.\n---------\n' % time.asctime())

    # Roll over on application start
    my_logger.handlers[0].doRollover()

# Add timestamp
my_logger.debug('\n---------\nLog started on %s.\n---------\n' % time.asctime())

# Log some messages
for i in xrange(20):
    my_logger.debug('i = %d' % i)

# See what files are created
logfiles = glob.glob('%s*' % LOG_FILENAME)

print '\n'.join(logfiles)

撰写回答