2017-08-19 3 views
1

J'essaie d'utiliser StringWriter comme Target pour WriterAppender. Une fois que j'ai écrit mes journaux à StringWriter, je veux envoyer ces journaux comme réponse de ma méthode.Comment configurer WriterAppender dans log4j2 xml?

Mon log4j2.xml actuelle -

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

Cela me donne ci-dessous erreur -

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) 

Je cherche configuration XML correct (préféré) Si XML est impossible pour WriterAppender alors programmatique configuration.

+0

J'ai essayé d'utiliser la configuration fournie pour ConsoleAppender dans les documentations, mais je n'ai pas pu la configurer de cette façon en raison de différents types de cibles. –

Répondre

0

Je pense que WriterAppender présent dans log4j2 ne supporte pas la configuration XML.

je pourrais configurer programmation en utilisant ci-dessous un exemple de code -

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

Vous devez avoir le fichier de configuration log4j2 sur classpath pour éviter ci-dessous un message d'erreur -

ERREUR StatusLogger Aucun fichier de configuration de log4j2 trouvé. Utilisation de la configuration par défaut : consignation des erreurs uniquement dans la console. Définissez la propriété système 'org.apache.logging.log4j.simplelog.StatusLogger.level' sur TRACE à pour afficher la consignation d'initialisation interne Log4j2.