【发布时间】: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 对象也降低了文本日志记录的重要性系统。