I have a Python Flask app. When I run it from PowerShell, I can see the stream of output coming from calls to functions like print()
and logging.info()
throughout my code.
When I point IIS to my app and have it run through FastCGI with a web.config file, where does that output stream go? How can I capture it to a log file?
When using Internet Information Services (IIS) as a web server on a Windows computer (including Windows virtual machines on Azure), Python apps must include specific settings in their web. config files so that IIS can properly process Python code.
Prerequisites. Download the executable file and install Python in “C:\Python” folder and add “C:\Python\” and “C:\Python\Scripts” to the system environment variables. We can verify the installation by using the command prompt (CMD). To run a flask application in IIS server, we need the “flask” and “wfastcgi” libraries.
wfastcgi.py provides a bridge between IIS and Python using WSGI and FastCGI, similar to what mod_python provides for Apache HTTP Server. It can be used with any Python web application or framework that supports WSGI, and provides an efficient way to handle requests and process pools through IIS.
There are 3 kinds of log files when you use FastCGI/WSGI.
Let's name them:
app.logger.LEVEL("...")
, considering the right LEVEL is set on the logger as well as on the handler"[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
See this example:
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
# ...
and the web.config file:
<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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With