9

我正在玩wsgiref.simple_server研究网络服务器的世界。 我想控制生成的日志,但在Python 的文档
中找不到任何关于它的信息。

我的代码如下所示:

from wsgiref.simple_server import make_server

def application(environ, start_response):
  start_response('200 OK', headers)
  return ['Hello World']

httpd = make_server('', 8000, application)
httpd.serve_forever()
4

2 回答 2

23

wsgiref.simple_server.make_server默认情况下创建一个WSGIServerwith WSGIRequestHandler

def make_server(
    host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler):
    """Create a new WSGI server listening on `host` and `port` for `app`"""
    server = server_class((host, port), handler_class)
    server.set_app(app)
    return server

WSGIRequestHandler这里从 扩展BaseHTTPServer.BaseHTTPRequestHandler,记录的魔法原来是:

def log_message(self, format, *args):
    sys.stderr.write("%s - - [%s] %s\n" %
                     (self.client_address[0],
                      self.log_date_time_string(),
                      format%args))

所以它实际上是记录到 stderr,而不是 python 日志记录模块。您可以在自己的处理程序中覆盖它:

class NoLoggingWSGIRequestHandler(WSGIRequestHandler):

    def log_message(self, format, *args):
        pass

并将您的自定义处理程序传递给服务器:

httpd = make_server('', 8000, application, handler_class=NoLoggingWSGIRequestHandler)
于 2015-08-09T13:16:53.270 回答
0

另一个奇怪的技巧是使用redirect_stderr.

import os
from contextlib import redirect_stderr


with redirect_stderr(open(os.devnull, "w")):
    with make_server("", 8051, app) as httpd:
        httpd.handle_request()
于 2020-08-14T13:09:14.763 回答