从gradle启用log4j的调试符号

时间:2015-03-30 16:06:50

标签: groovy gradle

我的log4j语句显示行号的?秒。

我尝试了什么

网络上的其他答案表示,如果您尚未将调试信息编译到类中,就会发生这种情况。例如,在Ant中,这将使用<javac debug="true" ...完成。在gradle中搜索一种方法只能产生

http://gradle.org/docs/2.3-rc-2/dsl/org.gradle.api.tasks.compile.CompileOptions.html

  

debug - 判断是否在生成的类文件中包含调试信息。默认为true

我通过在我的build.gradle中添加println compileGroovy.options.debug来验证这一点,并打印true。我还发现了http://forums.gradle.org/gradle/topics/compile-groovy-with-debugging-information,建议使用tasks.withType(GroovyCompile) { options.debug = true },这也不起作用。最后,我找到了compileGroovy.options.debugOptions.debugLevel,其中包含sourcelinesvars。默认情况下为null,但将其设置为source,lines并未提供我的行信息。

再生

gradle init --type groovy-library

编辑src / main / groovy / Library.groovy以获得额外的行:

import groovy.util.logging.Log4j
@Log4j
class Library {
    boolean someLibraryMethod() {
       log.info "XXXXXXXXXXXXX"
       true
    }
}

添加 compile 'log4j:log4j:1.2.17'来构建.gradle

添加文件src / main / resources / log4j.xml

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

最后运行gradle clean test -i并观察你看到了 2015-03-30 08:47:31,996 Library:? - XXXXXXXXXXXXX 请注意邮件中的?

版本信息

$ gradle -version

------------------------------------------------------------
Gradle 2.3
------------------------------------------------------------

Build time:   2015-02-16 05:09:33 UTC
Build number: none
Revision:     586be72bf6e3df1ee7676d1f2a3afd9157341274

Groovy:       2.3.9
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_40 (Oracle Corporation 25.40-b25)
OS:           Windows 7 6.1 amd64

$ groovy -version
Groovy Version: 2.4.3 JVM: 1.8.0_40 Vendor: Oracle Corporation OS: Windows 7

$ java -version
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

我的问题当然是,我如何才能显示行号而不是问号?

1 个答案:

答案 0 :(得分:1)

Groovy包含类文件中的行号。问题是groovy调用的方法与Java略有不同,这会混淆决定行号的Log4j代码。

特别是,如果你改变了行

log.info "XXXXXXXXXXXXX"

log.error "XXXXXXXXXXXXX", new Exception('test')

你可以看到当groovy调用方法时会调用一些反射方法。我生成的堆栈跟踪中最顶层的方法是sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method),作为本机方法,它没有行号。这就是Log4j所关注的。遗憾的是,过滤Log4j使用的堆栈跟踪或告诉Log4j在堆栈中向下看是不容易的。

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