gpt4 book ai didi

java - 将 slf4j 重定向到字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:03 25 4
gpt4 key购买 nike

如何配置 slf4j 将所有记录的信息重定向到 Java 字符串?

这有时在单元测试中很有用,例如测试加载 servlet 时是否不打印警告,或确保永远不会使用禁止的 SQL 表。

最佳答案

有点晚了,但还是...

由于日志记录配置在单元测试时应该很容易替换,您可以配置为记录标准输出,然后在执行日志记录主题之前捕获它。然后将记录器设置为对除被测对象以外的所有人保持静音。

@Test
public void test()
{
String log = captureStdOut(() -> {
// ... invoke method that shouldn't log
});
assertThat(log, is(emptyString()));
}



public static String captureStdOut(Runnable r)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream out = System.out;
try {
System.setOut(new PrintStream(baos, true, StandardCharsets.UTF_8.name()));
r.run();
return new String(baos.toByteArray(), StandardCharsets.UTF_8);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("End of the world, Java doesn't recognise UTF-8");
} finally {
System.setOut(out);
}
}

如果在测试中使用 slf4j 而不是 log4j,一个简单的 log4j.properties:

log4j.rootLogger=OFF, out
log4j.category.com.acme.YourServlet=INFO, out
log4j.appender.out=org.apache.log4j.ConsoleAppender
log4j.appender.out.layout=org.apache.log4j.PatternLayout
log4j.appender.out.layout.ConversionPattern=%-5p %c{1}:%L - %m%n

或者,如果您不喜欢在单元测试中将配置作为外部依赖项,则以编程方式配置 log4j:

//...

static final String CONSOLE_APPENDER_NAME = "console.appender";

private String pattern = "%d [%p|%c|%C{1}] %m%n";
private Level threshold = Level.ALL;
private Level defaultLevel = Level.OFF;

//...

public void configure()
{
configureRootLogger();
configureConsoleAppender();
configureCustomLevels();
}


private void configureConsoleAppender()
{
ConsoleAppender console = new ConsoleAppender();
console.setName(CONSOLE_APPENDER_NAME);
console.setLayout(new PatternLayout(pattern));
console.setThreshold(threshold);
console.activateOptions();
Logger.getRootLogger().addAppender(console);
}


private void configureRootLogger()
{
Logger.getRootLogger().getLoggerRepository().resetConfiguration();
Logger.getRootLogger().setLevel(defaultLevel);
}

关于java - 将 slf4j 重定向到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7065763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com