2

我在 Windows 上的 Apache 2.2 实例上部署了一个 Flask 应用程序,一切运行良好。

然后我决定在我的应用程序中实现日志记录并阅读Flask 文档:我决定使用文件记录器,它会生成一个日志文件,其中包含我期望的所有日志消息......当我使用内置 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 将我的应用程序日志写入通过其配置确定的另一个文件也是可以接受的。

提前致谢!

4

3 回答 3

4

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

将整个日志记录代码移到 if 条件之前,你应该没问题。


您还可以将代码放在elseif 块之后的块中,以在开发时禁用日志记录(因为无论如何您都在使用调试模式)。但实际上我会将特定于服务器的东西放在不属于应用程序的特定于服务器的文件中。

所以你有一个生产“启动器”:

from myapp import app

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

# more configuration

# do some stuff for apache (?)

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

from myapp import app
app.run(debug=True)
于 2013-03-07T12:07:53.430 回答
2

由于您正在运行 Windows:

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

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

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

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

于 2013-03-07T11:01:39.973 回答
0

确保运行 apache 进程的用户对您尝试写入的文件夹具有权限。另外,我会检查以下结果:

sudo find / -name myapp.log
于 2013-03-06T19:43:31.010 回答