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

时间:2016-06-27 21:26:03

标签: python logging flask wsgi gevent

我正在使用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()

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

2 个答案:

答案 0 :(得分:3)

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

  

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

     

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

所以你应该可以wsgi.WSGIServer(('0.0.0.0', 8080), app, log=app.logger)

答案 1 :(得分:1)

您可以这样登录-

 for (var key in obj) {
  if (obj.hasOwnProperty(key)) {
          console.log(obj[key][i])         
  }
}