我的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
,其中包含source
,lines
或vars
。默认情况下为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)
我的问题当然是,我如何才能显示行号而不是问号?
答案 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
添加到图书馆类或方法中,您将获得正确的行号。