如何捕获在 IIS、FastCGI 和 WSGI 下运行的 Python 进程的 STDOUT?

sff*_*ffc 7 python iis wsgi fastcgi

我有一个 Python Flask 应用程序。当我从PowerShell中运行它,我可以看到输出的来电来样来的功能流print()logging.info()在我的代码。

当我将 IIS 指向我的应用程序并让它通过带有web.config文件的FastCGI 运行时,该输出流去哪里了?如何将其捕获到日志文件中?

Pet*_*jko 5

使用FastCGI/WSGI时有3种日志文件。

让我们来命名它们:

  • WSGI日志
    • 以下示例中的文件名:wsgi_myapp.log
    • 从 wsgi 主脚本获取流(StdOut、StdErr)
    • 例如,当您将页面的新版本发布到服务器时,wsgi 将重新启动并且有关重新启动的消息会出现在那里。
    • 另一个例子是当您的应用程序遇到未捕获的错误时,它将回溯保存到此文件中
  • 应用日志
    • 以下示例中的文件名:myapp.log
    • 这里是您想要记录的所有内容app.logger.LEVEL("..."),考虑到记录器和处理程序上设置了正确的级别
  • HTTP 请求日志
    • 不是我下面的代码示例的一部分
    • HTTP 服务器收到的请求的日志
    • 您可以在网页的 IIS 日志记录设置中更改此日志的位置和行为
    • 您可以在开发过程中看到这些以及您自己的打印和日志消息
    • 烧瓶示例:"[2019-01-12 21:08:00,748] INFO in _internal: 127.0.0.1 - - [12/Jan/2019 21:08:00] "GET /static/js/jquery-3.3.1.min.js HTTP/1.1" 304 -
    • 国际空间站的示例:2019-01-12 20:42:41 10.175.214.88 GET /static/js/jquery-ui.min.js 80 ****USER**** ****IP**** Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/70.0.3538.110+Safari/537.36 http://yourweb.com/smthing 304 0 0 1875

看这个例子:

from flask import Flask
from logging.config import dictConfig

dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {
        'wsgi': {
            'class': 'logging.StreamHandler',
            'formatter': 'default'
        },
        'custom_handler': {
            'class': 'logging.FileHandler',
            'formatter': 'default',
            'filename': r'C:\inetpub\wwwroot\myapp\logs\myapp.log'
        }
    },
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi', 'custom_handler']
    }
})

app = Flask(__name__)

# other imports using logger should go here
# from a import b
# ...
Run Code Online (Sandbox Code Playgroud)

和 web.config 文件:

<configuration>
  <system.webServer>
    <handlers>
      <remove name="Python FastCGI" />
      <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="E:\Python362_64\python.exe|E:\Python362_64\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
        <urlCompression doStaticCompression="true" doDynamicCompression="true" />
  </system.webServer>
  <appSettings>
    <!-- Required settings -->
    <add key="WSGI_HANDLER" value="myapp.app" />
    <add key="PYTHONPATH" value="C:\inetpub\wwwroot\myapp" />
    <add key="SCRIPT_NAME" value="/myapp" />
    <add key="WSGI_LOG" value="C:\inetpub\wwwroot\myapp\logs\wsgi_myapp.log" />
    <add key="WSGI_RESTART_FILE_REGEX" value=".*((\.py)|(\.config))$" />
  </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)