2017-08-22 1 views
0

Wie log4j (v 2) konfiguriert wird, um MyException Fehler mit WARN-Level zu protokollieren?Wie log4j2 konfiguriert wird, `MyException` Fehler mit der WARN-Ebene zu protokollieren

Siehe Code (rxjava) Beispiel, das die MyException Ausnahme

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

wirft, die von log4j Konfiguration gefangen wird, und endet jetzt mit ERROR Ebene.

+0

fangen diese Ausnahme und melden sie sich mit 'logger.warn (')? –

+0

Wenn Sie eine Ausnahme auslösen und nicht abfangen, wird wahrscheinlich die Ausführung des Programms gestoppt und ein Fehler verursacht. Sie müssen die Ausnahme abfangen und sie mit einem 'logger.warn (Exception e)' wie von Sergei vorgeschlagen protokollieren. Wenn die Ausführung wie zuvor gestoppt werden muss, können Sie die Ausnahme erneut auslösen, nachdem Sie sie protokolliert haben. – clinomaniac

+0

Die Idee ist: Ich wollte die explizite Logik von log.error oder log.warn aus dem rx-flow vermeiden und stattdessen die Hierarchie der Ausnahmen definieren, die im logj4 konfiguriert werden können oder irgendwo, um die Ausnahmen für die Protokollebene getrennt abzubilden – ses

Antwort

0

Als Referenz Ich bin auch die Informationen, die Sie in Ihrem Kommentar versehen:

Ich wollte die Hierarchie explizite Logik des log.error oder log.warn aus dem rx-Flow vermeiden, anstatt zu definieren Ausnahmen konfigurierbar zu sein im logj4 oder irgendwo auf der Karte, welche Ausnahmen von Protokollebene separat

Hier ist ein sehr schnelles Beispiel, wie Sie dies tun könnte:

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 Konfigurationsdatei:

<?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> 

Ausgang:

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/:?] 
Verwandte Themen