[英]How to configure WriterAppender in log4j2 xml?
I am trying to use StringWriter
as Target
for WriterAppender
. 我正在尝试将StringWriter
用作WriterAppender
Target
。 Once I have my logs written to StringWriter
, I want to send these logs as response of my method. 将日志写入StringWriter
,我想将这些日志作为方法的响应发送。
My current log4j2.xml - 我当前的log4j2.xml-
<?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>
This gives me below error - 这给了我下面的错误-
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)
I am looking for correct XML configuration (preferred) If XML is not possible for WriterAppender
then programmatic configuration. 我正在寻找正确的XML配置(首选)。如果WriterAppender
无法使用XML,则WriterAppender
进行程序配置。
I think WriterAppender present in log4j2
does not support XML configuration. 我认为log4j2中存在log4j2
不支持XML配置。
I could configure it programmatic using below sample 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();
}
}
You need to have log4j2
configuration file on classpath
for avoiding below error message - 您需要在classpath
上具有log4j2
配置文件,以避免出现以下错误消息 -
ERROR StatusLogger No log4j2 configuration file found. Using default
configuration: logging only errors to the console. Set system property
'org.apache.logging.log4j.simplelog.StatusLogger.level' to TRACE to
show Log4j2 internal initialization logging.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.