使用 WSGI 服务器和 Flask 应用程序进行日志记录

pg2*_*455 5 python logging wsgi gevent flask

我正在使用 wsgi 服务器为我的 Web 应用程序生成服务器。我在记录信息时遇到问题。

这就是我运行应用程序的方式

from gevent import monkey; monkey.patch_all()
from logging.handlers import RotatingFileHandler
import logging
from app import app # this imports app

# create a file to store weblogs
log = open(ERROR_LOG_FILE, 'w'); log.seek(0); log.truncate();
log.write("Web Application Log\n"); log.close();

log_handler = RotatingFileHandler(ERROR_LOG_FILE, maxBytes =1000000, backupCount=1)

formatter = logging.Formatter(
    "[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s"
    )
log_handler.setFormatter(formatter)
app.logger.setLevel(logging.DEBUG)
app.logger.addHandler(log_handler)

# run the application
server=  wsgi.WSGIServer(('0.0.0.0', 8080), app)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

但是,在运行应用程序时,它不会记录任何内容。我想这一定是因为 WSGI 服务器,因为 app.logger 在没有 WSGI 的情况下工作。使用 WSGI 时如何记录信息?

pec*_*rin 3

根据gevent uwsgi 文档,您需要在创建时将日志处理程序对象传递给 WSGIServer 对象:

\n
\n

log \xe2\x80\x93 如果给定,则具有写入方法的对象将写入请求(访问)日志。如果未给出,则默认为 sys.stderr。您可以传递 None 来禁用请求日志记录。您可以使用包装器(例如日志记录)来支持不实现写入方法的对象。(如果您传递 Logger 实例,或者通常提供 log 方法但不提供 write 方法的实例,则会自动创建这样的包装器,并将其记录到 INFO 级别。)

\n

error_log \xe2\x80\x93 如果给定,则为类似文件的对象,具有写入、写入行和刷新方法,错误日志将写入其中。如果未给出,则默认为 sys.stderr。您可以传递 None 来禁用错误日志记录(不推荐)。您可以使用包装器(例如日志记录)来支持未实现正确方法的对象。该参数将成为 WSGI 环境中 wsgi.errors 的值(如果尚未设置)。(与日志一样,Logger 实例等的包装器将自动创建并记录到 ERROR 级别。)

\n
\n

所以你应该能够做到wsgi.WSGIServer((\'0.0.0.0\', 8080), app, log=app.logger)

\n