2017-08-19 38 views
1

私はWriterAppenderためTargetとしてStringWriter使用しようとしています。一度私は StringWriterに書かれた私のログを持って、私は 私の方法の応答としてこれらのログを送信したいと思います。log4j2 xmlにWriterAppenderを設定するには?

私の現在のlog4j2.xml - XMLをプログラムで、その後WriterAppenderは可能ではない場合、私は(推奨)正しいXML構成 を探しています

2017-08-19 20:07:49,359 main ERROR Writer contains invalid attributes "name", "target" 
2017-08-19 20:07:49,359 main ERROR appender Writer has no parameter that matches element JsonLayout 
2017-08-19 20:07:49,359 main ERROR Unable to inject fields into builder class for plugin type class org.apache.logging.log4j.core.appender.WriterAppender, element Writer. java.lang.NullPointerException 
    at org.apache.logging.log4j.core.appender.WriterAppender.getManager(WriterAppender.java:168) 
    at org.apache.logging.log4j.core.appender.WriterAppender.access$000(WriterAppender.java:35) 
    at org.apache.logging.log4j.core.appender.WriterAppender$Builder.build(WriterAppender.java:56) 

-

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="TRACE"> 
    <Appenders> 
     <Writer name="MyAppender" target="StringWriter"> 
      <JsonLayout/> 
     </Writer> 
    </Appenders> 
    <Loggers> 
     <Root level="trace"> 
      <AppenderRef ref="MyAppender"/> 
     </Root> 
    </Loggers> 
</Configuration> 

これは、エラーの下に私を与えます構成。

+0

は私がドキュメンテーションでConsoleAppenderために提供された構成を利用することを試みたがために、ターゲットの異なる種類のそのように設定することができませんでした。 –

答えて

0

私はXMLの設定をサポートしていませんlog4j2でWriterAppender存在だと思います。私は、サンプルコードの下に使用し、それは、プログラム設定することもでき

-

ERROR StatusLoggerませんlog4j2・コンフィギュレーション・ファイルが見つかり -

package example; 

import java.io.StringWriter; 

import org.apache.logging.log4j.Level; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.core.LoggerContext; 
import org.apache.logging.log4j.core.appender.WriterAppender; 
import org.apache.logging.log4j.core.config.AppenderRef; 
import org.apache.logging.log4j.core.config.Configuration; 
import org.apache.logging.log4j.core.config.LoggerConfig; 
import org.apache.logging.log4j.core.layout.PatternLayout; 

public class App { 

    private static final Logger LOGGER = LogManager.getLogger(App.class); 

    private static StringWriter stringWriter = new StringWriter(); 

    public static void main(String[] args) { 
     createLogger(); 
     int i = 1; 
     LOGGER.info("It is info log - {}", i++); 
     LOGGER.warn("It is warn log - {} ", i); 
     LOGGER.error("It is error log"); 

     System.out.println(stringWriter.toString()); 

    } 

    private static void createLogger() { 

     final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
     final Configuration config = ctx.getConfiguration(); 

     PatternLayout layout = PatternLayout.newBuilder() 
       .withPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] - %msg%n").build(); 

     WriterAppender writerAppender = WriterAppender.newBuilder().setName("writeLogger").setTarget(stringWriter) 
       .setLayout(layout).build(); 
     writerAppender.start(); 
     config.addAppender(writerAppender); 

     AppenderRef ref = AppenderRef.createAppenderRef("writeLogger", null, null); 
     AppenderRef[] refs = new AppenderRef[] { ref }; 

     LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.INFO, "example", null, refs, null, config, 
       null); 

     loggerConfig.addAppender(writerAppender, null, null); 
     config.addLogger("example", loggerConfig); 
     ctx.updateLoggers(); 
    } 
} 

あなたはエラーメッセージの下に避けるためのクラスパス上log4j2設定ファイルを持っている必要があります。デフォルトの 設定を使用すると、コンソールにエラーのみを記録します。 がLog4j2内部の初期化ログを表示するように設定するシステムプロパティ は「org.apache.logging.log4j.simplelog.StatusLogger.level」トレースします。

関連する問題