Мне пришлось изменить пример с 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