[在工作中,我主动从头开始创建一个日志库,供内部服务和项目使用。
到目前为止,我已经创建了一个自定义类,extends
PatternLayout
并模糊了输出日志条目中的某些字段。”
现在的主要任务是断言性能是可以接受的,并且我的解决方案可以处理数百万个日志条目,而不会丢失消息。
我决定为我的自定义登录,默认登录布局和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
带注释的方法中的代码被同步执行以计算所需的时间。这将不起作用。