2016-03-23 9 views
0

このエラーを処理して、別の設定log4jを設定したいとします。それは可能ですか?"log4j:WARNロガーのアペンダーは見つかりませんでした"

私はあなたのクラスパスにデフォルトの設定ファイルを提供することにより、セットアップ代替のlog4jの設定をすることができ、唯一のログ警告

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

スタックトレースを共有できますか? – user1697575

+0

エラーメッセージをコメントに入れるのではなく、質問自体に追加することを検討してください。 –

答えて

0

正しく設定する方法はありません。log4jは例外をスローしたり、誤った設定があった場合に何らかの理由で通知を出さないためです。しかし、それは可能です。

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"); 
    } 
} 

ソリューション以下
参照のPoCは完璧ではないですが、それは動作します。

0

を任意のスタックトレースを持っていません。 log4jはThread.getContextClassLoader().getResource()を使用してデフォルトの構成ファイルを検索し、ファイルシステムを直接チェックしませんので、jarファイルに含める必要があります。そのため、外部構成が提供されていない場合は、デフォルト構成に戻されます。 http://logging.apache.org/log4j/1.2/faq.html#noconfig詳細については

関連する問題