【问题标题】:Python logging: standard approach to log to a live object?Python 日志记录:记录到活动对象的标准方法?
【发布时间】:2023-03-05 06:04:01
【问题描述】:

我是一个重度 Vim 用户,我打算将我的 python 程序完全重写为一个 Vim 扩展, 想法是让 Vim 充当程序的基于文本的 UI。由于 Vim 可以完全访问正在运行的程序的每个角落,我可以通过 Vim 自定义的击键和/或命令即时控制它的操作,并通过 Vim 窗口检查程序的活动对象(也是它的输出),在过渡期间不需要做太多事情。

现在我关心的是日志记录方法。既然 Vim 和 Python 会合二为一,我就不用登录了 对于像文件或套接字这样的单独实体,我只需要登录到一个实时 Python 对象,说一个列表,并通过 Vim 窗口查看该列表。以前我有一个顶级 StreamLogger 记录到标准输出,我想出了一个无缝替换它的解决方案:

import threading
import datetime

class ObjectLogger:
    mapping= {
        'critical': 5,
        'error':    4,
        'warning':  3,
        'info':     2,
        'debug':    1,
        'notset':   0,
    }

    def __init__(self):
        self.data= []   # logging output
        self._lock= threading.Lock()    
        self._level= 0

    # ----------------- methods for setting logging level -----------------
    def set_critical(self):
        self._level= ObjectLogger.mapping['critical']

    # ------------------------------ logging ------------------------------
    def debug(self, message):
        if self._level > ObjectLogger.mapping['debug']:
            return None
        self._lock.acquire()
        self.data.append(datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') + ' >> ' + message)
        self._lock.release()

    # ---------------------- clear previous loggings ----------------------
    def clear(self):
        self._lock.acquire()
        del self.data[:]
        self._lock.release()

问题是,有没有更好的方法来做到这一点?是否有标准方法可以记录到实时 Python 对象?我已经查看了 MemoryHandler,但它似乎不是我需要的,谢谢。

【问题讨论】:

  • 您应该知道,如果您不以某种方式保留日志消息,那么当您重新启动应用程序时,您将丢失所有这些痕迹。为什么不直接使用 python 日志模块在日志文件中写入内容并控制 vim 重新加载文件或在窗口中填充消息?
  • @Kent:您说得对,先生,但是对于调试,您知道,在事情已经发生之前,很难知道将日志行放在哪里,所以以前我只是使用日志系统来完成它尽管知道程序仍在响应,但大多数情况下您并不关心的日常输出,就像使用 shell 时一样,我通常不保存其输出。如果发生严重的事情,比如 Python 导致 Vim 崩溃,我会想办法将关键信息记录到文件中。对于其他重要的运行信息,例如在线交易记录,我使用 pickle 模块将它们即时保存为可重用的 Python 对象。
  • @Kent:此外,我想我有点痴迷于 Vim 可以用作 UI 的想法,能够在运行时检查实时 Python 对象也降低了文本日志记录的重要性系统。

标签: python logging vim


【解决方案1】:

您正在寻找BufferingHandler,这将允许您使用普通的python 日志记录工具,但不是将日志消息写入磁盘,而是将它们存储在一个未格式化的列表中,供您操作拜托了。

>>> import logging.handlers
>>> object_handler = logging.handlers.BufferingHandler(float('inf'))
>>> logging.root.handlers.append(object_handler)
>>> logging.root.level = logging.DEBUG
>>> something = object()
>>> object_handler.buffer
[]
>>> logging.info("something happened", something)
>>> object_handler.buffer
[<logging.LogRecord object at ...>]
>>> object_handler.buffer[-1].args[0] is something
True

【讨论】:

  • 对!似乎 object_handler.buffer 是关键,我想我可以这样做: # Vim 从另一个线程 object_handler.acquire() # ... 以正确的方式读取/修改 object_handler.buffer ... object_handler.release() 现在问题是使操作完全线程安全,也许只对“某事”使用字符串会有所帮助,我现在正在研究 LogRecord 属性,可能需要更多的工作来整理它,感谢有用的回复~跨度>
  • 好吧,您可以使用 BufferingHandler 作为基类或作为灵感来编写您自己的线程安全处理程序,以您希望的方式,也许使用 Queue.Queue 而不是列表
  • 新发现,QueueHandler 和 QueueListener 可能正是我的解决方案,它们是自 3.2 版以来的新发现,这是我正在使用的版本 :)
猜你喜欢
  • 1970-01-01
  • 2019-01-10
  • 2016-11-13
  • 1970-01-01
  • 2017-04-13
  • 2017-06-04
  • 1970-01-01
  • 2014-04-03
  • 2019-09-29
相关资源
最近更新 更多