当前位置: 首页 > 面试题库 >

在由Gunicorn托管时,为什么Flask应用程序不创建任何日志?

松德曜
2023-03-14
问题内容

我正在尝试将日志添加到使用Flask的Web应用程序中。

使用内置服务器(即python3 server.py)托管时,日志记录有效。使用Gunicorn托管时,不会创建日志文件。

重现问题的最简单代码是以下代码:

#!/usr/bin/env python

import logging
from flask import Flask
flaskApp = Flask(__name__)


@flaskApp.route('/')
def index():
    flaskApp.logger.info('Log message')
    print('Direct output')
    return 'Hello World\n'


if __name__ == "__main__":
    logHandler = logging.FileHandler('/var/log/demo/app.log')
    logHandler.setLevel(logging.INFO)
    flaskApp.logger.addHandler(logHandler)
    flaskApp.logger.setLevel(logging.INFO)
    flaskApp.run()

使用以下命令调用该应用程序:

gunicorn server:flaskApp -b :80 -w 4
    --access-gfile /var/log/demo/access.log
    --error-logfile /var/log/demo/error.log

当对网站主页进行请求时,将发生以下情况:

  1. 我收到预期的HTTP 200“ Hello World \ n”作为响应。

  2. 中有该请求的痕迹/var/log/demo/access.log

  3. /var/log/demo/error.log保持不变(只有启动事件)。

  4. 终端中有“直接输出”行。

  5. 没有“ /var/log/demo/app.log”。如果在启动应用程序之前创建文件,则不会修改该文件。

注意:

  • 每个人/var/log/demo都可以访问(读取,写入,执行)该目录,因此这不是权限问题。

  • 如果我添加StreamHandler为第二个处理程序,则无论是在终端还是在Gunicorn日志文件中,都仍然没有“ Log message”消息的踪迹。

  • 使用来安装Gunicorn pip3 install gunicorn,因此与Python版本应该不会有任何不匹配。

发生了什么?


问题答案:

使用时,python3 server.py你正在运行server3.py脚本。

使用时,gunicorn server:flaskApp ...你正在运行gunicorn启动脚本,然后将其导入模块server并flaskApp在该模块中查找变量。

由于server.py正在导入,因此__name__var将包含"server",而不包含,"__main__"因此你的日志处理程序设置代码未在运行。

你可以简单地将日志处理程序设置代码移到该if __name__ == "__main__":节之外。但是,请确保你留在那儿,flaskApp.run()因为你不希望在进口金枪鱼时就那样进行server



 类似资料:
  • 据我所知,Flask应该创建一个线程和第二个线程在其上运行,但我看到的是总是有两个进程在运行,而不是线程。即使是最简单的应用程序。 您可以看到两个进程正在运行: 这里到底发生了什么?

  • 问题内容: 据我了解,Flask应该创建一个线程并在其上运行第二个线程,但是我看到总是有两个进程在运行,而不是线程。即使是最简单的应用程序。 您可以看到两个进程正在运行: 这是怎么回事 问题答案: 这是因为您正在使用重新加载器运行开发服务器。重新加载程序监视文件系统中的更改,并以不同的过程启动真实应用程序,因此共有两个过程。 您可以通过点按或致电来禁用重新加载器。

  • 问题内容: 我想要达到的目标: 我有一个托管mydomain.com的Nginx Web服务器。当有人将我的domain.com键入其客户端时,我希望我的服务器从中提供index.html。他们键入mydomain.com/flaskapp1时,他们应该看到flaskapp1。当他们键入mydomain.com/flaskapp2时,他们应该看到flaskapp2。 我已经成功地使用此处的教程ht

  • 我是JavaEE的新手,我有一个任务要做,但不知道如何去做。我需要创建一个管理bean,将在应用程序上的作用域。每次我们启动应用程序时,bean都需要从数据库加载一个数据列表。所以,根据我在网上的研究,我需要: 创建一个托管Bean 那么如何在应用程序启动时设置加载呢?然后如何从应用程序中的任何地方获取这些加载的数据?

  • 问题内容: 我是Java的新手,我正尝试使用Firebase托管Java Web应用程序。 问题 我的问题似乎是我的文件不存在于我的Java文件结构中。因此,我不能在文件中“指向它” 。 题 关于如何托管Java Web应用程序,我不了解什么? 部署Java Web应用程序时是否有文件(Firebase显然需要)? 如何成功托管Java Web应用程序? Firebase托管设置说明: 设置与安装

  • 3 CoreFoundation CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION+28 4 CoreFoundation__CFrunloopdoTimer+880 5 CoreFoundation__CFrunloopdoTimers+276 10 Figment POS AppDelegate.Swift-第39行main+39 11