gpt4 book ai didi

python - 暂停记录器的格式化,然后返回它

转载 作者:行者123 更新时间:2023-11-28 20:45:33 25 4
gpt4 key购买 nike

我有一个日志记录配置,我在其中记录到一个文件和控制台:

logging.basicConfig(filename=logfile, filemode='w',
level=numlevel,
format='%(asctime)s - %(levelname)s - %(name)s:%(funcName)s - %(message)s')
# add console messages
console = logging.StreamHandler()
console.setLevel(logging.INFO)
consoleformatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console.setFormatter(consoleformatter)
logging.getLogger('').addHandler(console)

在我的脚本中的某个时刻,我需要通过打印摘要并请求确认来与用户交互。该摘要当前由循环打印生成。我想暂停控制台日志的当前格式,这样我就可以打印出一大块文本,最后有一个问题并等待用户输入。但我仍然希望所有这些都记录到文件中!

执行此操作的函数在一个模块中,我在其中尝试了以下操作:

logger = logging.getLogger(__name__)
def summaryfunc:
logger.info('normal logging business')
clearformatter = logging.Formatter('%(message)s')
logger.setFormatter(clearformatter)
logger.info('\n##########################################')
logger.info('Summary starts here')

这会产生错误:AttributeError: 'Logger' object has no attribute 'setFormatter'

我知道记录器是一个记录器,而不是一个处理程序,但我不确定如何让它工作......

编辑:

根据答案,我的问题变成了:如何在与用户交互时暂停登录到控制台,同时仍然能够登录到文件。 IE:仅暂停 streamHandler。由于这是在模块中发生的,处理程序的细节在别处定义,所以我是这样做的:

logger.debug('Normal logging to file and console')
root_logger = logging.getLogger()
stream_handler = root_logger.handlers[1]
root_logger.removeHandler(stream_handler)
print('User interaction')
logger.info('Logging to file only')
root_logger.addHandler(stream_handler)
logger.info('Back to logging to both file and console')

这依赖于 streamHandler 始终是 handlers 返回的列表中的第二个,但我相信是这种情况,因为它是按照我将处理程序添加到根记录器的顺序......

最佳答案

我同意 Vinay 的观点,你应该使用 print对于正常的程序输出,只使用 logging用于记录目的。但是,如果您仍然想在中间切换格式,然后再切换回去,方法如下:

import logging

def summarize():
console_handler.setFormatter(logging.Formatter('%(message)s'))
logger.info('Here is my report')
console_handler.setFormatter(console_formatter)

numlevel = logging.DEBUG
logfile = 's2.log'
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

console_handler = logging.StreamHandler()
console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(console_formatter)
logger.addHandler(console_handler)

file_handler = logging.FileHandler(filename=logfile, mode='w')
file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s:%(funcName)s - %(message)s')
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)

logger.info('Before summary')
summarize()
logger.info('After summary')

讨论

  • 该脚本创建一个记录器对象并为其分配两个处理程序:一个用于控制台,一个用于文件。
  • 在函数中summarize() ,我为控制台处理程序切换了一个新的格式化程序,进行了一些日志记录,然后切换回来。
  • 再次提醒您不要使用logging显示正常的程序输出。

更新

如果您想禁止控制台日志记录,请将其重新打开。这是一个建议:

def interact():
# Remove the console handler
for handler in logger.handlers:
if not isinstance(handler, logging.FileHandler):
saved_handler = handler
logger.removeHandler(handler)
break

# Interact
logger.info('to file only')

# Add the console handler back
logger.addHandler(saved_handler)

请注意,我没有针对 logging.StreamHandler 测试处理程序自从 logging.FileHandler源自 logging.StreamHandler .因此,我删除了那些不是 FileHandler 的处理程序.在删除之前,我保存了该处理程序以供以后恢复。

更新 2:.handlers = []

在主脚本中,如果你有:

logger = logging.getLogger(__name__) # __name__ == '__main__'

然后在一个模块中,你做:

logger = logging.getLogger(__name__) # __name__ == module's name, not '__main__'

问题是,在脚本中,__name__ == '__main__'在模块中,__name__ == <the module's name>而不是 '__main__' .为了实现一致性,您需要编造一些名称并在两个地方使用它们:

logger = logging.getLogger('MyScript')

关于python - 暂停记录器的格式化,然后返回它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23175833/

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