log4j 不加载 Kotlin @Plugin类



尝试在我的 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 没有看到带有@Plugin注释的 Kotlin 类。 我尝试在配置中显式添加包,但没有帮助。问题也可能与 Kotlin 的注释处理有关,但不确定它是否相关。

Java中的相同类可以完美地工作。

任何想法/建议出了什么问题?

谢谢!

UPD 添加日志 4j.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 类可以完美运行。

我以这种方式尝试了这个问题.只需查看它为我工作的代码。

@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";
}
}

日志4j.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>

测试.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();
}
}

2周后终于有时间深入研究这个问题。

Log4j 从Log4j2Plugins.dat文件加载插件。它们在编译时(这非常令人困惑(按类填充@Plugin注释类PluginProcessor此文件。

因此,我的第一个假设是它与注释处理有关,这是正确的。

最新更新