我是 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 但它似乎不是我需要的,谢谢。
您正在寻找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
我是一名优秀的程序员,十分优秀!