Chr*_*ris 3 python logging interactive
我正在尝试在Python 2.7应用程序中实现日志记录,并且发现它非常有用。但是,我已经注意到,以交互方式运行Python时,每个日志记录消息都会打印多次。消息被打印的次数与我之前运行脚本的次数相同,因此似乎在脚本结束时未正确清理记录器(我想)。考虑以下示例:
import sys
import logging
def main(argv=None):
log = logging.getLogger('test')
log.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter("%(message)s"))
log.addHandler(console_handler)
log.info('Starting something...')
log.info('Doing something...')
log.info('Finished something.')
logging.shutdown()
if __name__=='__main__':
sys.exit(main(sys.argv[1:]))
Run Code Online (Sandbox Code Playgroud)
打字
>>> import file.py
>>> file.main()
Run Code Online (Sandbox Code Playgroud)
产生以下内容:
Starting something...
Doing something...
Finished something.
Run Code Online (Sandbox Code Playgroud)
然后file.main()再次输入将产生:
Starting something...
Starting something...
Doing something...
Doing something...
Finished something.
Finished something.
Run Code Online (Sandbox Code Playgroud)
重复第三次将给出三个或每个消息,依此类推。有谁知道为什么会这样-这是日志记录模块的预期行为吗?如果是这样,我该如何更改?如果python file.py按预期方式运行,上述脚本仅显示每个消息之一。
是的,您正在创建和重用记录器的单个实例。添加到该记录器的每个处理程序也在记录一条消息。
您可能希望日志记录设置在模块级别或在单独的功能中,因此只运行一次。
也许是这样的:
import atexit
import sys
import logging
log = logging.getLogger('test')
log.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter("%(message)s"))
log.addHandler(console_handler)
def shutdown_logging():
logging.shutdown()
atexit.register(shutdown_logging)
def main(argv=None):
log.info('Starting something...')
log.info('Doing something...')
log.info('Finished something.')
if __name__=='__main__':
sys.exit(main(sys.argv[1:]))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3964 次 |
| 最近记录: |