如何防止Python Tornado登录到标准输出/控制台? [英] How to prevent Python Tornado from logging to stdout/console?

查看:11
本文介绍了如何防止Python Tornado登录到标准输出/控制台?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要禁用Tornado登录到STDOUT。我使用的是Python3.8,运行的是Ubuntu 18.04。我希望我的日志语句只由旋转文件记录器处理。问题是记录的语句会记录到文件中,也会记录到控制台中:

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger("ex_logger")

nh = logging.NullHandler()

rfh = RotatingFileHandler(filename="./logs/process.log", mode='a', maxBytes=50000000, backupCount=25, encoding=None, delay=False)
rfh.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rfh.setFormatter(formatter)

logger.handlers = []
logger.propagete = False
logger.addHandler(rfh)

logging.getLogger("tornado.access").handlers = []
logging.getLogger("tornado.application").handlers = []
logging.getLogger("tornado.general").handlers = []

logging.getLogger("tornado.access").addHandler(nh)
logging.getLogger("tornado.application").addHandler(nh)
logging.getLogger("tornado.general").addHandler(nh)

logging.getLogger("tornado.access").propagate = False
logging.getLogger("tornado.application").propagate = False
logging.getLogger("tornado.general").propagate = False

....

def main():

    ######
    # this message eppears in both the output log file and stdout
    ######
    logger.info(" application init ... ")
    
    asyncio.set_event_loop_policy(tornado.platform.asyncio.AnyThreadEventLoopPolicy())
    tornado.options.parse_command_line()
    app = Application()
    app.listen(options.port)
    tornado.ioloop.IOLoop.current().start()


if __name__ == "__main__":
    main()

推荐答案

问题是,从您启动集成开发环境的那一刻起,logging.getLogger("tornado")可能附加了StreamHandler。并不是每个IDE都会发生这种情况,但Spyder确实会发生这种情况。因此,您必须将其替换为NullHandler

import logging
nh = logging.NullHandler()
tornado_logger = logging.getLogger("tornado")
tornado_logger.handlers.clear()
# tornado_logger.handlers = []  # would work instead of .clear() but it's best practice to change the list and not replace it, just in case some other variable name somewhere else still refers to it.
tornado_logger.addHandler(nh)

您不需要处理"tornado"记录器的子项,例如"tornado.access"等。

这篇关于如何防止Python Tornado登录到标准输出/控制台?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