欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

logback ThrowableProxyConverter類(lèi)源碼流程解析

 更新時(shí)間:2023年12月04日 08:38:41   作者:odecraft  
這篇文章主要為大家介紹了logback ThrowableProxyConverter類(lèi)源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下logback的ThrowableProxyConverter

ThrowableHandlingConverter

ch/qos/logback/classic/pattern/ThrowableHandlingConverter.java

/**
 * Converter which handle throwables should be derived from this class.
 *
 */
public abstract class ThrowableHandlingConverter extends ClassicConverter {

    boolean handlesThrowable() {
        return true;
    }
}
ThrowableHandlingConverter繼承了ClassicConverter,其handlesThrowable方法返回true

ThrowableProxyConverter

ch/qos/logback/classic/pattern/ThrowableProxyConverter.java

public class ThrowableProxyConverter extends ThrowableHandlingConverter {

    protected static final int BUILDER_CAPACITY = 2048;

    int lengthOption;
    List<EventEvaluator<ILoggingEvent>> evaluatorList = null;
    List<String> ignoredStackTraceLines = null;

    int errorCount = 0;

    @SuppressWarnings("unchecked")
    public void start() {

        String lengthStr = getFirstOption();

        if (lengthStr == null) {
            lengthOption = Integer.MAX_VALUE;
        } else {
            lengthStr = lengthStr.toLowerCase();
            if ("full".equals(lengthStr)) {
                lengthOption = Integer.MAX_VALUE;
            } else if ("short".equals(lengthStr)) {
                lengthOption = 1;
            } else {
                try {
                    lengthOption = Integer.parseInt(lengthStr);
                } catch (NumberFormatException nfe) {
                    addError("Could not parse [" + lengthStr + "] as an integer");
                    lengthOption = Integer.MAX_VALUE;
                }
            }
        }

        final List<String> optionList = getOptionList();

        if (optionList != null && optionList.size() > 1) {
            final int optionListSize = optionList.size();
            for (int i = 1; i < optionListSize; i++) {
                String evaluatorOrIgnoredStackTraceLine = (String) optionList.get(i);
                Context context = getContext();
                Map<String, EventEvaluator<?>> evaluatorMap = (Map<String, EventEvaluator<?>>) context.getObject(CoreConstants.EVALUATOR_MAP);
                EventEvaluator<ILoggingEvent> ee = (EventEvaluator<ILoggingEvent>) evaluatorMap.get(evaluatorOrIgnoredStackTraceLine);
                if (ee != null) {
                    addEvaluator(ee);
                } else {
                    addIgnoreStackTraceLine(evaluatorOrIgnoredStackTraceLine);
                }
            }
        }
        super.start();
    }

    //......
}
ThrowableProxyConverter繼承了ThrowableHandlingConverter,其start方法會(huì)先讀取getFirstOption,該參數(shù)為lengthOption,為null則取Integer.MAX_VALUE,若為full則取Integer.MAX_VALUE,為short取1,其他的則解析該值,出現(xiàn)異常則取Integer.MAX_VALUE;之后取optionList的其他值,先通過(guò)evaluatorMap來(lái)取,若EventEvaluator不為null則執(zhí)行addEvaluator,否則執(zhí)行addIgnoreStackTraceLine

addEvaluator

private void addEvaluator(EventEvaluator&lt;ILoggingEvent&gt; ee) {
        if (evaluatorList == null) {
            evaluatorList = new ArrayList&lt;EventEvaluator&lt;ILoggingEvent&gt;&gt;();
        }
        evaluatorList.add(ee);
    }
addEvaluator則是添加到evaluatorList

addIgnoreStackTraceLine

private void addIgnoreStackTraceLine(String ignoredStackTraceLine) {
        if (ignoredStackTraceLines == null) {
            ignoredStackTraceLines = new ArrayList&lt;String&gt;();
        }
        ignoredStackTraceLines.add(ignoredStackTraceLine);
    }
addIgnoreStackTraceLine則是添加到ignoredStackTraceLines

convert

