最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

logback ThrowableProxyConverter類源碼流程解析

 更新時(shí)間:2023年12月04日 08:38:41   作者:odecraft  
這篇文章主要為大家介紹了logback ThrowableProxyConverter類源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(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的其他值,先通過evaluatorMap來取,若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í),返回空字符串,否則通過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則用于過濾包含這些的異常堆棧。

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

相關(guān)文章

  • Java9新特性Stream流API優(yōu)化與增強(qiáng)

    Java9新特性Stream流API優(yōu)化與增強(qiáng)

    這篇文章主要為大家介紹了Java9新特性Stream流API優(yōu)化與增強(qiáng)的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Springboot之restTemplate的配置及使用方式

    Springboot之restTemplate的配置及使用方式

    這篇文章主要介紹了Springboot之restTemplate的配置及使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • spring?data?jpa如何使用自定義repository實(shí)現(xiàn)類

    spring?data?jpa如何使用自定義repository實(shí)現(xiàn)類

    這篇文章主要介紹了spring?data?jpa如何使用自定義repository實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式

    maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式

    這篇文章主要介紹了maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java Swing JComboBox下拉列表框的示例代碼

    Java Swing JComboBox下拉列表框的示例代碼

    這篇文章主要介紹了Java Swing JComboBox下拉列表框的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 關(guān)于mybatis的一級(jí)緩存和二級(jí)緩存的那些事兒

    關(guān)于mybatis的一級(jí)緩存和二級(jí)緩存的那些事兒

    MyBatis自帶的緩存有一級(jí)緩存和二級(jí)緩存,今天我們就來學(xué)習(xí)一下,文中有非常詳細(xì)的總結(jié),對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Spring Boot整合Spring Security簡(jiǎn)單實(shí)現(xiàn)登入登出從零搭建教程

    Spring Boot整合Spring Security簡(jiǎn)單實(shí)現(xiàn)登入登出從零搭建教程

    這篇文章主要給大家介紹了關(guān)于Spring Boot整合Spring Security簡(jiǎn)單實(shí)現(xiàn)登入登出從零搭建的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-09-09
  • Mybatis整合達(dá)夢(mèng)數(shù)據(jù)庫的完整步驟記錄

    Mybatis整合達(dá)夢(mèng)數(shù)據(jù)庫的完整步驟記錄

    作為國(guó)產(chǎn)數(shù)據(jù)庫,達(dá)夢(mèng)做的不錯(cuò),提供的遷移工具也相當(dāng)不錯(cuò),下面這篇文章主要給大家介紹了關(guān)于Mybatis整合達(dá)夢(mèng)數(shù)據(jù)庫的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • spring security自定義登錄頁面

    spring security自定義登錄頁面

    在項(xiàng)目中我們肯定不能使用Spring自己生成的登錄頁面,而要用我們自己的登錄頁面,下面通過本文給大家分享spring security自定義登錄頁面的實(shí)現(xiàn)方法,一起看看吧
    2017-09-09
  • JavaFX桌面應(yīng)用未響應(yīng)問題解決方案

    JavaFX桌面應(yīng)用未響應(yīng)問題解決方案

    這篇文章主要介紹了JavaFX桌面應(yīng)用未響應(yīng)問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

宁城县| 郯城县| 麦盖提县| 改则县| 辉县市| 清河县| 武鸣县| 呼伦贝尔市| 汪清县| 富平县| 新和县| 石渠县| 千阳县| 海安县| 沈阳市| 天祝| 承德县| 和龙市| 台江县| 克拉玛依市| 琼结县| 龙里县| 锦屏县| 乐安县| 黄平县| 楚雄市| 土默特左旗| 门头沟区| 土默特右旗| 新化县| 托克托县| 深水埗区| 遂昌县| 陇南市| 阳城县| 万全县| 安塞县| 湖州市| 安国市| 阳山县| 江永县|