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

Flask中如何让独立模块与主模块日志同时输出到控制台和文件?

解决Flask应用中模块日志不输出及多渠道日志配置问题

我来帮你快速搞定这个问题!你的情况其实有两个核心原因:

  • Flask自带的日志配置只作用于它自己的APP.logger,而util模块里的独立日志器(logger)没被配置输出渠道(控制台+文件);
  • util里的日志器默认级别是WARNING,所以你写的info级别的日志会被直接过滤掉,根本不会进入输出环节。

下面是最简单的实现方案,只需要修改你的主Flask文件,util模块完全不用动:

from flask import Flask
import util
import logging
from logging.handlers import RotatingFileHandler  # 用滚动日志文件更实用,避免文件过大

APP = Flask("app")
APP.debug = True

def setup_logging():
    # 获取根日志器,所有模块的日志器都会继承它的配置
    root_logger = logging.getLogger()
    root_logger.setLevel(logging.INFO)  # 设置最低日志级别为INFO,确保info及以上日志能被处理

    # 定义日志格式,包含时间、日志器名称、级别和消息
    log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    # 配置控制台输出handler
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(log_formatter)
    root_logger.addHandler(console_handler)

    # 配置文件输出handler,这里用滚动文件,单个文件最大1MB,最多保留5个备份
    file_handler = RotatingFileHandler(
        'app.log',
        maxBytes=1024 * 1024,
        backupCount=5,
        encoding='utf-8'
    )
    file_handler.setFormatter(log_formatter)
    root_logger.addHandler(file_handler)

# 初始化日志配置
setup_logging()

@APP.route('/', methods=['GET'])
def index():
    APP.logger.info("info message from index")
    util.test()
    return "hello world"

if __name__ == '__main__':
    APP.run()

为什么这样能解决问题?

  1. 根日志器配置继承:我们直接配置了Python日志系统的根日志器,APP.logger和util里的logging.getLogger(__name__)都是根日志器的子日志器,会自动继承根日志器的级别和输出handler,这样两个模块的日志都会同时输出到控制台和文件。
  2. 日志级别统一设置:根日志器设置为INFO级别,所有子日志器如果没有单独设置级别,都会继承这个级别,这样util里的info日志就不会再被过滤了。

测试效果

运行你的Flask应用后,访问根路径/,你会看到控制台同时输出两条日志,同时项目目录下会生成app.log文件,里面也会包含这两条日志内容。

内容的提问来源于stack exchange,提问作者Philip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:07:35