public String convert(ILoggingEvent event) {
        IThrowableProxy tp = event.getThrowableProxy();
        if (tp == null) {
            return CoreConstants.EMPTY_STRING;
        }
        // an evaluator match will cause stack printing to be skipped
        if (evaluatorList != null) {
            boolean printStack = true;
            for (int i = 0; i < evaluatorList.size(); i++) {
                EventEvaluator<ILoggingEvent> ee = evaluatorList.get(i);
                try {
                    if (ee.evaluate(event)) {
                        printStack = false;
                        break;
                    }
                } catch (EvaluationException eex) {
                    errorCount++;
                    if (errorCount < CoreConstants.MAX_ERROR_COUNT) {
                        addError("Exception thrown for evaluator named [" + ee.getName() + "]", eex);
                    } else if (errorCount == CoreConstants.MAX_ERROR_COUNT) {
                        ErrorStatus errorStatus = new ErrorStatus("Exception thrown for evaluator named [" + ee.getName() + "].", this, eex);
                        errorStatus.add(new ErrorStatus("This was the last warning about this evaluator's errors."
                                        + "We don't want the StatusManager to get flooded.", this));
                        addStatus(errorStatus);
                    }
                }
            }
            if (!printStack) {
                return CoreConstants.EMPTY_STRING;
            }
        }
        return throwableProxyToString(tp);
    }
convert方法先從event獲取IThrowableProxy,若為null則返回空字符串;之后判斷evaluatorList是否為null,不為null則遍歷挨個(gè)執(zhí)行evaluate(event),若為true則printStack設(shè)置為false,跳出循環(huán),當(dāng)printStack為false時(shí),返回空字符串,否則通過(guò)throwableProxyToString轉(zhuǎn)為字符串返回

throwableProxyToString

protected String throwableProxyToString(IThrowableProxy tp) {
        StringBuilder sb = new StringBuilder(BUILDER_CAPACITY);
        recursiveAppend(sb, null, ThrowableProxyUtil.REGULAR_EXCEPTION_INDENT, tp);
        return sb.toString();
    }
    private void recursiveAppend(StringBuilder sb, String prefix, int indent, IThrowableProxy tp) {
        if (tp == null)
            return;
        subjoinFirstLine(sb, prefix, indent, tp);
        sb.append(CoreConstants.LINE_SEPARATOR);
        subjoinSTEPArray(sb, indent, tp);
        IThrowableProxy[] suppressed = tp.getSuppressed();
        if (suppressed != null) {
            for (IThrowableProxy current : suppressed) {
                recursiveAppend(sb, CoreConstants.SUPPRESSED, indent + ThrowableProxyUtil.SUPPRESSED_EXCEPTION_INDENT, current);
            }
        }
        recursiveAppend(sb, CoreConstants.CAUSED_BY, indent, tp.getCause());
    }
throwableProxyToString主要是遞歸執(zhí)行recursiveAppend,它先執(zhí)行subjoinFirstLine、再執(zhí)行subjoinSTEPArray、最后繼續(xù)遞歸

subjoinSTEPArray

protected void subjoinSTEPArray(StringBuilder buf, int indent, IThrowableProxy tp) {
        StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
        int commonFrames = tp.getCommonFrames();
        boolean unrestrictedPrinting = lengthOption > stepArray.length;
        int maxIndex = (unrestrictedPrinting) ? stepArray.length : lengthOption;
        if (commonFrames > 0 && unrestrictedPrinting) {
            maxIndex -= commonFrames;
        }
        int ignoredCount = 0;
        for (int i = 0; i < maxIndex; i++) {
            StackTraceElementProxy element = stepArray[i];
            if (!isIgnoredStackTraceLine(element.toString())) {
                ThrowableProxyUtil.indent(buf, indent);
                printStackLine(buf, ignoredCount, element);
                ignoredCount = 0;
                buf.append(CoreConstants.LINE_SEPARATOR);
            } else {
                ++ignoredCount;
                if (maxIndex < stepArray.length) {
                    ++maxIndex;
                }
            }
        }
        if (ignoredCount > 0) {
            printIgnoredCount(buf, ignoredCount);
            buf.append(CoreConstants.LINE_SEPARATOR);
        }
        if (commonFrames > 0 && unrestrictedPrinting) {
            ThrowableProxyUtil.indent(buf, indent);
            buf.append("... ").append(tp.getCommonFrames()).append(" common frames omitted").append(CoreConstants.LINE_SEPARATOR);
        }
    }
subjoinSTEPArray遍歷StackTraceElementProxy數(shù)組,然后挨個(gè)判斷isIgnoredStackTraceLine,若為false才執(zhí)行printStackLine

isIgnoredStackTraceLine

private boolean isIgnoredStackTraceLine(String line) {
        if (ignoredStackTraceLines != null) {
            for (String ignoredStackTraceLine : ignoredStackTraceLines) {
                if (line.contains(ignoredStackTraceLine)) {
                    return true;
                }
            }
        }
        return false;
    }
