Dee*_*eps 2 java logging appender log4j2
我试图将一个小的测试用例(确保我们的日志记录按预期工作)从log4j-1.6迁移到log4j-2.6。我们正在做的是传递映射并将其记录在Debug级别下,并验证loggingEvent是否为Debug并为预期的呈现消息进行断言。我们正在这样做
final ArgumentCaptor<LoggingEvent> loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class);
verify(mockAppender).doAppend(loggingEventCaptor.capture());
final LoggingEvent loggingEvent = loggingEventCaptor.getValue();
assertEquals(Level.DEBUG, loggingEvent.getLevel());
assertEquals("ExpectedMessage", loggingEvent.getRenderedMessage());
Run Code Online (Sandbox Code Playgroud)
但后来知道,appender和loggingEvents不在log4j2中。但我找不到实现这一目标的方法。log4j2是否可以?
经过长时间的研究,我解决了这样的问题。在tst和src lik的属性文件中添加了自定义的附加程序
<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test" status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="log4j.test.Log4jTest" level="debug">
<AppenderRef ref="Console"/>
</Logger>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
在这里,我将日志级别设置为Debug,并编写了一个自定义附加程序,该附加程序实际上已经创建了附加程序,并设置和获取日志消息
@Plugin(name = "TestAppender", category = "Core", elementType = "apender", printObject = true)
public class TestAppender extends AbstractAppender {
private List<String> messages = new ArrayList<String>();
protected TestAppender(String name, Filter filter, Layout<? extends Serializable> layout) {
super(name, filter, layout);
}
@Override
public void append(LogEvent event) {
getMessages().add(event.getMessage().toString());
}
public static TestAppender createAppender(@PluginAttribute("name") String name,
@PluginElement("Layout") Layout<? extends Serializable> layout,
@PluginElement("Filter") final Filter filter,
@PluginAttribute("otherAttribute") String otherAttribute) {
if (name == null) {
LOGGER.error("No name provided for TestAppender");
return null;
}
if (layout == null) {
layout = PatternLayout.createDefaultLayout();
}
return new TestAppender(name, filter, layout);
}
public List<String> getMessages() {
return messages;
}
public void setMessages(List<String> messages) {
this.messages = messages;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的实际测试中,我在设置方法中初始化并附加了一个附加程序
@Before
public void setUp() {
org.apache.logging.log4j.core.Logger logger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger();
PatternLayout layout = PatternLayout.createLayout("%d{HH:mm:ss.SSS} [%t] %-5level %logger{1} - %msg%n%ex",
null, null, null, Charset.forName("GBK"), false, true, null, null);
testAppender = TestAppender.createAppender("TestAppender", layout, null, "true");
testAppender.start();
logger.getContext().getConfiguration().addLoggerAppender(logger, testAppender);
}
Run Code Online (Sandbox Code Playgroud)
并以此方式断言。
assertEquals(Level.DEBUG, LogManager.getRootLogger().getLevel());
assertEquals(
"[Request headers: [{key: one, values: [one1, one2]}, {key: two, values: []}, {key: three, values: [three]}]]",
testAppender.getMessages().toString());
Run Code Online (Sandbox Code Playgroud)
这是一个漫长的过程。但这对我有用。经过长时间的研究,我想到了这一点。我正在寻找更好,更简单的方法来执行此操作(如果有)。
注意:我根据目的从多个博客复制了此代码。