Python日志记录:记录到活动对象的标准方法?
我是一个大量使用Vim的用户,我打算将python程序完全重写为Vim扩展 想法是让Vim充当程序的基于文本的UI。由于Vim将完全访问正在运行的程序的每个角落,我可以通过Vim自定义的按键和/或命令动态控制其操作,并通过Vim窗口检查程序的活动对象(以及其输出),无需通过转换执行太多操作 现在我关心的是日志记录方法。由于Vim和Python将合二为一,所以我不需要登录 对于一个单独的实体,如文件或套接字,我只需要登录到一个活动的Python对象,比如一个列表,并通过Vim窗口查看该列表。以前,我有一个顶级StreamLogger日志记录到stdout,我想出了一个无缝替换它的解决方案:Python日志记录:记录到活动对象的标准方法?,python,logging,vim,Python,Logging,Vim,我是一个大量使用Vim的用户,我打算将python程序完全重写为Vim扩展 想法是让Vim充当程序的基于文本的UI。由于Vim将完全访问正在运行的程序的每个角落,我可以通过Vim自定义的按键和/或命令动态控制其操作,并通过Vim窗口检查程序的活动对象(以及其输出),无需通过转换执行太多操作 现在我关心的是日志记录方法。由于Vim和Python将合二为一,所以我不需要登录 对于一个单独的实体,如文件或套接字,我只需要登录到一个活动的Python对象,比如一个列表,并通过Vim窗口查看该列表。以前,
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日志功能,但它不会将日志消息写入磁盘,而是将它们存储在一个列表中,未格式化,以便您可以随意操作
>>> 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
导入logging.handlers
>>>object_handler=logging.handlers.BufferingHandler(float('inf'))
>>>logging.root.handlers.append(对象\处理程序)
>>>logging.root.level=logging.DEBUG
>>>something=object()
>>>对象缓冲区
[]
>>>logging.info(“发生了什么事”,什么事)
>>>对象缓冲区
[]
>>>对象\处理程序.buffer[-1].args[0]是
真的
您应该知道,如果您不以某种方式保留日志消息,例如,当您重新启动应用程序时,您将丢失所有这些跟踪。为什么不直接用python日志模块在日志文件中写东西,然后控制vim重新加载文件或在窗口中填充消息?@Kent:你说得对,先生,但是对于调试,你知道,除非已经发生了什么事情,否则很难知道将日志行放在哪里,所以之前我只是使用日志系统进行日常输出,尽管知道程序仍在响应,但大多数情况下你并不关心,就像使用shell时,我通常不保存其输出一样。如果有严重的事情发生,比如Python导致Vim崩溃,我会找到方法将密钥信息记录到一个文件中。对于其他重要的运行信息,如在线事务记录,我使用pickle模块将它们动态保存为可重用的Python对象。@Kent:此外,我想我一定是被Vim可以用作UI的想法所困扰,能够在运行时检查实时Python对象也降低了文本日志系统的重要性。对!似乎object_handler.buffer是关键,我想我可以这样做:#来自另一个线程对象的Vim_handler.acquire()。。。以正确的方式读取/修改对象\u handler.buffer。。。object_handler.release()现在的问题是要使操作完全线程安全,也许只使用字符串作为'something'会有所帮助,我现在正在研究LogRecord属性,可能需要更多的工作来整理它,谢谢你的有用回答~Well,您可以使用BufferingHandler作为基类,或者作为编写自己的线程安全处理程序的灵感,可以使用
队列。队列而不是列表新发现,QueueHandler和QueueListener可能正是我的解决方案,它们是自3.2版(我正在使用的版本)以来的新版本:)