Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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_Traceback_Python Logging - Fatal编程技术网

Python日志记录:禁用堆栈跟踪

Python日志记录:禁用堆栈跟踪,python,traceback,python-logging,Python,Traceback,Python Logging,在Python3中,有没有一种简单的方法可以在处理程序或格式化程序中禁用异常堆栈跟踪的日志记录 我需要另一个处理程序中的堆栈跟踪,因此在调用记录器时设置exc_info=False。有没有比定义自己的格式化程序更简单的方法?禁用每个处理程序回溯输出的最简单选项是添加一个更改记录对象的自定义项(而不是过滤掉记录) 过滤器只需将记录上的exc_info设置为None: class TracebackInfoFilter(logging.Filter): """Clear or restore

在Python3中,有没有一种简单的方法可以在
处理程序
格式化程序
中禁用异常堆栈跟踪的日志记录


我需要另一个
处理程序中的堆栈跟踪
,因此在调用
记录器
时设置
exc_info=False
。有没有比定义自己的
格式化程序更简单的方法?

禁用每个处理程序回溯输出的最简单选项是添加一个更改记录对象的自定义项(而不是过滤掉记录)

过滤器只需将记录上的
exc_info
设置为
None

class TracebackInfoFilter(logging.Filter):
    """Clear or restore the exception on log records"""
    def __init__(self, clear=True):
        self.clear = clear
    def filter(self, record):
        if self.clear:
            record._exc_info_hidden, record.exc_info = record.exc_info, None
            # clear the exception traceback text cache, if created.
            record.exc_text = None
        elif hasattr(record, "_exc_info_hidden"):
            record.exc_info = record._exc_info_hidden
            del record._exc_info_hidden
        return True
以及:

但是,处理程序不复制日志记录,稍后传递相同日志记录的任何其他处理程序也将忽略格式化回溯。因此,您还需要配置任何其他处理程序以再次恢复信息:

for handler in logger.handlers:
    if not any(isinstance(f, TracebackInfoFilter) for f in handler.filters):
        handler.addFilter(TracebackInfoFilter(clear=False))
如果有人想禁用所有的回溯输出,那么在任何地方,向所有处理程序或记录器添加自定义过滤器都会变得单调乏味。在这种情况下,另一种选择是向;只需将记录上的
exc_info
属性设置为
None
,无条件:

record_factory = logging.getLogRecordFactory()

def clear_exc_text(*args, **kwargs):
    record = record_factory(*args, **kwargs)
    record.exc_info = None
    return record

logging.setLogRecordFactory(clear_exc_text)
请注意,默认工厂只是一个,但是上面的函数尽其所能处理任何已设置的自定义工厂

当然,您也可以创建自己的
处理程序
子类,其中设置并清除
exc_info
属性:

class NoTracebackHandler(logging.Handler):
    def handle(self, record):
        info, cache = record.exc_info, record.exc_text
        record.exc_info, record.exc_text = None, None
        try:
            super().handle(record)
        finally:
            record.exc_info = info
            record.exc_text = cache

我使用了两个处理程序,用于控制台和文件。我不希望在控制台上进行堆栈跟踪,我使用了上述方法,但堆栈跟踪将同时打印在控制台和文件上。下面是代码“”“”“fileHandler=logging.fileHandler(“{0}/{1}”)。格式(日志路径,文件名))fileHandler.setFormatter(logFormatter)Logger.addHandler(fileHandler)consoleHandler=logging.StreamHandler()consoleHandler.setFormatter(logFormatter)consoleHandler.addFilter(SetTracebackCacheFilter(“”))Logger.addHandler(consoleHandler)“”“”“@ragireddysricharanreddy:ick,我知道出了什么问题;空字符串仍被视为空缓存。我将修改这个答案。我解决了它…我们需要在筛选器中添加record.exc_info=Falsefunction@ragireddysricharanreddy:我将其设置为
None
。考虑到如果以后运行其他处理程序,这将影响它们。这是一个不错的解决方案,但需要注意一点(这不是@Martijn Pieters的错)。如果处理程序位于QueueHandler后面,则必须重写QueueHandler.prepare()函数,以便它只执行
返回记录
。否则,它将修改记录,使此解决方案无法工作。
class NoTracebackHandler(logging.Handler):
    def handle(self, record):
        info, cache = record.exc_info, record.exc_text
        record.exc_info, record.exc_text = None, None
        try:
            super().handle(record)
        finally:
            record.exc_info = info
            record.exc_text = cache