Как настроить log4j для сборки xtext gradle?

Когда я запускаю сборку gradle в одном из моих модулей, он выводит сообщение об ошибке в std-error:

:m28_presentation_api:generateXtext
Error initializing JvmElement

Это не очень полезно, и я надеюсь, что я могу настроить log4j для печати более подробной информации об исключении. Я думаю, что это сообщение зарегистрировано JvmTypesBuilder.initializeSafely()

LOG.error("Error initializing JvmElement", e);

Версии:

Согласно документам log4j V1, этого должно быть достаточно, когда я добавляю log4j.properties файл в classpath: поэтому я просто сохраняю этот файл в 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 ответа

Похоже, что 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
            }
        ]))
    }
}

Это на самом деле не ответ, а обходной путь (может быть полезным для других).

Я потерял настройку 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 в моем коде с новым. С помощью трассировки стека было легко найти реальную проблему в моем коде.

Другие вопросы по тегам