Flask应用日志未输出预期格式,问题排查求助
问题
我尝试为INFO级日志设置特定格式,为DEBUG级日志使用默认格式。以下是配置logger及其处理器的代码:
logger = logging.getLogger("__name__") logging.basicConfig( level=logging.DEBUG) debugHandler = logging.StreamHandler(sys.stdout) debugHandler.setLevel(logging.DEBUG) infoHandler = logging.StreamHandler(sys.stdout) infoHandler.setLevel(logging.INFO) f2 = logging.Formatter("%(levelname)s:%(name)s:%(asctime)s:%(message)s", "%m/%d/%Y %H:%M:%S") infoHandler.setFormatter(f2) logger.addHandler(debugHandler) logger.addHandler(infoHandler)
调用日志的代码:
@app.route('/about') def about(): app.logger.info('"About Us" page retrieved') return render_template('about.html')
实际输出:
INFO:app:"About Us" page retrieved INFO:werkzeug:192.168.4.31 - - [06/Sep/2022 23:48:05] "GET /about HTTP/1.1" 200-
期望输出:
INFO:app:09/06/2022 23:48:05:"About Us" page retrieved
请问我哪里操作出错了?
解决方法
1. 日志实例不匹配
你代码里创建的是名为__name__的独立logger,但实际业务中调用的是Flask内置的app.logger,两者不是同一个实例,导致你的处理器配置完全没作用在实际输出的日志上。
2. 处理器无过滤规则,会重复输出
当前配置下,INFO级日志会同时被debugHandler和infoHandler处理:前者用默认格式输出,后者用自定义格式输出,最终会产生重复日志。必须给处理器添加过滤规则,让每个处理器只处理对应级别的日志。
3. 默认处理器干扰输出
logging.basicConfig会给根logger自动添加一个默认的StreamHandler,导致日志被额外输出,需要先移除Flask logger自带的默认处理器。
修正后的代码示例
import logging from flask import Flask, render_template import sys app = Flask(__name__) # 获取Flask内置的app.logger,而非新建独立logger logger = app.logger # 移除默认处理器,避免重复输出 for handler in logger.handlers[:]: logger.removeHandler(handler) # 配置DEBUG处理器:仅处理DEBUG级日志 debugHandler = logging.StreamHandler(sys.stdout) debugHandler.setLevel(logging.DEBUG) # 添加过滤器,只放行DEBUG级日志 class DebugFilter(logging.Filter): def filter(self, record): return record.levelno == logging.DEBUG debugHandler.addFilter(DebugFilter()) # 配置INFO处理器:处理INFO及以上级别,使用自定义格式 infoHandler = logging.StreamHandler(sys.stdout) infoHandler.setLevel(logging.INFO) f2 = logging.Formatter("%(levelname)s:%(name)s:%(asctime)s:%(message)s", "%m/%d/%Y %H:%M:%S") infoHandler.setFormatter(f2) logger.addHandler(debugHandler) logger.addHandler(infoHandler) # 设置logger全局级别为DEBUG,确保所有级别日志能被处理器接收 logger.setLevel(logging.DEBUG) @app.route('/about') def about(): app.logger.info('"About Us" page retrieved') app.logger.debug('Debug message test') # 测试DEBUG级日志输出 return render_template('about.html') if __name__ == '__main__': app.run()
修改后,INFO级日志会按你定义的格式输出,DEBUG级日志保留默认格式,且不会出现重复日志。
内容的提问来源于stack exchange,提问作者Mayukh Chakravartti
相关产品推荐
相关产品推荐

