Недавно я экспериментировал с Log4j 2 протоколированием и попытался сравнить его производительность с Logback на моей локальной машине Mac. Удивительно, но я вижу, что Logback работает лучше в моих тестах. Я ожидал, что Log4j 2 будет лучше, чем Logback, как заявлено на сайте Log4j 2, поэтому я хочу проверить, не ошибаюсь ли я в использовании Log4j 2.Log4j 2 performance: однопоточное ведение журнала консоли в Logback, чем Log4j 2?
Для тестирования я использовал прямые Log4j 2 и Logback без используя SLF4J. Кроме того, ConsoleAppender
использовали для обеих структур лесозаготовок, и образец, который я испытываемый:
<Pattern>%d{YYYY-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern>
Тест каротаж код:
logger.info("This is a bootstrap message");
long start = System.currentTimeMillis();
for (int i = 1; i <= 1000000; i++) {
logger.info("Order={} successfully processed", "ABC123");
}
long end = System.currentTimeMillis();
logger.info("time taken to process={} ms", end - start);
Я побежал тест 10 раз для каждого входа отдельно и попытался взять среднее время, затраченное на обработку. Неожиданно в каждом прогоне журнал выполнялся лучше. Я попытался отключить ведение журнала по умолчанию GC, который поставляется с Log4j 2 с использованием Params:
-Dlog4j2.enable.threadlocals=false -Dlog4j2.enable.direct.encoders=false
, но я до сих пор не видел каких-либо улучшений по сравнению Logback. Может ли кто-нибудь подтвердить, что я делаю, правильно или нет?
log4j 2 конфигурации:
<Configuration status="INFO" debug="false">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="com.mycompany.app" level="INFO"/>
<Root level="INFO">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
Logback конфигурации:
<configuration debug="true" scan="true" scanPeriod="1 hour">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{YYYY-MM-dd HH:mm:ss:S} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name="com.mycompany.app" level="info"/>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
В любом случае вы можете сделать 'Task.Run (() => logger.info (« Order = {} успешно обработан »,« ABC123 »));' который будет запускать его в другом потоке, чтобы вы не заблокировать. Только проблема, которая может возникнуть, - это умение «забыть» и «забыть», то есть, если оно терпит неудачу, вы не узнаете об этом. – sed
Привет, Стэн, спасибо, но это не имеет никакого значения для их производительности, и обе эти рамки будут вам полезны, я пытаюсь посмотреть, не сделал ли я что-то неправильно при настройке log4j 2 с моего конца. – Suresh
Прошу также показать конфигурацию Log4j2 и Logback чтобы люди могли воспроизвести ваш тест. –