Как настроить log4j для сборки xtext gradle?
Когда я запускаю сборку gradle в одном из моих модулей, он выводит сообщение об ошибке в std-error:
:m28_presentation_api:generateXtext
Error initializing JvmElement
Это не очень полезно, и я надеюсь, что я могу настроить log4j для печати более подробной информации об исключении. Я думаю, что это сообщение зарегистрировано JvmTypesBuilder.initializeSafely()
LOG.error("Error initializing JvmElement", e);
Версии:
- Я использую xtext 2.13: в файле MANIFEST.MF я вижу
- версия log4j: 1.2.15
- версия Gradle: 4.6
- Версия xtext-gradle-plugin: 1.0.21
Согласно документам 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
в моем коде с новым. С помощью трассировки стека было легко найти реальную проблему в моем коде.