为什么龙卷风中的ioLoop似乎添加了根记录器处理程序?

时间:2015-05-21 12:21:08

标签: python logging tornado

我在我的系统中使用了python logging并找到了工作。 我的日志层次结构如下所示。

  1. 定义具有处理程序和格式化程序的日志A
  2. log A继承A.BA.C ....(子记录器只使用A的处理程序和格式化程序)
  3. 我不添加root logger处理程序。
  4. 所以所有记录器都工作了,共享A的处理程序。

    我需要添加Websocket程序,所以选择Tornado。 但是在添加Tornado之后,会突然出现重复的日志。

    例如。

    Time-A : log message  #This is log message I print
    INFO:A : log message  #This is duplicated log message
    

    更详细的说明,如果我致电ioloop.IOLoop.instance().start() 如果我阻止ioloop.IOLoop.instance().start(),则找不到问题。

    似乎ioloop.IOLoop.instance().start()添加了根记录器处理程序。

    为什么呢?我该如何解决?

1 个答案:

答案 0 :(得分:1)

事件循环必须从回调中捕获异常; Tornado使用日志记录来告诉您发生了异常。如果没有配置处理程序,您将永远不会看到这些消息,因此IOLoop在启动时会根据需要创建处理程序。为防止这种情况,请在启动IOLoop之前为根记录器或tornado记录器定义处理程序。

当IOLoop创建处理程序时,它会对根记录器而不是tornado记录器执行此操作,因为根处理程序是在其他位置自动创建的(即日志记录模块的顶级函数,如logging.error),因此,如果IOLoop创建了一个tornado处理程序,然后创建了一个名为logging.error的其他模块并创建了一个根处理程序,那么会有双重日志记录。