如何限制Python中的日志文件大小
我正在使用Windows 7和Python 2.7。
我想把我的日志文件大小限制在5MB。
我的应用程序在启动时会写入日志文件,然后就结束了。
当我的应用程序再次启动时,它会继续写入同一个日志文件。所以这个应用程序并不是一直在运行。
应用程序启动、处理完事情后就结束了。
这是我用来记录日志的代码:
import logging
import logging.handlers
logging.basicConfig(filename=logfile.log, level="info", format='%(asctime)s %(levelname)s %(funcName)s(%(lineno)d) %(message)s')
logging.info("*************************************************")
我试过用RotatingFileHandler
,但没有成功。
logging.handlers.RotatingFileHandler(logFile, mode='a', maxBytes=5*1024*1024, backupCount=2, encoding=None, delay=0)
那么,我该如何在Python中强制限制文件大小呢?
3 个回答
17
要使用BasicConfig和RotatingFileHandler,首先需要在BasicConfig中把RotatingFileHandler添加为处理器。
main.py:
import logging
rfh = logging.handlers.RotatingFileHandler(
filename='foo.log',
mode='a',
maxBytes=5*1024*1024,
backupCount=2,
encoding=None,
delay=0
)
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s %(name)-25s %(levelname)-8s %(message)s",
datefmt="%y-%m-%d %H:%M:%S",
handlers=[
rfh
]
)
logger = logging.getLogger('main')
logger.debug("test")
other.py
import logging
class Other():
def __init(self):
self.logger = logging.getLogger('other')
self.logger.info("test2")
内容"test"会带着标签'main'写入foo.log文件。
内容"test2"会带着标签'other'写入foo.log文件。
19
当你使用 logging.basicConfig 来设置日志文件时,系统会创建一个文件处理器,负责把日志写入这个文件。
之后,你又用 logging.handlers.RotatingFileHandler 创建了另一个处理器,指向同一个文件。
现在,当需要进行文件轮换时,RotatingFileHandler 会尝试删除旧的日志文件,但它无法做到,因为还有一个文件处理器在打开这个文件。
如果你直接查看日志文件的处理器,就能看到这一点。
import logging
from logging.handlers import RotatingFileHandler
log_name = 'c:\\log.log'
logging.basicConfig(filename=log_name)
log = logging.getLogger()
handler = RotatingFileHandler(log_name, maxBytes=1024, backupCount=1)
log.addHandler(handler)
[<logging.FileHandler object at 0x02AB9B50>, <logging.handlers.RotatingFileHandler object at 0x02AC1D90>]
107
去掉 basicConfig()
,改用 RotatingFileHandler:
import logging
from logging.handlers import RotatingFileHandler
log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(funcName)s(%(lineno)d) %(message)s')
logFile = 'C:\\Temp\\log'
my_handler = RotatingFileHandler(logFile, mode='a', maxBytes=5*1024*1024,
backupCount=2, encoding=None, delay=0)
my_handler.setFormatter(log_formatter)
my_handler.setLevel(logging.INFO)
app_log = logging.getLogger('root')
app_log.setLevel(logging.INFO)
app_log.addHandler(my_handler)
while True:
app_log.info("data")