python龙卷风应用程序中的重复日志记录问题

时间:2019-04-14 19:56:33

标签: python logging tornado

我正在运行python(v 3.6)龙卷风应用程序(我相信最新版本是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通过触发的一些内置日志记录打印的。那么如何设置日志记录以不打印重复项,而仅使用第二种?

1 个答案:

答案 0 :(得分:0)

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

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

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