2016-03-23 13 views
0

Ich möchte diesen Fehler behandeln, um eine alternative Konfiguration log4j einzurichten. Ist das möglich?How-to catch "log4j: WARN Es konnten keine Appender für den Logger gefunden werden"?

Ich habe keine Stacktrace, nur Warnungen Logbuch

log4j:WARN No appenders could be found for logger (agent.Test1Agent.JavaAgent). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
+0

Können Sie Ihre Stack-Trace teilen? – user1697575

+0

Bitte denken Sie darüber nach, die Fehlermeldungen selbst in Frage zu stellen, anstatt sie in Kommentare zu setzen. –

Antwort

0

Es gibt keine Möglichkeit, das zu tun, was Sie wollen, da log4j im Falle einer Fehlkonfiguration keine Ausnahmen auslöst oder irgendwie benachrichtigt. Aber es ist möglich.
See PoC unter

import org.apache.log4j.LogManager; 
import org.apache.log4j.Logger; 
import org.apache.log4j.PropertyConfigurator; 
import org.apache.log4j.helpers.Loader; 
import org.apache.log4j.spi.Configurator; 

import java.io.OutputStream; 
import java.io.PrintStream; 
import java.net.URL; 

public class Log4jAlternativeConfig { 

    private static class PrintStreamCallbackSupportDecorator extends PrintStream { 

     public PrintStreamCallbackSupportDecorator(OutputStream out, Callback callback) { 
      super(out); 
      this.callback = callback; 
     } 

     public interface Callback { 
      public void onPrintln(String x); 
     } 

     private Callback callback; 

     @Override 
     public void println(String x) { 
      callback.onPrintln(x); 
      super.println(x); 
     } 
    } 

    public static void main(String[] args) { 

     PrintStreamCallbackSupportDecorator.Callback callback = new PrintStreamCallbackSupportDecorator.Callback() { 
      @Override 
      public void onPrintln(String x) { 
       if (x.startsWith("log4j:WARN No appenders could be found for logger")) { 
        Configurator configurator = new PropertyConfigurator(); 
        URL url = Loader.getResource("log4j_alternative.properties"); 
        configurator.doConfigure(url, LogManager.getLoggerRepository()); 
       } 
      } 
     }; 

     System.setErr(new PrintStreamCallbackSupportDecorator(System.err, callback)); 

     Logger log = LogManager.getLogger(Log4jAlternativeConfig.class); 

     //causes "No appenders could be found for logger" warning 
     log.error("test"); 

     //should be logged as configured in log4j_alternative.properties 
     log.error("test 2"); 
    } 
} 

Die Lösung ist nicht perfekt, aber es funktioniert.

0

Sie können Setup eine alternative log4j Konfiguration durch eine Standard-Konfigurationsdatei auf Ihrem Classpath bereitstellt. Da log4j Thread.getContextClassLoader().getResource() verwendet, um die Standardkonfigurationsdateien zu finden, und das Dateisystem nicht direkt überprüft, sollte es in Ihrem Jar enthalten sein. Wenn keine externe Konfiguration vorhanden ist, wird auf die Standardkonfiguration zurückgegriffen. Weitere Informationen finden Sie unter http://logging.apache.org/log4j/1.2/faq.html#noconfig

Verwandte Themen