【问题标题】:Python's logging issue in Tornado coroutineTornado 协程中 Python 的日志记录问题
【发布时间】:2016-03-31 22:53:04
【问题描述】:

几天前,我发现使用 Tornado 时出现奇怪的日志记录问题。

我有一组文件:

ma​​in.py:

 1  import logging
 2  import logging.config
 3  import os

 4  from somemodule.mod import ModClass
 5  from tornado import ioloop

 6  if __name__ == "__main__":
 7      logging.config.fileConfig("logging.ini")
 8      print ioloop.IOLoop.current().run_sync(ModClass.my_coroutine)

logging.ini:

 1  [loggers]
 2  keys=root

 3  [logger_root]
 4  level=NOTSET
 5  handlers=file

 6  [handlers]
 7  keys=file

 8  [handler_file]
 9  level=DEBUG
10  formatter=default
11  class=handlers.TimedRotatingFileHandler
12  args=('/tmp/some-system.log', 'D', 1, 7)

13  [formatters]
14  keys=default

15  [formatter_default]
16  format=%(asctime)s [%(levelname)s] %(name)s@%(lineno)d: %(message)s

somemodule/mod.py:

 1  import logging
 2  from tornado import gen

 3  logger = logging.getLogger(__name__)

 4  class ModClass(object):

 5      @classmethod
 6      @gen.coroutine
 7      def my_coroutine(cls):
 8          # logger = logging.getLogger(__name__)
 9          logger.critical("SOME MESSAGE")
10          raise gen.Return("Some string")

另外,我在某个模块目录中有一个空的 __init__.py。

如果我运行 main.py,我会在控制台中看到“Some string”,并且我有一个 created,但 empty 文件 /tmp/some-system.log .我不知道这个小系统出了什么问题。

为了使其正常工作,我必须在文件 somemodule/mod.py 中注释第 (3) 行并取消注释第 (8) 行。

有人知道如何让模块记录器工作而不需要在模块中的每个函数中声明它吗?在这个简单的例子中,造成如此奇怪行为的原因是什么?

附:我的环境:
Python 2.7.6
龙卷风==3.1.1

【问题讨论】:

    标签: python logging tornado coroutine


    【解决方案1】:

    您需要将fileConfig 的调用更改为fileConfig("logging.ini", disable_existing_loggers=False),如记录的here

    【讨论】:

    • 我不明白为什么会这样?即使在 Tornado 初始化日志以供自己使用的情况下,为什么它会破坏现有的日志配置?
    猜你喜欢
    • 2016-01-30
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多