簡體   English   中英

如何配置log4j2以WARN級別記錄`MyException`錯誤

[英]How to configure log4j2 to log `MyException` errors with WARN level

如何配置log4j(v 2)以WARN級別記錄MyException錯誤?

請參見引發MyException異常的代碼( rxjava )示例

 return map.get(id).toObservable()
                .filter(Objects::nonNull)
                .switchIfEmpty(Observable.error(new MyException("Happens")))
                .toSingle();

這是由log4j配置捕獲的,目前ERROR處於ERROR級別。

作為參考,我將在評論中提供您提供的信息:

我想避免在rx-flow中使用log.error或log.warn的顯式邏輯,而是將異常的層次結構定義為可在logj4或其他位置配置以將哪些異常映射到日志級別

這是一個如何完成此操作的快速示例:

package example;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SomeClass {

    private static final Logger log = LogManager.getLogger();

    //Quick and dirty way to generate a map of exceptions to their log levels. Replace this with whatever method of configuration you prefer.
    public static Map<String,String> getExceptionLvlMap(){
        Map<String,String> exceptionToLvlMap = new HashMap<>();
        exceptionToLvlMap.put("java.io.IOException", "WARN");
        exceptionToLvlMap.put("java.lang.NullPointerException", "FATAL");
        return exceptionToLvlMap;
    }

    public static void main(String[] args){
        Map<String, String> lvlMap = getExceptionLvlMap();

        try {
            someOperation();
        } catch (IOException e) {
            log.log(Level.getLevel(lvlMap.get(e.getClass().getName())), "Something bad happened!", e);
        }

        try{
            anotherOperation();
        }catch(Throwable t){
            log.log(Level.getLevel(lvlMap.get(t.getClass().getName())), "Something crazy happened!", t);
        }
    }

    public static void someOperation() throws IOException{
        throw new IOException("It's an IOException!");
    }

    public static void anotherOperation(){
        String x = null;
        //Generate a NPE
        x.equals("foo");
    }
}

log4j2.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>


    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

輸出

23:24:50.217 [main] WARN  example.SomeClass - Something bad happened!
java.io.IOException: It's an IOException!
    at example.SomeClass.someOperation(SomeClass.java:40) ~[classes/:?]
    at example.SomeClass.main(SomeClass.java:27) [classes/:?]
23:24:50.221 [main] FATAL example.SomeClass - Something crazy happened!
java.lang.NullPointerException: null
    at example.SomeClass.anotherOperation(SomeClass.java:45) ~[classes/:?]
    at example.SomeClass.main(SomeClass.java:33) [classes/:?]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM