Python在交互式会话中登录

我试图在我的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:]))

打字

>>> import file.py
>>> file.main()

产生以下结果:

Starting something...
Doing something...
Finished something.

然后第二次输入file.main()会产生:

Starting something...
Starting something...
Doing something...
Doing something...
Finished something.
Finished something.

重复第三次会给出三条或每条消息,依此类推.有谁知道为什么会这样 – 这是日志记录模块的预期行为,如果是这样,我该如何更改?如果按预期运行脚本(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:]))
上一篇:linux – 如何将字符串推送到stdin?在启动时通过stdin提供输入,然后以交互方式读取stdin输入


下一篇:python – 以交互方式更改正在绘制的列的Bokeh