使用Streamlit覆盖日志文件失败,始终追加内容求技术支持
解决Streamlit中logging覆盖日志文件无效的问题
你的问题出在Streamlit的运行机制和logging模块的特性上:Streamlit每次交互都会重新执行整个脚本,但logging.basicConfig只有在第一次被调用时才会生效,后续调用会被直接忽略。第一次运行脚本时,filemode='w'确实会覆盖日志文件,但之后每次交互触发脚本重跑时,basicConfig不会重新配置日志器,日志依然使用之前创建的默认追加模式处理器,导致内容持续追加。
下面提供两种可行的解决方案:
方案1:显式创建FileHandler(推荐)
直接手动创建日志处理器,确保每次脚本运行都能重新设置覆盖模式:
import streamlit as st import logging # 清除根日志器中已有的所有处理器 for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) # 创建带覆盖模式的文件处理器 file_handler = logging.FileHandler('app.log', mode='w') # 设置日志格式 log_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') file_handler.setFormatter(log_formatter) # 将处理器添加到根日志器,并设置日志级别 logging.root.addHandler(file_handler) logging.root.setLevel(logging.INFO) logging.info('Application Started')
方案2:重置日志器后再调用basicConfig
在调用basicConfig前清空根日志器的处理器列表,强制重新配置:
import streamlit as st import logging # 重置根日志器的处理器 logging.root.handlers = [] # 重新配置日志,此时filemode='w'会生效 logging.basicConfig( filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filemode='w' ) logging.info('Application Started')
两种方案都能确保每次Streamlit脚本运行时,日志文件都会被覆盖而非追加。
内容的提问来源于stack exchange,提问作者SOURAVI BISWAS
相关产品推荐
相关产品推荐

