我正在将Log4j1.x迁移到2.x,这是我以前在1.x中拥有的。附加程序还将消息也记录到TestNG。
这是我曾经拥有的。
import org.apache.log4j.Layout;
import org.apache.log4j.spi.LoggingEvent;
import org.testng.Reporter;
public class TestNGAppender extends org.apache.log4j.ConsoleAppender {
public TestNGAppender() {
super();
return;
}
public TestNGAppender(Layout layout) {
super(layout);
return;
}
@Override
public void append(LoggingEvent logEvent) {
if (super.layout != null) {
Reporter.log(super.layout.format(logEvent));
}
return;
}
@Override
public void close() {
super.close();
return;
}
}
这就是我的附加方式
public static <T> Logger getConsoleAndTestNGLogger(Class<T> aClass) {
Logger logger = Logger.getLogger(aClass);
PatternLayout patternLayout = new PatternLayout("%d %5p (%F:%L) %M - %m%n");
logger.addAppender(new TestNGAppender(patternLayout));
logger.addAppender(new ConsoleAppender(patternLayout));
return logger;
}
我为此创建了一个简单的测试,这就是它的打印内容
2019-03-20 10:14:03,329 INFO (LoggingUtilsTest.java:13) testGetConsoleAndTestNGLogger - Test
现在,我要迁移到Log4j2.x,这是我到目前为止所做的。
@Plugin(name = "TestNGAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
public class TestNGAppender extends AbstractAppender
{
public TestNGAppender(String name, Layout layout)
{
super(name, null, layout, false);
}
@Override
public void append(LogEvent logEvent)
{
final Layout<? extends Serializable> layout = getLayout();
if (layout != null && layout instanceof PatternLayout) {
Reporter.log(((PatternLayout) layout).toSerializable(logEvent));
} else {
Reporter.log(logEvent.getMessage().getFormattedMessage());
}
return;
}
@PluginFactory
public static TestNGAppender createAppender(
@PluginAttribute("name") @Required(message = "A name for the Appender must be specified") final String name,
@PluginElement("Layout") Layout<? extends Serializable> layout)
{
return new TestNGAppender(name, layout);
}
}
和
public static <T> Logger getConsoleAndTestNGLogger(Class<T> aClass)
{
PatternLayout patternLayout = PatternLayout.newBuilder().withPattern("[%p] (%t) %c: %m%n").build();
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
ConsoleAppender consoleAppender = ConsoleAppender.createDefaultAppenderForLayout(patternLayout);
consoleAppender.start();
TestNGAppender appender = TestNGAppender.createAppender("TestNGAppender", patternLayout);
config.addAppender(consoleAppender);
config.addAppender(appender);
ctx.updateLoggers();
return LogManager.getLogger(aClass);
}
但是在运行测试以打印某些内容时,在Console或TestNG报告中没有看到任何内容。
答案 0 :(得分:0)
您很接近,但是没有将附加程序添加到Logger。您需要做
Logger logger = LogManager.getLogger(aClass);
PatternLayout patternLayout = PatternLayout.newBuilder().withPattern("[%p] (%t) %c: %m%n").build();
final Configuration onfig = (LoggerContext) LogManager.getContext(false).getConfiguration();
ConsoleAppender consoleAppender = ConsoleAppender.createDefaultAppenderForLayout(patternLayout);
consoleAppender.start();
TestNGAppender appender = TestNGAppender.createAppender("TestNGAppender", patternLayout);
appender.start();
config.addLoggerAppender(logger, consoleAppender);
config.addLoggerappender(logger. appender);
return logger;