Python 的 logging
模块中,%(filename)s
占位符用于在日志输出中包含记录日志消息的源文件的名称。如果你的日志输出显示的是“应用”或者不是预期的文件名,这可能是因为:
- Logger Name:
%(name)s
占位符用于输出 Logger 的名字,而不是文件名。如果你想要输出文件名,确保你在日志格式中使用的是%(filename)s
。 - Formatter 配置: 检查你的日志格式设置是否正确。确保你的
Formatter
对象使用了%(filename)s
而不是%(name)s
。 - Logger Name 和默认值: 如果你使用的是默认的 logger (
root logger
),它的名字是'root'
。如果你创建了自定义的 logger,它的名字会是你在创建时指定的。 - 日志调用位置: 确保你的日志调用位于你想要输出文件名的模块中。如果你在一个模块中调用日志,但日志配置在另一个模块中,可能不会显示正确的文件名。
- 多个 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。这样,你的日志输出就会包含正确的文件名和行号。
发表回复