flask 日志使用

Python 的 logging 模块中,%(filename)s 占位符用于在日志输出中包含记录日志消息的源文件的名称。如果你的日志输出显示的是“应用”或者不是预期的文件名,这可能是因为:

  1. Logger Name: %(name)s 占位符用于输出 Logger 的名字,而不是文件名。如果你想要输出文件名,确保你在日志格式中使用的是 %(filename)s
  2. Formatter 配置: 检查你的日志格式设置是否正确。确保你的 Formatter 对象使用了 %(filename)s 而不是 %(name)s
  3. Logger Name 和默认值: 如果你使用的是默认的 logger (root logger),它的名字是 'root'。如果你创建了自定义的 logger,它的名字会是你在创建时指定的。
  4. 日志调用位置: 确保你的日志调用位于你想要输出文件名的模块中。如果你在一个模块中调用日志,但日志配置在另一个模块中,可能不会显示正确的文件名。
  5. 多个 Handlers: 如果你为同一个 logger 添加了多个 handlers,确保所有 handlers 都使用了相同的 formatter。

根据你提供的代码,你的日志格式字符串是:

python
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

这里使用的是 %(name)s,它将输出 logger 的名字而不是文件名。要显示文件名,你应该将格式字符串改为:

python
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

这样就会在日志输出中包含文件名和行号。

另外,你的代码中创建了两个 handler,第一个是 TimedRotatingFileHandler,第二个是 FileHandler,并且第二个 handler 覆盖了第一个的设置。你应该只使用一个 handler 并确保它被添加到了 app.logger。以下是修正后的代码片段:

# ...[省略其他导入和配置]...

def create_app(config_class=Config):
    # 创建 Flask 应用
    app = Flask(__name__)
    app.config.from_object(config_class)

    # 创建并设置日志 handler
    handler = TimedRotatingFileHandler(
        "flask.log", when="D", interval=1, backupCount=15,
        encoding="utf-8", delay=False, utc=True
    )
    
    # 创建日志格式器并设置到 handler
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')
    handler.setFormatter(formatter)
    
    # 将 handler 添加到 Flask app 的默认 logger
    app.logger.addHandler(handler)
    app.logger.setLevel(logging.INFO)  # 设置日志级别

    # ...[省略初始化 CKEditor、CSRFProtect、数据库和注册蓝图等]...

    return app

 

确保你的应用中只使用一个 logger,并且所有的日志调用都使用这个 logger。这样,你的日志输出就会包含正确的文件名和行号。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注