Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python日志记录:记录到活动对象的标准方法?_Python_Logging_Vim - Fatal编程技术网

Python日志记录:记录到活动对象的标准方法?

Python日志记录:记录到活动对象的标准方法?,python,logging,vim,Python,Logging,Vim,我是一个大量使用Vim的用户,我打算将python程序完全重写为Vim扩展 想法是让Vim充当程序的基于文本的UI。由于Vim将完全访问正在运行的程序的每个角落,我可以通过Vim自定义的按键和/或命令动态控制其操作,并通过Vim窗口检查程序的活动对象(以及其输出),无需通过转换执行太多操作 现在我关心的是日志记录方法。由于Vim和Python将合二为一,所以我不需要登录 对于一个单独的实体,如文件或套接字,我只需要登录到一个活动的Python对象,比如一个列表,并通过Vim窗口查看该列表。以前,

我是一个大量使用Vim的用户,我打算将python程序完全重写为Vim扩展 想法是让Vim充当程序的基于文本的UI。由于Vim将完全访问正在运行的程序的每个角落,我可以通过Vim自定义的按键和/或命令动态控制其操作,并通过Vim窗口检查程序的活动对象(以及其输出),无需通过转换执行太多操作

现在我关心的是日志记录方法。由于Vim和Python将合二为一,所以我不需要登录 对于一个单独的实体,如文件或套接字,我只需要登录到一个活动的Python对象,比如一个列表,并通过Vim窗口查看该列表。以前,我有一个顶级StreamLogger日志记录到stdout,我想出了一个无缝替换它的解决方案:

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版(我正在使用的版本)以来的新版本:)