4

Trying to extend logging logic in my Kotlin project. Added converter for logs:

@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?) {
        ...
    }
}

But seems like that log4j does not see Kotlin class with @Plugin annotation. I tried add packages in configuration explicitly, but did not help. The problem could also be with annotation processing for Kotlin, but not really sure if it is related.

Same class in Java works perfectly.

Any ideas/suggestions what is going wrong?

Thanks!

UPD adding log4j.xml

log4j.xml is quite standard

<?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>

I tried to specify package to scan <Configuration packages="com.test"> but it didn't help. And also as I mentioned - Java class with the same configuration works perfectly.

Sanat Serikuly
  • 189
  • 3
  • 16

2 Answers2

0

I tried this problem in this way .Just lookout the code it's working for me.

@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 class for generating 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();
       }

}
this_is_om_vm
  • 608
  • 5
  • 23
0

Finally after 2 weeks had some time to go deeper into the problem.

Log4j loads plugins from Log4j2Plugins.dat file. They populate @Plugin annotated classes to this file during compilation time(which is super confusing) by PluginProcessor class.

So, my first assumption that it is connected to annotation processing was true.

Sanat Serikuly
  • 189
  • 3
  • 16