Python日志记录与文件轮换
我有一个用Python写的程序,它会把信息写入一个日志文件,这个文件会被Linux的logrotate命令进行轮换。当文件被轮换时,我需要通知我的程序停止写入旧文件,并开始写入新文件。我可以处理这个通知,但我该怎么告诉Python去写入新文件呢?
我这样打开文件:
logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO)
然后这样写入内容:
logging.log(level,"%s" % (msg))
虽然日志模块看起来很强大,但也让我感到有些不知所措。谢谢。
4 个回答
12
from logging import handlers
handler = handlers.TimedRotatingFileHandler(filename, when=LOG_ROTATE)
handler.setFormatter(logging.Formatter(log_format, datefmt="%d-%m-%Y %H:%M:%S"))
#LOG_ROTATE = midnight
#set your log format
这段话是说,这个内容应该能帮你处理旋转日志的问题。
33
你可以看看 WatchedFileHandler 来实现这个功能,或者你也可以选择使用 RotatingFileHandler 来实现日志轮换,这两者都在 logging.handlers模块 中。
44
不要使用 logging.basicConfig
,而是用 WatchedFileHandler
。下面是如何使用它的介绍。
import time
import logging
import logging.handlers
def log_setup():
log_handler = logging.handlers.WatchedFileHandler('my.log')
formatter = logging.Formatter(
'%(asctime)s program_name [%(process)d]: %(message)s',
'%b %d %H:%M:%S')
formatter.converter = time.gmtime # if you want UTC time
log_handler.setFormatter(formatter)
logger = logging.getLogger()
logger.addHandler(log_handler)
logger.setLevel(logging.DEBUG)
log_setup()
logging.info('Hello, World!')
import os
os.rename('my.log', 'my.log-old')
logging.info('Hello, New World!')