| Summary: | EclipseLogAppender is not fail safe in standalone execution | ||
|---|---|---|---|
| Product: | [Modeling] TMF | Reporter: | Karsten Thoms <karsten.thoms> |
| Component: | Xtext | Assignee: | Project Inbox <tmf.xtext-inbox> |
| Status: | CLOSED FIXED | QA Contact: | |
| Severity: | normal | ||
| Priority: | P3 | CC: | Holger.Schill, sebastian.zarnekow, sven.efftinge |
| Version: | 2.0.0 | Flags: | sebastian.zarnekow:
indigo+
|
| Target Milestone: | SR2 | ||
| Hardware: | PC | ||
| OS: | Mac OS X - Carbon (unsup.) | ||
| Whiteboard: | |||
Workaround:
- add log4j.properties without EclipseLogAppender to the project
- configure with system property log4j.configuration
Example log4j.properties file:
=======================================
# Root logger configuration. Don't change this.
log4j.rootLogger=DEBUG, default
# This appender will write to the stdout console
log4j.appender.default=org.apache.log4j.ConsoleAppender
log4j.appender.default.layout=org.apache.log4j.PatternLayout
log4j.appender.default.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# This appender will write to the Eclipse error log. It will ONLY log ERROR and FATAL messages.
log4j.appender.eclipse=org.eclipse.xtext.logging.EclipseLogAppender
log4j.appender.eclipse.layout=org.apache.log4j.PatternLayout
log4j.appender.eclipse.layout.ConversionPattern=%c %x - %m%n
# Configure your log categories below:
log4j.logger.org.eclipse=WARN
log4j.logger.org.eclipse.xtext=WARN
log4j.logger.org.eclipse.xtext.ui.editor.outline=WARN
log4j.logger.org.eclipse.xtext.ui.editor.contentassist.antlr.internal=WARN
=======================================
Example configuration in Maven:
=======================================
<plugin>
<groupId>org.fornax.toolsupport</groupId>
<artifactId>fornax-oaw-m2-plugin</artifactId>
<executions>
<execution>
<id>xtext</id>
<phase>generate-sources</phase>
<goals>
<goal>run-workflow</goal>
</goals>
<configuration>
<workflowEngine>mwe2</workflowEngine>
<workflowDescriptor>org.xspray.xtext.GenerateXspray</workflowDescriptor>
<timestampFileName>xtext-generator.timestamp</timestampFileName>
<jvmSettings>
<fork>true</fork>
<jvmArgs>
<jvmArg>-Xms100m</jvmArg>
<jvmArg>-Xmx700m</jvmArg>
<jvmArg>-XX:MaxPermSize=128m</jvmArg>
<jvmArg>-Dlog4j.configuration=file:${basedir}/log4j.properties</jvmArg>
</jvmArgs>
</jvmSettings>
</configuration>
</execution>
</executions>
</plugin>
=======================================
We should apply the suggested changes to simplify the automated build setup. +1 pushed to master Closing all bugs that were set to RESOLVED before Neon.0 Closing all bugs that were set to RESOLVED before Neon.0 |
When executing an Xtext workflow in standalone Java mode and with org.eclipse.xtext.logging on the classpath (screnario: Maven with Tycho and Fornax Workflow Plugin), the logging properties from the logging fragment are taken and the EclipseLogAppender used. Since it is standalone mode, Platform.getBundles() will return null, which is not checked in the getLog() method. I propose to check for null and also improve the error message: -------------------------------------------- Bundle[] bundles = Platform.getBundles(ORG_APACHE_LOG4J,"1.2.15"); if (bundles==null || bundles.length==0) throw new IllegalStateException("Host bundle "+ORG_APACHE_LOG4J+" 1.2.15 not found!"); -------------------------------------------- Also isDoLog() should check 'log==null' -------------------------------------------- private boolean isDoLog(Level level) { return log!=null && (level.toInt() >= Priority.WARN_INT); } -------------------------------------------- Stacktrace: -------------------------------------------- java.lang.NullPointerException [WARNING] at org.eclipse.xtext.logging.EclipseLogAppender.getLog(EclipseLogAppender.java:33) [WARNING] at org.eclipse.xtext.logging.EclipseLogAppender.append(EclipseLogAppender.java:46) [WARNING] at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) [WARNING] at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66) [WARNING] at org.apache.log4j.Category.callAppenders(Category.java:206) [WARNING] at org.apache.log4j.Category.forcedLog(Category.java:391) [WARNING] at org.apache.log4j.Category.log(Category.java:856) [WARNING] at org.apache.commons.logging.impl.Log4JLogger.warn(Log4JLogger.java:222) [WARNING] at org.eclipse.emf.mwe.utils.GenModelHelper.registerGenModel(GenModelHelper.java:70) [WARNING] at org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment.getSaveAndReconcileGenModel(EcoreGeneratorFragment.java:587) [WARNING] at org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment.generate(EcoreGeneratorFragment.java:182) [WARNING] at org.eclipse.xtext.generator.CompositeGeneratorFragment.generate(CompositeGeneratorFragment.java:81) [WARNING] at org.eclipse.xtext.generator.LanguageConfig.generate(LanguageConfig.java:69) [WARNING] at org.eclipse.xtext.generator.Generator.generate(Generator.java:351) [WARNING] at org.eclipse.xtext.generator.Generator.invokeInternal(Generator.java:125) [WARNING] at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126) [WARNING] at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34) [WARNING] at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201) [WARNING] at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:35) [WARNING] at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19) [WARNING] at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:97) [WARNING] at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:73) [WARNING] at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:76) [WARNING] at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35)