如何为xtext gradle构建配置log4j?

时间:2018-03-26 14:55:40

标签: gradle log4j xtext xtext-gradle-plugin

当我在其中一个模块中启动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由于某些原因没有使用。

我缺少什么?
或者有人可以指点我一个示例项目?

2 个答案:

答案 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的所有出现。使用堆栈跟踪,很容易在我的代码中找到真正的问题。