【问题标题】:How to capture STDOUT of a Python process running under IIS, FastCGI, and WSGI?如何捕获在 IIS、FastCGI 和 WSGI 下运行的 Python 进程的 STDOUT?
【发布时间】:2015-10-30 00:31:00
【问题描述】:

我有一个 Python Flask 应用程序。当我从 PowerShell 运行它时,我可以在整个代码中看到来自对 print()logging.info() 等函数的调用的输出流。

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

【问题讨论】:

    标签: python iis wsgi fastcgi


    【解决方案1】:

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

    让我们为它们命名:

    • WSGI 日志
      • 以下示例中的文件名:wsgi_myapp.log
      • 从 wsgi 主脚本获取流(StdOut、StdErr)
      • 例如,当您将页面的新版本发布到服务器时,wsgi 将重新启动,并且有关重新启动的消息会发送到那里。
      • 另一个例子是当您的应用程序遇到未捕获的错误时,它会将回溯保存到此文件中
    • 应用日志
      • 以下示例中的文件名:myapp.log
      • 这里有您想通过 app.logger.LEVEL("...") 记录的所有内容,考虑到在记录器和处理程序上设置了正确的 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
    # ...
    

    和 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>
    

    【讨论】:

    • 你能澄清一下wsgi_myapp.logmyapp.log的内容吗?
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2010-12-04
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多