Пытаюсь расширить логику ведения журнала в моем проекте Kotlin. Добавлен конвертер логов:

@Plugin(name = "TestConverter", category = "Converter")
@ConverterKeys("m")
class TestConverter(name: String, style: String) : LogEventPatternConverter(name, style) {

    companion object {
        @JvmStatic
        fun newInstance(options: Array<String>): TestConverter = TestConverter("test", Thread.currentThread().name)
    }

    override fun format(event: LogEvent?, toAppendTo: StringBuilder?) {
        ...
    }
}

Но похоже, что log4j не видит класс Kotlin с аннотацией @Plugin. Я пробовал явно добавлять пакеты в конфигурацию, но это не помогло. Проблема также может быть связана с обработкой аннотаций для Kotlin, но не совсем уверен, связано ли это.

Тот же класс в Java работает отлично.

Есть идеи / предложения, что происходит не так?

Спасибо!

UPD добавление log4j.xml

Log4j.xml вполне стандартный

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${env:CONSOLE_LOG_PATTERN:-%d %p %c [%t] %X %m%n}"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="test" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Я пытался указать пакет для сканирования <Configuration packages="com.test">, но это не помогло. А также, как я уже упоминал, класс Java с такой же конфигурацией работает отлично.

3
Sanat Serikuly 14 Сен 2018 в 12:24

2 ответа

Лучший ответ

Наконец через 2 недели появилось время, чтобы глубже вникнуть в проблему.

Log4j загружает плагины из файла Log4j2Plugins.dat. Они заполняют аннотированные классы @Plugin в этот файл во время компиляции (что очень сбивает с толку) классом PluginProcessor.

Итак, мое первое предположение, что это связано с обработкой аннотаций, было верным.

0
Sanat Serikuly 27 Сен 2018 в 15:37

Я попробовал решить эту проблему таким образом. Просто посмотрите код, который у меня работает.

@Plugin(name="TransactionIdConverter", category = "Converter")
@ConverterKeys({"transanctionLogid","trscId"})
public class TransactionLogIdConverter extends LogEventPatternConverter{
    protected TransactionLogIdConverter(String name, String style) {
        super(name, style);
    }

    public static TransactionLogIdConverter newInstance(String[] options) {
        return new TransactionLogIdConverter("transanctionLogid",Thread.currentThread().getName());
    }

    @Override
    public void format(LogEvent event, StringBuilder toAppendTo) {
        toAppendTo.append(getTransactionId());

    }

    protected String getTransactionId() {

       String transacationId = TransactionLogIdGenerator.myTransactionId();

        return transacationId;
    }

}

TransactionIdGenerator.java класс для генерации TransactionLogId

public class TransactionLogIdGenerator {

       public static String  myTransactionId(){
              return "0909-0967-8678";

       }
   }

< Сильный > Log4j.xml

 <?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://logging.apache.org/log4j/2.0/config"
       status="OFF" packages="com.custom.pattern">
       <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
     <PatternLayout pattern="  Date:-%d  TransactionLogID:- %trnLogid   line Number:-%L  Location:-%l   className: %C  Message:-%m%n"/>

    </Console>
  </Appenders>
  <loggers>
              <Logger name="org.apache.log4j.xml" level="all" />
              <root level="all">
                     <appender-ref ref="STDOUT" level="TRACE" />
                     </root>
  </loggers>
</configuration>

< Сильный > Test.java

public class Test {
        private static final Logger logger = LogManager.getLogger(Test.class);   
       public static void myTest(){
              logger.info("Sample info message");
              logger.debug("sample debug message");

       }
       public static void main(String[] args) {
              myTest();
       }

}
0
this_is_om_vm 24 Сен 2018 в 05:46