Как перенаправить вывод в web.py - PullRequest
5 голосов
/ 25 августа 2011

О web.py Как перенаправить вывод в другое место назначения вывода как файл журнала или избавиться от него полностью?

Ответы [ 5 ]

4 голосов
/ 02 апреля 2014

Мне пришлось изменить пример с http://webpy.org/cookbook/logging, чтобы иметь возможность записывать события запроса / ответа в файл.По сути, в дополнение к (согласно связанному примеру) передаче экземпляра WsgiLogging, который перегружает init , необходимо также перегрузить функцию 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)

Переменные web.config настроены в моей основной функции

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

Изменить 'logformat'переменная в FileLogger, чтобы изменить способ форматирования выходных данных в файле.

Насколько я могу судить, нет способа подавить вывод сообщений запроса / ответа, которые генерируютсяфреймворк web.pyОн использует свой собственный класс (LogMiddleware в httpserver.py) для распечатки событий.FileLogger просто добавляет себя к различным регистраторам, он не заменяет LogMiddleware.

Как только вы войдете в файл, как вам нужно, вы можете просто перенаправить вывод stdout и stderr в / dev / null;

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

Надеюсь, это поможет и удачи!

rdp

2 голосов
/ 27 августа 2011

Вывод на консоль 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
0 голосов
/ 01 ноября 2014

чтобы избавиться от него

web.config.debug = Ложь все равно не помогла. Некоторый вывод еще был сделан.

Строка комментария в файле: C: \ python27 \ Lib \ сайт-пакеты \ Web \ httpserver.py

строка:

print >> outfile, utils.safestr(msg) ->
#print >> outfile, utils.safestr(msg)
0 голосов
/ 29 ноября 2013

Несмотря на то, что это старая ветка, люди, работающие с ней, могут быть заинтересованы в этом решении из web.py cookbook

В основном объясняется, как контролировать ведение журнала для HTTPServer по умолчанию.

Обновление:

Другим решением будет непосредственное изменение кода web.py и перенаправление печати в httpserver.py в файл, как рекомендуется здесь .

0 голосов
/ 25 августа 2011

Вы можете напечатать в файл следующим образом:

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

Python также предоставляет модуль logging для функций журнала.

Однако качество вопроса оставляет слишком много для интерпретации того, что вы пытаетесь вывести и почему, таким образом, дать хороший ответ невозможно.Пожалуйста, попробуйте отредактировать вопрос для более подробной информации.

...