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
相关产品推荐
相关产品推荐

