gpt4 book ai didi

python - python 记录器中的序言和尾声

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

我希望创建一个记录器类,在第一次logging.getLogger()时将编写一个序言,一旦该过程结束记录器就会编写一个尾声

我的代码:

logger = logging.getLogger('name')
logger.info('HI')

预期输出:

2014-09-29 10:50:40,187 - INFO - ** My prologue **
2014-09-29 10:50:40,187 - INFO - HI
2014-09-29 10:50:40,187 - INFO - ** My epilogue **

最佳答案

据观察,我之前的答案中的 EpiLogger 不是“单例”,并且必须在要使用它们的模块之间传递。

解决这个问题的选项包括

  • 子类化logger.Logger(如果这实际上是可能的,我还没有调查过),
  • 实现一种机制来创建、存储和检索 epiLogger,如 logger.getLogger(可笑且夸张的想法)
  • 创建一个可在多个模块中使用的单例 EpiLogger。

此解决方案实现了后者。

import logging

class epiLogger():
_initialised = {}
_finalised = {}

def __init__(self, name):
self.logger = logging.getLogger(name)
self.name = name
if not epiLogger._initialised.get(name):
self.logger.addHandler(logging.StreamHandler())
self.logger.setLevel(logging.INFO)
self.logger.info('** My Prologue **')
epiLogger._initialised[self.name] = True

def info(self, the_info):
self.logger.info(the_info)

def __del__(self):
if not self.__class__._finalised.get(self.name):
self.logger.info('** My Epilogue **')
self.__class__._finalised[self.name] = True

a = epiLogger("foo")

a.info("foo!")
a.info("bar!")
a.info("party!")

我知道这感觉像是一件好事,但请阅读此处:http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since-1995/ 。我会认真地问自己“实际上,从长远来看,将每个 EpiLogger 传递到它所属的位置可能是最好的吗?”

或者当然是investigate subclassing logger.Logger :)

关于python - python 记录器中的序言和尾声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26095245/

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