Python Tornado 协程中的日志记录问题
Python's logging issue in Tornado coroutine
几天前,我发现使用 Tornado 时出现奇怪的日志记录问题。
我有一组文件:
main.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,但是 空 文件 /tmp/some-system.log。不知道这个小系统有什么问题
为了使其正常工作,我必须在文件 somemodule/mod.py.
中注释行 (3) 并取消注释行 (8)
有谁知道如何使模块记录器工作而无需在模块的每个函数中声明它?在这个简单的例子中出现如此奇怪行为的原因是什么?
P.S。我的环境:
Python2.7.6
龙卷风==3.1.1
您需要将对 fileConfig
的调用更改为 fileConfig("logging.ini", disable_existing_loggers=False)
,如记录的那样 here。
几天前,我发现使用 Tornado 时出现奇怪的日志记录问题。
我有一组文件:
main.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,但是 空 文件 /tmp/some-system.log。不知道这个小系统有什么问题
为了使其正常工作,我必须在文件 somemodule/mod.py.
中注释行 (3) 并取消注释行 (8)有谁知道如何使模块记录器工作而无需在模块的每个函数中声明它?在这个简单的例子中出现如此奇怪行为的原因是什么?
P.S。我的环境:
Python2.7.6
龙卷风==3.1.1
您需要将对 fileConfig
的调用更改为 fileConfig("logging.ini", disable_existing_loggers=False)
,如记录的那样 here。