python tornado 应用程序中的重复日志记录问题

Duplicate logging issue in a python tornado app

我正在 运行安装 python (v 3.6) tornado 应用程序(我相信最新版本 6.x)。我正在尝试删除我的 print() 语句并改用日志记录模块。首先我创建了这个 get_logger() 函数:

def get_logger(lname, debug_level=logging.DEBUG):
  lname_logger = logging.getLogger(lname)
  lname_logger.setLevel(debug_level)
  ch = logging.StreamHandler(sys.stdout)
  ch.setLevel(debug_level)

  FORMAT = '%(asctime)s,[%(filename)s:%(lineno)d] %(message)s'
  formatter = logging.Formatter(FORMAT)
  ch.setFormatter(formatter)
  lname_logger.addHandler(ch)
  return lname_logger

在我的龙卷风应用程序处理程序中,我有以下代码(我删除了不相关的位并将其剥离到最低限度):

class App(object):

   def __init__(self):
     self.logger = utils.get_logger("myApp")
     tornado.options.parse_command_line()
     self.application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/login", LoginHandler),
        ...
     ])
     self.application.listen(options.port)
     self.logger.info("Listening on port %d" % options.port)
     tornado.ioloop.IOLoop.current().start()

当我 运行 这段代码时,我看到日志记录发生了两次,如下所示:

2019-04-14 12:50:01,636,[server.py:231] Listening on port 8000
[I 190414 12:50:01 server:231] Listening on port 8000

现在有趣的一点是,如果我 运行 在独立 python 文件中的龙卷风应用程序之外的日志记录代码,它只打印第一行。在 Tornado 应用程序中,每个调用以两种不同的格式打印两次(第二行根据日志级别和更多信息进行着色)。我相信第二行是由 Tornado 通过我触发的一些内置日志记录打印的。那么如何设置我的日志记录以不打印重复项并仅使用第二种?

好的,我在重新阅读有关 Tornado 内置日志记录机制的文档时找到了答案:

This formatter is enabled automatically by tornado.options.parse_command_line or tornado.options.parse_config_file (unless --logging=none is used).

这正是我在做的。当我切换到仅使用 Tornado 记录器时,重复项消失了。