我在Windows上的Apache 2.2实例上部署了一个Flask应用程序,一切运行正常。
然后我决定在我的应用程序中实现日志记录并阅读the Flask docs:我决定使用文件记录器,它生成一个包含我期望的所有日志消息的日志文件...当我执行时会发生这种情况使用内置Flask网络服务器的应用程序。 以下是相关代码:
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将我的应用程序日志写入通过其配置确定的另一个文件也是可以接受的。
提前致谢!
答案 0 :(得分:3)
您拥有if __name__ == '__main__'
内的整个日志记录设置代码,只有在您使用Flask的开发服务器时才会运行。在Apache服务器上显然不是这种情况。简短的回答是:
在if条件之前移动整个日志记录代码,你应该没问题。
您也可以将代码放在if-block之后的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)
答案 1 :(得分:2)
由于您运行的是Windows:
哪个用户帐户运行Apache服务?默认它是系统。此帐户在访问网络资源方面受到限制。 Flask应用程序是否位于共享网络驱动器上?
您是否尝试设置日志文件的完整路径?
如果这没有帮助,您可以发布应用程序的Apache配置吗?
修改强>
我刚看到您在__name__ == '__main__'
下配置了日志记录如果我没有弄错,当使用mod_wsgi部署应用程序时,此代码不。在这种情况下,您必须在其他地方配置日志记录。
答案 2 :(得分:0)
确保运行apache进程的用户对您尝试写入的文件夹具有权限。另外,我会检查结果:
sudo find / -name myapp.log