如何抑制 web.py 输出?
How to suppress web.py output?
我试图抑制控制台的 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 调用时打印此语句。
web.py 的 built-in 服务器默认将 HTTP 信息和其他错误发送到 stderr。我支持你——我想要错误,但不想要所有的 HTTP 语句。
那么,您可以执行以下操作。
创建自定义记录器
拦截记录器中的调用,抛出与模式匹配的日志记录。
没那么难,您将创建一个基本的 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',这允许我设置它(在某处,任何地方,无论如何)以启用/禁用此项目。
我试图抑制控制台的 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 调用时打印此语句。
web.py 的 built-in 服务器默认将 HTTP 信息和其他错误发送到 stderr。我支持你——我想要错误,但不想要所有的 HTTP 语句。
那么,您可以执行以下操作。
创建自定义记录器
拦截记录器中的调用,抛出与模式匹配的日志记录。
没那么难,您将创建一个基本的 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',这允许我设置它(在某处,任何地方,无论如何)以启用/禁用此项目。