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

标签 python logging

我希望创建一个记录器类,在第一次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/

相关文章:

python - 如何在 Python 上创建 PDF 生成器?

mysql - 限制mysql日志文件大小

mysql - 如何查看何时运行了哪些查询?

c++ - C++ 共享库中的线程安全日志记录

c# - 回溯搜索算法

python - 如何解码html十六进制元素?

tomcat - 从 webapp 管理 tomcat 日志记录

linux - 将 Linux 控制台输出保存在 txt 中。文件

python - 将 vim 函数传递给 vim 的内置 python

python - 如何处理 Pandas 中的SettingWithCopyWarning