isIgnoredStackTraceLine主要是判斷指定line是否包含了ignoredStackTraceLines,包含其中一個(gè)即返回true

小結(jié)

logback的ThrowableProxyConverter繼承了ThrowableHandlingConverter,它定義了evaluatorList、ignoredStackTraceLines屬性,它將繼承自DynamicConverter的optionList做了劃分,第一個(gè)option為打印異常堆棧的數(shù),之后的option優(yōu)先作為evaluatorList,若解析為evaluator為null則作為ignoredStackTraceLines參數(shù)。evaluatorList用于evaluate(event),若有個(gè)返回true則返回空字符串,而ignoredStackTraceLines則用于過(guò)濾包含這些的異常堆棧。

以上就是logback的ThrowableProxyConverter的詳細(xì)內(nèi)容,更多關(guān)于logback的ThrowableProxyConverter的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java編程進(jìn)行動(dòng)態(tài)編譯加載代碼分享

    java編程進(jìn)行動(dòng)態(tài)編譯加載代碼分享

    這篇文章主要介紹了java編程進(jìn)行動(dòng)態(tài)編譯加載代碼分享,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 淺談Java對(duì)象禁止使用基本類(lèi)型

    淺談Java對(duì)象禁止使用基本類(lèi)型

    本文主要介紹了淺談Java對(duì)象禁止使用基本類(lèi)型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Mapper層繼承BaseMapper<T>需要引入的pom依賴(lài)方式

    Mapper層繼承BaseMapper<T>需要引入的pom依賴(lài)方式

    這篇文章主要介紹了Mapper層繼承BaseMapper<T>需要引入的pom依賴(lài)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring中自動(dòng)裝配的4種方式

    Spring中自動(dòng)裝配的4種方式

    今天小編就為大家分享一篇關(guān)于Spring中自動(dòng)裝配的4種方式,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • springmvc常用注解標(biāo)簽詳解

    springmvc常用注解標(biāo)簽詳解

    本篇文章主要介紹了springmvc常用注解標(biāo)簽詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • RabbitMQ的ACK確認(rèn)機(jī)制保障消費(fèi)端消息的可靠性詳解

    RabbitMQ的ACK確認(rèn)機(jī)制保障消費(fèi)端消息的可靠性詳解

    這篇文章主要介紹了RabbitMQ的ACK確認(rèn)機(jī)制保障消費(fèi)端消息的可靠性詳解,簡(jiǎn)單來(lái)說(shuō),就是你必須關(guān)閉 RabbitMQ 的自動(dòng)ack ,可以通過(guò)一個(gè) api 來(lái)調(diào)用就行,然后每次你自己代碼里確保處理完的時(shí)候,再在程序里 ack 一把,需要的朋友可以參考下
    2023-12-12
  • Java?Lambda表達(dá)式語(yǔ)法及用法示例

    Java?Lambda表達(dá)式語(yǔ)法及用法示例

    這篇文章主要給大家介紹了關(guān)于Java?Lambda表達(dá)式語(yǔ)法及用法的相關(guān)資料,lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡(jiǎn)單的"函數(shù)式編程",文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Mybatis實(shí)現(xiàn)分表插件

    Mybatis實(shí)現(xiàn)分表插件

    隨著系統(tǒng)的發(fā)展,數(shù)據(jù)量也會(huì)越來(lái)越大,分庫(kù)分表可以有效的緩解數(shù)據(jù)庫(kù)的壓力,本文主要介紹了Mybatis實(shí)現(xiàn)分表插件,感興趣的可以了解一下
    2021-05-05
  • shiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼

    shiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼

    在做項(xiàng)目中遇到這樣的需求要求每個(gè)賬戶(hù)同時(shí)只能有一個(gè)人登錄或幾個(gè)人同時(shí)登錄,如果是同時(shí)登錄的多人,要么不讓后者登錄,要么踢出前者登錄,怎么實(shí)現(xiàn)這樣的功能呢?下面小編給大家?guī)?lái)了shiro并發(fā)人數(shù)登錄控制的實(shí)現(xiàn)代碼,一起看看吧
    2017-09-09
  • SpringBoot實(shí)現(xiàn)物品收藏功能

    SpringBoot實(shí)現(xiàn)物品收藏功能

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)物品收藏功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評(píng)論