【发布时间】:2021-07-05 11:56:41
【问题描述】:
我正在编写一个使用 SLF4J 作为 API 和 Log4J2 作为日志记录实现的单元测试。
我有一个自定义的AbstractAppender(目前还没有使用LogEvent),但我正在尝试输出LogEvent消息并首先使用System.out来格式化消息,以确保我得到我所期望的——我不在这个案例。
根据我的属性文件模式,我希望看到 "---WCustomAppender---" 作为我的输出消息的前缀,但似乎该模式没有被添加到我的附加程序中。
我是否缺少某些东西,例如财产等?
以下所有代码:
test/resources/log4j2-test.properties
packages = learning.logging
appenders=WCustomAppender
rootLogger.level=ERROR
rootLogger.appenderRefs=WCustomAppender
rootLogger.appenderRef.stdout.ref=WCustomAppender
appender.WCustomAppender.name=WCustomAppender
appender.WCustomAppender.type=WCustomAppender
appender.WCustomAppender.layout.type=PatternLayout
appender.WCustomAppender.layout.pattern=---WCustomAppender--- %m %n
测试/学习/记录/WCustomAppender
package learning.logging;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Plugin(
name = "WCustomAppender",
category = Core.CATEGORY_NAME,
elementType = Appender.ELEMENT_TYPE)
class WCustomAppender extends AbstractAppender {
private static final List<LogEvent> LOG_EVENTS = new ArrayList<>();
protected WCustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, Property[] properties) {
System.out.println("layout loaded in appender from constructor: " + layout);
super(name, filter, layout, ignoreExceptions, properties);
}
@PluginFactory
public static WCustomAppender createAppender(
@PluginAttribute("name") String name,
@PluginElement("Filter") Filter filter,
@PluginElement("Layout") Layout<? extends Serializable> layout) {
return new WCustomAppender(name, filter, layout, false, Property.EMPTY_ARRAY);
}
public List<LogEvent> getLogEvents() {
return LOG_EVENTS;
}
@Override
public void append(LogEvent event) {
System.out.println("message: " + event.getMessage());
System.out.println("message (formatted): " + event.getMessage().getFormattedMessage());
LOG_EVENTS.add(event);
}
}
测试/学习/记录/LogTester
package learning.logging;
import lab.error.logging.ErrorLogger;
import lab.error.logging.ErrorStatus;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTester {
private Logger log = LoggerFactory.getILoggerFactory().getLogger("LogTester");
@Test
public void appenderPOC() {
log.error("My custom appender POC");
}
}
控制台输出:
layout loaded in appender from constructor: ---WCustomAppender--- %m %n
message: My custom appender POC
message (formatted): My custom appender POC
【问题讨论】:
标签: java unit-testing logging log4j2