python - 我如何拥有提供现有记录器或实例化新记录器的实用功能?
问题描述
我将我的“获取日志记录”功能放在一个通用帮助文件中,这样我就可以在我的应用程序中经常调用它。我的记录器看起来像这样:
def setupLogger():
rootLogger = logging.getLogger()
rootLogger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
"::%(levelname)s - %(message)s"
)
if not rootLogger.hasHandlers() :
buffer = StringIO()
bufferHandler = logging.StreamHandler(buffer)
bufferHandler.setLevel(logging.DEBUG)
bufferHandler.setFormatter(formatter)
bufferHandler.set_name('buffer.logger')
rootLogger.addHandler(bufferHandler)
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.DEBUG)
stdout_handler.setFormatter(formatter)
stdout_handler.set_name('stdout.logger')
rootLogger.addHandler(stdout_handler)
return (rootLogger, buffer)
然后我可以util.setupLogger()
从任何函数调用并获得一个标准输出记录器和一个缓冲区(这样我就可以看到以前记录到控制台的内容)。但是,我需要做一个像这样的单例样式函数,因为我永远不知道记录器是否已经被实例化。
不幸的是,这失败了,因为没有在每次调用 setupLogger 时实例化缓冲区(返回 null),我不能将缓冲区的初始化放在 hasHandlers() 函数之外(因为它会擦除历史记录),而且我似乎无法窥探从 logger.StreamHandlers 中取出缓冲区,以便我可以将其交还。
我觉得我让这变得比它需要的更复杂,我该怎么办?
解决方案
在处理程序中返回流怎么样?
def setupLogger():
rootLogger = logging.getLogger()
rootLogger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
"::%(levelname)s - %(message)s"
)
if not rootLogger.hasHandlers() :
buffer = StringIO()
bufferHandler = logging.StreamHandler(buffer)
bufferHandler.setLevel(logging.DEBUG)
bufferHandler.setFormatter(formatter)
bufferHandler.set_name('buffer.logger')
rootLogger.addHandler(bufferHandler)
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.DEBUG)
stdout_handler.setFormatter(formatter)
stdout_handler.set_name('stdout.logger') # BTW here I found a typo, I have fixed it.
rootLogger.addHandler(stdout_handler)
buffer = rootLogger.handlers[0].stream
return rootLogger, buffer
推荐阅读
- python - 例外:无法将具有相同 URL 和子域的两个 Admin() 实例分配给同一应用程序
- python - 对发送给函数的数组进行排序而不进行赋值
- wxwidgets - 如何动态缩小 wxBitmapButton 的位图以适应?
- android - MapView 内的按钮不显示
- azure - 尝试发布到 Azure 应用服务时构建失败
- php - 在centOs 7服务器上使用php Imagick转换pdf文件时出错
- azure-sql-database - Azure 数据工厂复制任务 OnPremises DB 到 Azure 数据库
- javascript - 第一次加载页面时如何打开 Popper
- python - 在单独的字典中按其各自的值对列表进行排序?
- python - Python - Selenium:为什么 move_by_offset 不起作用。解决方法请