Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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
Java 如何配置log4j2以使用警告级别记录`MyException`错误_Java_Rx Java_Log4j2_Vert.x - Fatal编程技术网

Java 如何配置log4j2以使用警告级别记录`MyException`错误

Java 如何配置log4j2以使用警告级别记录`MyException`错误,java,rx-java,log4j2,vert.x,Java,Rx Java,Log4j2,Vert.x,如何将log4j(v2)配置为以警告级别记录MyException错误 请参阅抛出MyException异常的代码(rxjava)示例 return map.get(id).toObservable() .filter(Objects::nonNull) .switchIfEmpty(Observable.error(new MyException("Happens"))) .toSingle();

如何将log4j(v2)配置为以警告级别记录
MyException
错误

请参阅抛出MyException异常的代码(
rxjava
)示例

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

这被log4j配置捕获,并以
错误
级别结束。

作为参考,我将您在评论中提供的信息包括在内:

我希望避免在rx流中使用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");
    }
}

作为参考,我将您在评论中提供的信息包括在内:

我希望避免在rx流中使用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");
    }
}

捕获此异常并自己用
logger.warn()
记录它?如果抛出异常但未捕获它,它可能会停止程序的执行并导致错误。您需要捕获异常并使用Sergei建议的
记录器.warn(异常e)
记录它。如果您需要像以前一样停止执行,那么您可以在记录异常后再次抛出异常。想法是:我希望避免在rx流中使用log.error或log.warn的显式逻辑,相反,在logj4或其他地方定义可配置的异常层次结构,以将哪些异常分别映射到日志级别。使用
logger.warn()
,跟踪此异常并自己记录它。如果抛出异常但未捕获它,它可能会停止程序的执行并导致错误。您需要捕获异常并使用Sergei建议的
记录器.warn(异常e)
记录它。如果您需要像以前一样停止执行,那么您可以在记录异常后再次抛出异常。其想法是:我希望避免在rx流中使用log.error或log.warn的显式逻辑,而是定义异常层次结构,以便在logj4中或其他地方配置,以将哪些异常分别映射到日志级别
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/:?]