Flask应用日志文件在Apache部署下未写入
我在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 个回答
确保运行apache程序的用户对你想写入的文件夹有权限。另外,我建议你检查一下以下命令的结果:
sudo find / -name myapp.log
因为你在使用Windows系统:
请问是哪个用户账户在运行Apache服务?默认情况下是“系统”账户。这个账户在访问网络资源时权限有限。你的Flask应用是不是放在一个共享的网络驱动器上?
你有没有尝试给你的日志文件设置一个完整的路径?
如果这样做还是不行,你能把你应用的Apache配置发出来吗?
编辑:我刚看到你在__name__ == '__main__'
下配置日志。如果我没记错的话,这段代码在用mod_wsgi部署应用时不会被执行。在这种情况下,你需要在其他地方配置你的日志。
你现在的日志设置代码放在了 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)