Python:仅在脚本运行结束时刷新日志记录

标签 python

目前我用于记录一个自定义日志系统,其工作方式如下:
我有一个 Log class ressemble 如下:

class Log:
    def __init__(self):
        self.script = ""
        self.datetime = datetime.datetime.now().replace(second=0, microsecond=0)
        self.mssg = ""
        self.mssg_detail = ""
        self.err = ""
        self.err_detail = ""

我创建了一个函数装饰器,它在函数调用时执行 try/except,并将消息添加到 .mssg.err 相应地在 Log 对象上。

def logging(fun):
    @functools.wraps(fun)
    def inner(self, *args):
        try:
            f = fun(self, *args)
            self.logger.mssg += fun.__name__ +" :ok, "                
            return f               
        except Exception as e:
            self.logger.err += fun.__name__ +": error: "+str(e.args) 
    return inner 

所以通常一个脚本就是一个类,由多个方法依次运行组成。 因此,我运行这些方法(如上面提到的那样装饰),最后我将 Log 对象上传到 mysql 数据库中。

这很好用。但现在我想修改这些项目,以便它们与 python 的“官方”日志记录模块集成。

我不喜欢该模块的地方是无法将消息“保存”到 1 个日志对象上,以便仅在运行结束时上传/保存到日志。相反,每个日志记录调用都会将消息写入/发送到文件等 - 有时会产生很多性能问题。我可以使用 handlers.MemoryHandler ,但它似乎仍然不能像我原来的系统那样运行:据说它会定期收集消息并将它们刷新到另一个处理程序 - 这不是我想要的:我想要收集内存中的消息并使用显式函数根据请求刷新它们。

有人有什么建议吗?

最佳答案

这是我的想法。使用处理程序捕获 StringIO 中的日志。然后你可以随时获取 StringIO。由于讨论线程中可能存在一些混淆 - StringIO 是字符串的“类文件”接口(interface),因此从未涉及实际文件。

import logging
import io
def initialize_logging(log_level, log_name='default_logname'):
    logger = logging.getLogger(log_name)
    logger.setLevel(log_level)

    log_stream = io.StringIO()

    if not logger.handlers:
        ch = logging.StreamHandler(log_stream)
        ch.setLevel(log_level)
        ch.setFormatter(logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        ))
        logger.addHandler(ch)
        logger.propagate = 0
    return logger, log_stream

然后是这样的:

>>> logger, log_stream = initialize_logging(logging.INFO, "logname")
>>> logger.warning("Hello World!")

当你想要日志信息时:

>>> log_stream.getvalue()
'2017-05-16 16:35:03,501 - logname - WARNING - Hello World!\n'

关于Python:仅在脚本运行结束时刷新日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44011950/

相关文章:

python - 在 Keras 序列模型中使用的时期数

python - for循环python多次检查

python - 为什么在 self.assertEqual 签名中调用字典键时出现 KeyError ?

python - 将标题添加到文件

python - 正则表达式仅用于字符串中的数字?

python - Hyperledger Indy 节点配置错误导致错误,并显示一条消息: "undefined symbol: indy_crypto_init_logger"

python - lambda 函数中的多个 if 语句

python - 可以使用负数作为随机数生成的种子吗?

python - 如何在 DataFrame 中的每一行上运行函数并将结果附加到新的 DataFrame

python - 谷歌应用程序引擎 - python,迭代数据模型属性