Python使用RotatingFileHandler实现日志自动切割
程序运行时间长了以后,日志文件可能不断增大,不仅占用磁盘空间,打开和检索也会越来越慢。Python自带的RotatingFileHandler可以按照文件大小自动切割日志,并保留指定数量的历史文件。
一、基本实现
importloggingfromlogging.handlersimportRotatingFileHandler logger=logging.getLogger("my_app")logger.setLevel(logging.INFO)handler=RotatingFileHandler(filename="app.log",maxBytes=5*1024*1024,backupCount=5,encoding="utf-8")formatter=logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")handler.setFormatter(formatter)logger.addHandler(handler)logger.info("程序启动")logger.warning("这是一条警告日志")logger.error("这是一条错误日志")二、参数说明
maxBytes表示单个日志文件允许的最大大小。示例中设置为5MB,当app.log超过限制后,程序会自动生成:
app.log app.log.1 app.log.2 app.log.3backupCount表示最多保留多少个历史日志文件。超过设定数量后,最旧的日志会被自动删除。
三、避免日志重复输出
如果初始化代码被多次调用,同一个处理器可能被重复添加,导致每条日志输出多次。可以在添加前进行判断:
ifnotlogger.handlers:logger.addHandler(handler)完整写法:
importloggingfromlogging.handlersimportRotatingFileHandlerdefcreate_logger():logger=logging.getLogger("my_app")logger.setLevel(logging.INFO)iflogger.handlers:returnlogger handler=RotatingFileHandler("app.log",maxBytes=5*1024*1024,backupCount=5,encoding="utf-8")handler.setFormatter(logging.Formatter("%(asctime)s | %(levelname)s | %(filename)s:%(lineno)d | %(message)s"))logger.addHandler(handler)returnlogger app_logger=create_logger()app_logger.info("日志系统初始化完成")四、适用场景
这种方式适合小型脚本、定时任务、爬虫和后台服务。对于高并发或多进程程序,还需要考虑多个进程同时写入同一文件的问题。
总结
通过RotatingFileHandler可以在不安装第三方模块的情况下实现日志切割,避免单个日志文件无限增长。合理设置文件大小和保留数量,也能减少磁盘空间被日志占满的风险。