Flask应用程序日志文件不是在Apache部署下编写的

问题描述:

我在Windows上的Apache 2.2实例上部署了Flask应用程序,一切正常。Flask应用程序日志文件不是在Apache部署下编写的

然后我决定在我的应用程序中实现日志记录,并阅读the Flask docs:我决定使用文件记录器,它会生成一个日志文件,其中包含我期望的所有日志消息......这发生在我使用内置烧瓶webserver。 下面是相关代码:

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将我的应用程序日志写入通过其配置确定的另一个文件也是可以接受的。

在此先感谢!

您在if __name__ == '__main__'之内有整个日志记录设置代码,只有在使用Flask的开发服务器时才会运行。在Apache服务器上显然不是这种情况。简短的回答是:

在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) 
+0

感谢你们两位,@Markus Unterwaditzer和@khoffrath。我解决了在'.wsgi'文件中将日志代码从'if __name__ =='__main __''块移动到更高范围的问题。现在我可以使用绝对路径写入日志文件。 Yuppy-doooo! – csparpa 2013-03-07 13:12:50

确保运行apache进程的用户对您尝试写入的文件夹拥有权限。既然你运行的是Windows

sudo find/-name myapp.log 
+0

谢谢Craysiii,我检查了,但遗憾的是没有文件的迹象。我实际上是在Windows上运行Apache env – csparpa 2013-03-07 10:01:55

哪个用户帐户运行Apache服务同样,我会检查的结果?默认是系统。此帐户在访问网络资源方面受到限制。您的Flask应用程序位于共享网络驱动器上吗?

您是否尝试设置日志文件的完整路径?

如果这没有帮助,你可以发布你的应用程序的Apache配置吗?

编辑: 我刚才看到您配置__name__ == '__main__'下的记录,如果我没有记错的话这个代码时,应用程序部署与mod_wsgi的执行。在这种情况下,你必须在其他地方配置你的日志记录。