LikeGiver

LikeGiver

Streamlit中的日志logging配置

2023-12-28

streamlit作为一个便捷GUI和python代码非常适配,但是我直接用logging库遇到一些问题

  1. 首先是logging.basicConfig级别设置为debug时出现大量日志信息直接塞爆log文件,所以我只敢设置为info级别了

然后是streamlit的页面是会刷新的,所以代码容易重复执行,特别是用到addHandler方法时,容易发生terminal输出一次的信息重复在log中记录,而且重复次数递增,解决方法如下:

import streamlit
########## 配置日志 ##########
import logging

# 创建日志配置函数
def setup_logger():
    if 'logger_configured' not in st.session_state:
        log_format = '%(asctime)s - %(levelname)s - %(message)s'
        formatter = logging.Formatter(log_format)
        
        # 创建一个文件处理器,并赋予一个唯一的名称
        file_handler = logging.FileHandler('st_log.log')
        file_handler.setLevel(logging.INFO)
        file_handler.setFormatter(formatter)
        file_handler_name = 'streamlit_file_handler'

        streamlit_root_logger = logging.getLogger(st.__name__)

        # 检查处理器是否已经存在
        if not any(handler.get_name() == file_handler_name for handler in streamlit_root_logger.handlers):
            file_handler.set_name(file_handler_name)
            streamlit_root_logger.addHandler(file_handler)
        
        st.session_state['logger_configured'] = True

# 在应用启动时配置日志
setup_logger()

# 使用日志记录器
streamlit_root_logger = logging.getLogger(st.__name__)
streamlit_root_logger.info("enter st_main_and_segment page")

########## 配置日志结束 ##########