Python Tornado - 禁用日志记录到stderr

Zaa*_*Hai 8 python tornado

我有简约的龙卷风应用程序:

import tornado.ioloop
import tornado.web

class PingHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("pong\n")

if __name__ == "__main__":
    application = tornado.web.Application([ ("/ping", PingHandler), ])
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

Tornado不断向stderr报告错误请求:

WARNING:tornado.access:404 GET / (127.0.0.1) 0.79ms
Run Code Online (Sandbox Code Playgroud)

问题:它希望阻止它记录错误消息.怎么样?

龙卷风3.1版; Python 2.6

Zaa*_*Hai 14

很明显,当我们开始Tornado时,"某人"正在初始化日志记录子系统.这里的代码ioloop.py揭示了这个谜:

def start(self):
    if not logging.getLogger().handlers:
        # The IOLoop catches and logs exceptions, so it's
        # important that log output be visible.  However, python's
        # default behavior for non-root loggers (prior to python
        # 3.2) is to print an unhelpful "no handlers could be
        # found" message rather than the actual log entry, so we
        # must explicitly configure logging if we've made it this
        # far without anything.
        logging.basicConfig()
Run Code Online (Sandbox Code Playgroud)

basicConfig被调用并配置默认stderr处理程序.

因此,要为tonado访问设置正确的日志记录,您需要:

  1. tornado.access记录器添加处理程序:logging.getLogger("tornado.access").addHandler(...)

  2. 禁用上述记录器的传播:logging.getLogger("tornado.access").propagate = False.否则消息将同时到达您的处理程序和stderr


Sal*_*een 11

之前的答案是正确的,但有点不完整.这会将所有内容发送给NullHandler:

hn = logging.NullHandler()
hn.setLevel(logging.DEBUG)
logging.getLogger("tornado.access").addHandler(hn)
logging.getLogger("tornado.access").propagate = False
Run Code Online (Sandbox Code Playgroud)


Ali*_*Ali 5

你也可以很简单地(在一行中)做:

logging.getLogger('tornado.access').disabled = True
Run Code Online (Sandbox Code Playgroud)