在工作中,我主動從頭開始創建一個日志庫,以便在內部服務和項目中使用。迄今為止,我已經使用自定義類創建了概念證明,該自定義類extends 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>@Slf4jpublic 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(); }測試已運行,在輸出中,我看到很多結果數字,但我不知道應該比較哪些值,以及如何斷言如果我有良好的性能結果,這不是因為消息已被丟棄?您能給我一些如何準備有效的性能測試的提示嗎?
1 回答

小唯快跑啊
TA貢獻1863條經驗 獲得超2個贊
您有一個異步AsyncAppender
附加程序,它可能會刪除隊列中的消息。同時,JMH 基準測試期望@Benchmark
帶注釋的方法中的代碼同步執行,以計算需要多長時間。這行不通。
在我看來,您試圖一次測試太多的東西,例如整個 Logback 堆棧。如果您開發了自定義布局類,LoggingRulesApplicator
請先為該類編寫 JMH 基準測試。
查看現有的 log4j2 JMH 基準測試。通過使用 NOOP 附加程序可以簡化設置,您可能也應該擁有它。
添加回答
舉報
0/150
提交
取消