gpt4 book ai didi

交互式 session 中的 Python 日志记录

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:14 26 4
gpt4 key购买 nike

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

关于交互式 session 中的 Python 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com