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
Python 使用完整stacktrace记录错误时添加条目之间的分隔_Python_Logging_Error Logging - Fatal编程技术网

Python 使用完整stacktrace记录错误时添加条目之间的分隔

Python 使用完整stacktrace记录错误时添加条目之间的分隔,python,logging,error-logging,Python,Logging,Error Logging,目前,我正在使用exc_info=True的logging模块以完整的stacktrace记录错误 但是结果很难直观地解析,因为记录异常时,它们之间没有分隔符。当您使用raise。。。从语法,因为它的输出包括空白行,所以你的眼睛被画到STACKTRONG中间的某个地方,而不是开始。 如何获得更好的格式?在每个stacktrace之后,像是一行------就可以了 代码示例: #Setup import logging def setup_logger(name, log_file, level

目前,我正在使用
exc_info=True
logging
模块以完整的stacktrace记录错误

但是结果很难直观地解析,因为记录异常时,它们之间没有分隔符。当您使用
raise。。。从语法,因为它的输出包括空白行,所以你的眼睛被画到STACKTRONG中间的某个地方,而不是开始。
如何获得更好的格式?在每个stacktrace之后,像是一行------就可以了

代码示例:

#Setup
import logging

def setup_logger(name, log_file, level=logging.INFO, removeExistingHandlers=True):
    """Function setup different loggers as you want"""
    logger = logging.getLogger(name)
    logger.setLevel(level)

    #remove existing handlers
    ##without this, running the script multiple times means the log filess will be added as handlers
    ##multiple times, and every warning gets written into the log multiple times
    if removeExistingHandlers:
        existingHandlers = logger.handlers.copy()
        for exHandler in existingHandlers:
            logger.removeHandler(exHandler)

    #add new handler
    handler = logging.FileHandler(log_file)
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    handler.setFormatter(formatter)

    logger.addHandler(handler)

    return logger


def do_something():
    try:
        raise Exception("ok")
    except Exception as e:
        raise Exception("WORSE") from e

errorLog = setup_logger('stacktrace_logger', 'err.log')

#Use
try:
    raise Exception("bad")
except Exception as e:
    errorLog.error(e, exc_info=True)

try:
    do_something()
except Exception as e:
    errorLog.error(e, exc_info=True)

看起来您需要一个自定义格式化程序,cf

一个根据Bruno的建议执行此任务的自定义格式化程序的实现

class SeperatedExcFormatter(logging.Formatter):
    def formatException(self, exc_info):
        result = super().formatException(exc_info)
        if exc_info:
            result = result + "\n------------------------------------------------"
        return result

若要使用,请将
formatter=logging.formatter('%(asctime)s%(levelname)s%(message)s')
替换为
formatter=separatedexfcformatter('%(asctime)s%(levelname)s%(message)s')

看看,这可能解决了您的问题?这可能会使异常更容易解析,但我不认为这有助于区分不同异常的日志。