Flask应用日志文件在Apache部署下未写入

2 投票
3 回答
2095 浏览
提问于 2025-04-17 18:08

我在Windows上把一个Flask应用部署到了Apache 2.2上,一切运行得很顺利。

然后我决定在我的应用中加入日志功能,于是我查看了Flask的文档。我选择了使用文件日志记录,这样可以生成一个日志文件,里面包含我想要的所有日志信息……这个功能在我用Flask自带的web服务器运行应用时是可以正常工作的。以下是相关的代码:

if __name__ == '__main__':
    #Create a rotating logfile for the application
    handler = RotatingFileHandler('myapp.log', maxBytes=10000, backupCount=1)
    handler.setLevel(logging.INFO)
    handler.setFormatter(Formatter('[%(levelname)s][%(asctime)s] %(message)s'))
    app.logger.setLevel(logging.INFO)
    app.logger.addHandler(handler)
    #Run the app
    app.run(host='0.0.0.0', port=5000)

但是当我把应用部署到Apache上时,我的应用就不再创建或写入那个日志文件了。日志信息甚至没有写入标准的Apache日志文件,因为Apache对我的日志框架一无所知。

有没有办法强制我的应用在通过Apache执行时也创建日志文件?如果Apache能把我的应用日志写入另一个通过配置指定的文件也可以。

提前谢谢你们!

3 个回答

0

确保运行apache程序的用户对你想写入的文件夹有权限。另外,我建议你检查一下以下命令的结果:

sudo find / -name myapp.log
2

因为你在使用Windows系统:

请问是哪个用户账户在运行Apache服务?默认情况下是“系统”账户。这个账户在访问网络资源时权限有限。你的Flask应用是不是放在一个共享的网络驱动器上?

你有没有尝试给你的日志文件设置一个完整的路径?

如果这样做还是不行,你能把你应用的Apache配置发出来吗?

编辑:我刚看到你在__name__ == '__main__'下配置日志。如果我没记错的话,这段代码在用mod_wsgi部署应用时不会被执行。在这种情况下,你需要在其他地方配置你的日志。

4

你现在的日志设置代码放在了 if __name__ == '__main__' 里面,这段代码只有在你使用Flask的开发服务器时才会运行。而在你的Apache服务器上,显然不会这样运行。简单来说:

把整个日志代码移到if条件之前,这样就没问题了。


你也可以把代码放在if块之后的一个 else 块里,这样在开发时就可以关闭日志(因为你在那时本来就是用调试模式)。但其实我建议把服务器相关的东西放在专门的文件里,而不是放在应用程序里。

所以你会有一个生产环境的“启动器”:

from myapp import app

# logging stuff
# app.logger.setHandler(...)

# more configuration

# do some stuff for apache (?)

还有一个调试环境的“启动器”:

from myapp import app
app.run(debug=True)

撰写回答