如何抑制web.py输出?

时间:2018-03-06 21:38:55

标签: python python-3.x terminal stderr web.py

我试图压制控制台的web.py输出。我不希望将所有输​​出都抑制到stderr或重定向输出,而只是阻止它将以下语句打印到控制台。

127.0.0.1:57691 - - [06/Mar/2018 22:25:43] "HTTP/1.1 GET /api/getDimensionColumnConstraints" - 200 OK

我已尝试将web.config.debug = False语句添加为main()函数的第一行,并且仍会为每次API调用打印此内容。

1 个答案:

答案 0 :(得分:1)

默认情况下,web.py的内置服务器会将HTTP信息和其他错误发送到stderr。我和你在一起 - 我想要错误,但不想要所有的HTTP语句。

所以,这就是你能做的。

  1. 创建自定义记录器

  2. 拦截记录器内的调用,抛出与该模式匹配的日志记录。

  3. 不是那么难,你将创建一个基本的wsgi应用程序中间件来拦截:

    import logging
    class Log:
        def __init__(self, xapp, logname="wsgi"):
            class O:
                def __init__(self, xapp, logname="wsgi"):
                    self.logger = logging.getLogger(logname)
                def write(self, s):
                    if s[-1] == '\n':
                        s = s[:-1]
                    if s == "":
                        return
                    if self.ignore(s):
                        return
                    self.logger.debug(s)
            self.app = xapp
            self.f = O(logname)
        def __call__(self, environ, start_response):
            environ['wsgi.errors'] = self.f
            return self.app(environ, start_response)
    

    将该中间件添加到应用程序的__main__初始化中。你可能有类似的东西:

    if __name__ == '__main__':
        app = web.application(urls, globals())
        app.run()
    

    更改run()以添加中间件:

        app.run(Log)
    

    现在是第二部分。请参阅上面的O.write()中的self.ignore(s)?使用它来决定处理或忽略日志记录语句,例如我:

    def ignore(self, s):
        if not all([web.config.get('debug_http', False),
                   any(['"HTTP/1.1 GET ' in s,
                        '"HTTP/1.1 POST ' in s])]):
            return True
        return False
    

    基本上说如果要打印的字符串包含'HTTP ...',请忽略它。我已将检查添加到全局标志'debug_http',这允许我设置(在任何地方,无论如何)启用/禁用此项。