开发者

How do I redirrect the output in web.py

About web.py How do I redirrec开发者_如何学Pythont the output to another output destination like a log file or get rid of it completely?


I had to modify the example from http://webpy.org/cookbook/logging to be able to log the request / response events to a file. Basically, in addition to (per the linked example) passing an instance of WsgiLogging that overloads init, the call function also needs to be overloaded.

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)

The web.config variables are set up in my main function

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()

This will log the request events and the response to the specified file, like this

[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

Modify the 'logformat' variable in FileLogger to change the way the output is formated in the file.

As far as I can tell, there is not a way to supress the output of the the request / response messages that are generated by the web.py framework. It uses its own class (LogMiddleware in httpserver.py) to print out events. The FileLogger just adds itself to the various loggers, it does not replace LogMiddleware.

Once you have logging going to the file as you want, you could just redirect the output of stdout and stderr to /dev/null;

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

Hope this helps and good luck!

rdp


Console output by print is sent to sys.stdout. You can replace this stream with an open file or your own file-like object if you want. The only requirement is that your custom object has a write() method.

class MyOutputStream(object):

    def write(self, data):
        pass   # Ignore output

import sys
sys.stdout = MyOutputStream()

print("Test")  # Output is ignored

If you want to access or restore the original output stream, use sys.__stdout__.

sys.stdout = sys.__stdout__  # Restore stdout


You can print to a file like this:

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

Python also provides logging module for log functions.

However the quality of the question leaves too much for interpretation what you are trying to output and why, thus giving a good answer is impossible. Please try to edit the question for more details.


Although it's an old thread, people running into it might be interested in this solution from the web.py cookbook

It basically explains how to control logging for a default HTTPServer.

Update:

Another solution would be directly changing web.py's code and redirect the print in httpserver.py to a file, like recommended here.


to get rid of it

web.config.debug = False still did not helped. Some output still was done.

Comment out line in file: C:\Python27\Lib\site-packages\web\httpserver.py

line:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