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

Python:如何仅将Flask及Werkzeug日志记录到指定文件

解决Flask/Werkzeug日志混入第三方库日志的问题

logging.basicConfig会直接配置根日志器,所有未单独设置日志规则的第三方库,都会继承根日志器的输出配置,这就是你的日志文件混入其他内容的原因。下面提供两种可行的解决方法:

方法一:单独配置Werkzeug/Flask日志器

直接针对Werkzeug和你的Flask应用日志器设置独立的文件输出,同时禁止日志向上传播到根日志器,避免第三方日志混入:

import logging
from flask import Flask

app = Flask(__name__)

# 配置日志格式
log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 获取Werkzeug日志器,设置级别并添加文件handler
werkzeug_logger = logging.getLogger('werkzeug')
werkzeug_logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('myapp.log')
file_handler.setFormatter(log_formatter)
werkzeug_logger.addHandler(file_handler)
werkzeug_logger.propagate = False  # 禁止日志传到根日志器

# 同时配置Flask应用自身的日志(可选)
app_logger = logging.getLogger(app.name)
app_logger.setLevel(logging.INFO)
app_logger.addHandler(file_handler)
app_logger.propagate = False

# 可选:调高根日志器级别,减少第三方库日志的控制台输出
logging.basicConfig(level=logging.WARNING)

方法二:用过滤器过滤指定日志

给根日志器的文件handler添加过滤器,只保留Flask应用和Werkzeug的日志:

import logging
from flask import Flask

app = Flask(__name__)

# 定义过滤器:只保留指定名称的日志记录
class TargetLogFilter(logging.Filter):
    def filter(self, record):
        return record.name == 'werkzeug' or record.name.startswith(app.name)

# 创建文件handler并添加过滤器
file_handler = logging.FileHandler('myapp.log')
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
file_handler.addFilter(TargetLogFilter())

# 配置根日志器使用带过滤的handler
logging.basicConfig(handlers=[file_handler], level=logging.INFO)

内容的提问来源于stack exchange,提问作者Shards-7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:15:54