如何重定向web.py中的输出?



关于web.py如何将输出重定向到另一个输出目的地像一个日志文件还是完全摆脱它?

我必须修改来自http://webpy.org/cookbook/logging的示例,以便能够将请求/响应事件记录到文件中。基本上,除了(根据链接的示例)传递重载init的wsgillogging实例外,call函数也需要重载。

class FileLog(WsgiLog):
  def __init__(self, application):
    WsgiLog.__init__(
        self,
        application,
        logformat = '[%(asctime)s][%(name)s][%(levelname)s]: %(message)s',
        debug = True,
        tofile = web.config.log_tofile,
        toprint =  False,
        file = web.config.log_file,
        loglevel = logging.DEBUG
        )
  def __call__(self, environ, start_response):
    def hstart_response(status, response_headers, *args):
      out = start_response(status, response_headers, *args)
      try:
        logline=environ["SERVER_PROTOCOL"]+" "+environ["REQUEST_METHOD"]+" "+environ["REQUEST_URI"]+" - "+status
      except err:
        logline="Could not log <%s> due to err <%s>" % (str(environ), err)
      self.logger.info(logline)
      return out
    return super(FileLog, self).__call__(environ, hstart_response)

网络。配置变量在我的主函数

中设置
import sys
import os
import datetime, time
import optparse
import logging
from wsgilog import WsgiLog
if __name__ == "__main__":
   parser = optparse.OptionParser()

   parser.add_option("--logfile", dest="logfile",  default="",
              help="OPTIONAL send log messages to specified file instead of std out")
   (options, args) = parser.parse_args()
   #P Need to "eat" all of the passed in args because webpy will try to interpret them first
   sys.argv = []
   webpyapp = web.application(urls, locals())
   if hasattr(options, "logfile") and options.logfile != '':
     web.config.log_file = options.logfile
     web.config.log_toprint = False
     web.config.log_tofile = True
     webpyapp.run(FileLog)
   else:
     webpyapp.run()

这将记录请求事件和对指定文件的响应,如下所示

[Tue, 01 Apr 2014 17:40:56][wsgilog.log][INFO]: HTTP/1.1 OPTIONS /api/sessions/5399d05f41f0 - 200 OK
[Tue, 01 Apr 2014 17:40:56][wsgilog.log][INFO]: HTTP/1.1 GET /api/sessions/5399d05f41f0 - 200 OK
[Tue, 01 Apr 2014 17:40:56][wsgilog.log][INFO]: HTTP/1.1 GET /api/sessions/5399d05f41f0/tasks/ - 200 OK
[Tue, 01 Apr 2014 17:40:56][wsgilog.log][INFO]: HTTP/1.1 GET /api/sessions/5399d05f41f0/tasks//messages/?timestamp__gt=1396291350 - 200 OK

修改FileLogger中的'logformat'变量,以改变文件中输出的格式。

据我所知,没有办法抑制web.py框架生成的请求/响应消息的输出。它使用自己的类(httpserver.py中的LogMiddleware)来打印事件。FileLogger只是将自己添加到各种记录器中,它并不取代LogMiddleware。

一旦你有了日志记录到你想要的文件,你可以把stdout和stderr的输出重定向到/dev/null;

./yourapp.py > /dev/null 2> /dev/null

希望这有帮助,祝你好运!

rdp

print的控制台输出发送给sys.stdout。如果需要,可以用打开的文件或自己的类文件对象替换此流。唯一的要求是你的自定义对象有一个write()方法。

class MyOutputStream(object):
    def write(self, data):
        pass   # Ignore output
import sys
sys.stdout = MyOutputStream()
print("Test")  # Output is ignored

如果要访问或恢复原始输出流,请使用sys.__stdout__

sys.stdout = sys.__stdout__  # Restore stdout

可以打印到这样的文件:

 file = open("/tmp/test.txt", "wt")
 print >> file, "Foobar"

Python还为日志函数提供了logging模块。

然而,问题的质量留下了太多的解释你想要输出什么和为什么,因此给出一个好的答案是不可能的。

虽然这是一个老线程,但人们可能会对web.py烹饪书中的解决方案感兴趣

它基本上解释了如何控制默认HTTPServer的日志记录。

更新:

另一个解决方案是直接更改web.py的代码,并将httpserver.py中的打印重定向到一个文件,就像这里推荐的那样。

删除

web.config.debug = False仍然没有帮助。还做了一些输出。

注释掉文件中的行:C: Python27 Lib 网站 web httpserver.py

:

print >> outfile, utils.safestr(msg) ->
#print >> outfile, utils.safestr(msg)

最新更新