Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging log4j不加载Kotlin@Plugin类_Logging_Kotlin_Log4j2 - Fatal编程技术网

Logging log4j不加载Kotlin@Plugin类

Logging log4j不加载Kotlin@Plugin类,logging,kotlin,log4j2,Logging,Kotlin,Log4j2,尝试在我的Kotlin项目中扩展日志逻辑。 添加了日志转换器: @Plugin(name = "TestConverter", category = "Converter") @ConverterKeys("m") class TestConverter(name: String, style: String) : LogEventPatternConverter(name, style) { companion object { @JvmStatic

尝试在我的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?) {
        ...
    }
}
插件(name=“TestConverter”,category=“Converter”) @转换器键(“m”) 类TestConverter(名称:String,样式:String):LogEventPatternConverter(名称,样式){ 伴星{ @JvmStatic fun newInstance(选项:数组):TestConverter=TestConverter(“测试”,Thread.currentThread().name) } 覆盖有趣的格式(事件:LogEvent?,toAppendTo:StringBuilder?){ ... } } 但似乎log4j没有看到带有@Plugin注释的Kotlin类。 我尝试显式地在配置中添加包,但没有帮助。问题也可能与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>


我试图指定要扫描的包
,但没有帮助。正如我所提到的,具有相同配置的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;
    }

}
用于生成TransactionLogId的TransactionIdGenerator.java类

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>

两周后,终于有时间深入研究这个问题

Log4j从
Log4j2Plugins.dat
文件加载插件。它们通过
PluginProcessor
类在编译期间(非常混乱)将
@Plugin
注释类填充到此文件中


因此,我的第一个假设是连接到注释处理是正确的。

您的代码是Java,我在将Kotlin类加载到log4j时遇到了问题。能否请您将您的问题与log4j.xml一起更新。是否添加了我的标准log4j.xml?您能尝试一下吗
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();
       }

}