You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:47:40