[
https://issues.apache.org/jira/browse/LOG4J2-461?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13939771#comment-13939771
]
Ronko commented on LOG4J2-461:
------------------------------
Hi guys, ok, have studied this immensely and the log4j2 source code, and
believe I have found the issue with log4j2. LOG4J2-460 is directly related but
I do not believe they are same issue. One causes the other.
We are trying to use AWS SWF FLow Framework. SWF flow runs annotation
processor, which uses Freemarker, which is coded to log4j 1.x API. With the
log4j1.2 api from log4j2, that should theoretically be fine, but read on.
TWO PROBLEMS
1) Log 4j2 CORE (only, apis are fine) will not load under some circumstances
(such as from maven plugin reactor).
2) There are class cast code bugs in log4j2 code that are trying to cast wrong
incompatible types. Details follow.
First, on 1)...
First issue: log4j2 core (ONLY) cannot be found or loaded under some
circumstances. Log4j2 api and log4j1.2 api load fine under all circumstances I
have found. I have gone through direct coding against core, forcing it via
classpath, maven dependency, plugin dependency, (including system dependency),
i have even written my own instance of
org.apache.logging.log4j.spi.LoggerContextFactory, passed it in via system
properly via properties-maven-plugin:set-system-properties:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>set-system-properties</goal>
</goals>
<configuration>
<properties>
<property>
<name>log4j2.loggerContextFactory</name>
<value>com.myco.common.commons.log.HackLogContextFactory</value>
</property>
</properties>
</configuration>
</execution>
</executions>
</plugin>
Then I run maven-compiler-plugin (or maven processor plugin, both fail
identically) WITH annotation processing. maven-compiler-plugin:compile then
runs with proc jvm arg enabled. The APT annotation processor code in the AWS
SKJ jar is found, and runs. It uses freemarker for templating.
Log4j2-1.2 api IS found, tries to load. It cannot find core, both are right
beside each other in dependencies. No power I have found can cause it to find
it.
There must be a class loader conflict or class loading issue. So the following
outputs:
>ERROR StatusLogger Unable to locate a logging implementation, using
>SimpleLogger
NOW is bug #2! SimpleLogger, LoggerContext, and SimpleLoggerContext, possibly
others are coded across packages to cast the wrong types, it seems. When
log4j2-1.2 API tries to load logging, it itself throws a class cast at
org.apache.log4j.Logger.getLogger(Logger.java:39):
Caused by: java.lang.ExceptionInInitializerError
at freemarker.ext.beans.BeansWrapper.<clinit>(BeansWrapper.java:147)
at freemarker.template.ObjectWrapper.<clinit>(ObjectWrapper.java:81)
at freemarker.core.Configurable.<init>(Configurable.java:161)
at freemarker.template.Configuration.<init>(Configuration.java:195)
at freemarker.template.Configuration.<clinit>(Configuration.java:172)
at
com.amazonaws.eclipse.simpleworkflow.asynchrony.freemarker.ActivitiesCodeGenerator.getConfiguration(ActivitiesCodeGenerator.java:49)
at
com.amazonaws.eclipse.simpleworkflow.asynchrony.freemarker.ActivitiesCodeGenerator.generate(ActivitiesCodeGenerator.java:97)
at
com.amazonaws.eclipse.simpleworkflow.asynchrony.freemarker.ActivitiesCodeGenerator.generateActivitiesClientInterface(ActivitiesCodeGenerator.java:85)
at
com.amazonaws.eclipse.simpleworkflow.asynchrony.freemarker.ActivitiesCodeGenerator.generateCode(ActivitiesCodeGenerator.java:79)
at
com.amazonaws.eclipse.simpleworkflow.asynchrony.annotationprocessor.AsynchronyDeciderAnnotationProcessor.processActivities(AsynchronyDeciderAnnotationProcessor.java:120)
at
com.amazonaws.eclipse.simpleworkflow.asynchrony.annotationprocessor.AsynchronyDeciderAnnotationProcessor.process(AsynchronyDeciderAnnotationProcessor.java:64)
at
com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:793)
at
com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:722)
at
com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1700(JavacProcessingEnvironment.java:97)
at
com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1029)
at
com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1163)
at
com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1108)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:824)
at com.sun.tools.javac.main.Main.compile(Main.java:439)
... 26 more
Caused by: java.lang.ClassCastException:
org.apache.logging.log4j.simple.SimpleLoggerContext cannot be cast to
org.apache.logging.log4j.core.LoggerContext
at org.apache.log4j.Logger.getLogger(Logger.java:39)
at
freemarker.log._Log4JLoggerFactory.getLogger(_Log4JLoggerFactory.java:67)
at freemarker.log.Logger.getLogger(Logger.java:284)
at
freemarker.template.utility.SecurityUtilities.<clinit>(SecurityUtilities.java:66)
Here is why: SimpleLoggerContext (being run because CORE could not be found),
extends:
org.apache.logging.log4j.spi.LoggerContext
But LOOK!
The class that Logger.java:39 tries to cast it to is of type:
org.apache.logging.log4j.core.LoggerContext
!!!!DIFFERENT!!!
Note the "spi" versus "core" in the package.
This causes the stack dump above.
THis same problem can be found elsewhere. When implemented my own
HackLogContextFactory and passed it in via system prop, I got this:
ERROR StatusLogger org.apache.logging.log4j.core.impl.Log4jContextFactory does
not implement org.apache.logging.log4j.spi.LoggerContextFactory
Again, types being cast to the wrong types.
> ERROR StatusLogger Unable to locate a logging implementation, using
> SimpleLogger
> ---------------------------------------------------------------------------------
>
> Key: LOG4J2-461
> URL: https://issues.apache.org/jira/browse/LOG4J2-461
> Project: Log4j 2
> Issue Type: Bug
> Components: API
> Affects Versions: 2.0-beta9
> Environment: Android
> Reporter: Gaurav Kapoor
> Priority: Blocker
>
> ERROR StatusLogger Unable to locate a logging implementation, using
> SimpleLogger
> Code:
> Logger LOG = LogManager.getLogger(MainActivity.class);
> LOG.error("Test Log4j2");
> {code}
> <?xml version="1.0" encoding="UTF-8"?>
> <Configuration>
> <Appenders>
> <Console name="STDOUT" target="SYSTEM_OUT">
> <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
> </Console>
> </Appenders>
> <Loggers>
> <Logger name="hello" level="info"/>
> <Root level="trace">
> <AppenderRef ref="STDOUT"/>
> </Root>
> </Loggers>
> </Configuration>
> {code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]