Я пытаюсь сделать все регистраторы Log4J 2 асинхронными с IMAP Disruptor. У меня правильно установлены зависимости разрушителя, а в IntelliJ я установил следующее системное свойство в параметрах виртуальной машины.
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
Мой файл log4j2.xml таков.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
<Appenders>
<Console name="Console-Appender" target="SYSTEM_OUT">
<PatternLayout>
<pattern>
[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
</pattern>>
</PatternLayout>
</Console>
<File name="File-Appender" fileName="logs/xmlfilelog.log" >
<PatternLayout>
<pattern>
[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="guru.springframework.blog.log4j2async" level="debug">
<AppenderRef ref="File-Appender"/>
</Logger>
<Root level="debug">
<AppenderRef ref="Console-Appender"/>
</Root>
</Loggers>
</Configuration>
Мой класс регистратора имеет этот код.
package guru.springframework.blog.log4j2async;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4J2AsyncLogger {
private static Logger logger = LogManager.getLogger();
public Log4J2AsyncLogger(){
logger.info("Logger created by Thread Id:"+Thread.currentThread().getId());
}
public void performSomeTask(){
logger.debug("This is a debug message sent by Thread Id:" + Thread.currentThread().getId());
logger.info("This is a info message sent by Thread Id:" + Thread.currentThread().getId());
logger.warn("This is a warn message sent by Thread Id:" + Thread.currentThread().getId());
logger.error("This is a error message sent by Thread Id:" + Thread.currentThread().getId());
logger.fatal("This is a fatal message sent by Thread Id:" + Thread.currentThread().getId());
}
}
Я ожидал вывода сообщений журнала с разными идентификаторами потоков. Но и консольные, и файловые выходы:
[INFO ] 2016-03-25 11:41:01.189 [main] Log4J2AsyncLogger - System property Log4jContextSelector: org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
[INFO ] 2016-03-25 11:41:01.189 [main] Log4J2AsyncLogger - Logger created by Thread Id:1
[DEBUG] 2016-03-25 11:41:01.189 [main] Log4J2AsyncLogger - This is a debug message sent by Thread Id:1
[INFO ] 2016-03-25 11:41:01.189 [main] Log4J2AsyncLogger - This is a info message sent by Thread Id:1
[WARN ] 2016-03-25 11:41:01.189 [main] Log4J2AsyncLogger - This is a warn message sent by Thread Id:1
[ERROR] 2016-03-25 11:41:01.189 [main] Log4J2AsyncLogger - This is a error message sent by Thread Id:1
[FATAL] 2016-03-25 11:41:01.189 [main] Log4J2AsyncLogger - This is a fatal message sent by Thread Id:1
В классе регистратора я попытался использовать цикл for с 1000 циклов для регистрации сообщений, но все же всю работу выполняет один и тот же основной поток. Что я делаю не так?