gpt4 book ai didi

java - 如何为自定义日志记录解决方案正确创建性能测试?

转载 作者:行者123 更新时间:2023-11-30 01:44:27 25 4
gpt4 key购买 nike

在工作中,我主动从头开始创建一个日志库,以便在内部服务和项目中使用。

迄今为止,我已经使用自定义类创建了概念验证,该自定义类扩展 PatternLayout 并混淆了输出日志条目中的某些字段。

现在的主要任务是断言性能是可以接受的,并且我的解决方案可以处理数百万个日志条目而不会丢失消息。

我决定为我的自定义 logback、默认 logback 布局和 Log4j2 编写性能测试,以便比较输出结果。我已经使用 jmh 进行了单元测试。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<appender name="FILE_APPLY_RULES" class="ch.qos.logback.core.FileAppender">
<file>logs\log.txt</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.ingenico.epayments.logging.rule.LoggingRulesApplicator">
<pattern>%msg%n</pattern>
<applyRules>true</applyRules>
<loggingRules>src/test/resources/logging-rules.json</loggingRules>
</layout>
</encoder>
</appender>

<appender name="ASYNC_FILE_APPLY_RULES" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="FILE_APPLY_RULES" />
<queueSize>256</queueSize>
<includeCallerData>false</includeCallerData>
<neverBlock>true</neverBlock>
</appender>

<root level="INFO">
<appender-ref ref="ASYNC_FILE_APPLY_RULES" />
</root>

</configuration>

@Slf4j
public class LogbackTest {

@Test
public void launchBenchmark() throws RunnerException {
Options opt = new OptionsBuilder()
.include(this.getClass().getName() + ".*")
.timeUnit(TimeUnit.MICROSECONDS)
.warmupTime(TimeValue.seconds(1))
.warmupIterations(2)
.measurementTime(TimeValue.seconds(1))
.measurementIterations(2)
.threads(2)
.forks(1)
.shouldFailOnError(true)
.shouldDoGC(true)
.addProfiler(StackProfiler.class)
.addProfiler(HotspotRuntimeProfiler.class)
.build();
new Runner(opt).run();
}

@BenchmarkMode(Mode.All)
@Measurement(iterations = 200, time = 200, timeUnit = MILLISECONDS)
@Benchmark
public void logBenchmark() {
log.info("{\"id\":\"12345\",\"cardData\":{\"bar\":\"bar\",\"foo\":\"foo\",\"number\":\"number\"}}");
}

}

测试已运行,在输出中,我看到很多结果数字,但我不知道应该比较哪些值,以及如何断言如果我有良好的性能结果,这不是因为消息已丢失?

您能给我一些关于如何准备有效的性能测试的提示吗?

最佳答案

您有一个异步 AsyncAppender 附加程序,它可能会删除队列中的消息。同时,JMH 基准测试期望 @Benchmark 注释方法中的代码同步执行,以计算需要多长时间。这行不通。

IMO,您试图一次测试太多的东西,例如整个 Logback 堆栈。如果您开发了自定义布局类 LoggingRulesApplicator,请首先为此类编写 JMH 基准标记。

看看existing log4j2 JMH benchmarks 。通过使用 NOOP 附加程序可以简化设置,您可能也应该拥有它。

关于java - 如何为自定义日志记录解决方案正确创建性能测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58651431/

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