Groovy 从gradle为log4j启用调试符号

Groovy 从gradle为log4j启用调试符号,groovy,gradle,Groovy,Gradle,我的log4j语句显示了行号的?s 我试过的 网络上的其他答案说,当您没有将调试信息编译到类中时,就会发生这种情况。例如,在Ant中,这将通过完成,Groovy在类文件中包含行号。问题在于groovy调用方法与Java稍有不同,Java混淆了确定行号的Log4j代码 特别是,如果你改变了路线 log.info "XXXXXXXXXXXXX" 到 您可以看到groovy调用方法时调用了一些反射方法。我生成的堆栈跟踪中最顶层的方法是sun.reflect.NativeConstructorAcce

我的log4j语句显示了行号的
s

我试过的
网络上的其他答案说,当您没有将调试信息编译到类中时,就会发生这种情况。例如,在Ant中,这将通过
完成,Groovy在类文件中包含行号。问题在于groovy调用方法与Java稍有不同,Java混淆了确定行号的Log4j代码

特别是,如果你改变了路线

log.info "XXXXXXXXXXXXX"

您可以看到groovy调用方法时调用了一些反射方法。我生成的堆栈跟踪中最顶层的方法是
sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
,它是本机方法,没有行号。这就是Log4j所看到的。不幸的是,要过滤Log4j使用的stacktrace或告诉Log4j进一步查看堆栈并不容易


一种可能的解决方案是启用静态编译。如果将
@groovy.transform.CompileStatic
添加到库类或方法中,您将获得正确的行号。

就是这样。经过更多的搜索,我发现它在堆栈中查找正确的行号,但它看起来太凌乱和脆弱,不值得这么做。我想我会满足于没有行号。对于那些认为他们可以通过使用log4j2或commons解决这个问题的人来说,他们也无法计算行号。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
   <appender name="console" class="org.apache.log4j.ConsoleAppender">
       <layout class="org.apache.log4j.PatternLayout">
               <param name="ConversionPattern" value="%d %c:%L - %m%n" />
       </layout>
   </appender>
   <root>
           <level value="INFO" />
           <appender-ref ref="console" />
   </root>
</log4j:configuration>
log.info "XXXXXXXXXXXXX"
log.error "XXXXXXXXXXXXX", new Exception('test')