当我在其中一个模块中启动gradle构建时,它会向std-error输出错误消息:
:m28_presentation_api:generateXtext
Error initializing JvmElement
这不是很有用,我希望,我可以配置log4j来打印有关异常的更多详细信息。 我认为此消息由JvmTypesBuilder.initializeSafely()
记录LOG.error("Error initializing JvmElement", e);
版本:
根据log4j V1 docs,当我将log4j.properties
文件添加到类路径时就足够了:所以我只需将此文件保存在src/main/java
。
但似乎没有使用/找到 - 或者我在配置文件中做错了什么:
log4j.rootLogger=stderr
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stderr.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
当我现在开始构建时,我期望错误消息的日志输出不同,但它会打印与以前相同的消息。显然我的log-config由于某些原因没有使用。
我缺少什么?
或者有人可以指点我一个示例项目?
答案 0 :(得分:0)
默认情况下,LOG.error()看起来不会打印堆栈跟踪。也许你可以积极改变你的代码,例如。
class MyDslJvmModelInferrer extends AbstractModelInferrer {
@Inject extension JvmTypesBuilder
private static Logger LOG = Logger.getLogger(MyDslJvmModelInferrer);
def dispatch void infer(Model element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
acceptor.accept(element.toClass(element.name, [
try {
throw new IllegalArgumentException("mimimi")
} catch (Exception e) {
e.printStackTrace
throw e
}
]))
}
}
答案 1 :(得分:0)
这不是一个真正的答案,而是一种解决方法(可能对其他人有帮助)。
在浪费了几个小时之后我放弃了log4j配置并应用了这个只需几分钟的解决方法,并揭示了真正的问题。
我做的是创建自己的JvmTypesBuilder
,覆盖initializeSafely
方法并直接将堆栈跟踪打印到stderr
:
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.eclipse.emf.ecore.EObject
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1
import org.apache.log4j.Logger
class JvmTypesBuilderTm extends JvmTypesBuilder {
private static Logger LOG = Logger.getLogger(JvmTypesBuilder)
// TODO: nasty workaround because I cannot figure out how to configure the logging correctly
override <T extends EObject> initializeSafely(T targetElement, Procedure1<? super T> initializer) {
if(targetElement !== null && initializer !== null) {
try {
initializer.apply(targetElement);
} catch (Exception e) {
LOG.error("Error initializing JvmElement: "+targetElement.toString, e);
e.printStackTrace
}
}
return targetElement;
}
}
然后我用新的代码替换了代码中JvmTypesBuilder
的所有出现。使用堆栈跟踪,很容易在我的代码中找到真正的问题。