Hi Gary,

actually the full stack was attached in that email already, please let
me know if you can't find them...
(Attachments: stacktrace_webinf.txt (5 kb)   stacktrace_tomcatlib.txt (7 kb) )

Yeah, that's kinda my understanding (or guess) too. That is, by
putting the log related jars in tomcat/lib, when the initializing the
log4j2.xml, it's trying to initialize the KafkaAppender, whose jars
are in tomcat/lib, thus it's trying to initialize the log4j config for
that context.

I was able to hack/workaround the issue by adding a log4j2-test.xml in
WEB-INF/classes, and not using the KafkaAppender in the
log4j2-test.xml. In that case, when initializing for tomcat/lib, the
log4j2-test.xml got picked up before the log4j2.xml, and that kinda
avoided the problem.

But the caveat is that no longer can use KafkaAppender for anything
logged by jars in tomcat/lib...

I guess KafkaAppender is a special case that it's using a jar that
also uses SLF4j/log4j logs.

By having the jars in tomcat/lib seems like pretty clean for webapps
to share same logging implementation and use their specific config.
but not sure how to better workaround / resolve the issue without
limiting all jars in tomcat/lib to not using KafkaAppender in this
case.

comments?


Thanks!
Bill


On Fri, Aug 19, 2016 at 1:07 PM, Ralph Goers <ralph.go...@dslextreme.com> wrote:
> I have a suspicion the key part of the stack trace isn’t included.  I am 
> guessing that the code that causes the first call to the Kafka appender is in 
> your web app.  This causes the ClassLoaderContextSelector to initialize Log4j 
> for the web app ClassLoader. Kafka itself is in tomcat/lib. When it logs it 
> causes Log4j to initialize for the tomcat/lib ClassLoader.  That is why you 
> see the second LoggerContext start.
>
> However, I would really like to see the stack frames just below where you 
> stopped to see what is causing the initial Log4j initialization.
>
> Ralph
>
>
>
>> On Aug 19, 2016, at 11:17 AM, Bill Okara <billok...@gmail.com> wrote:
>>
>> thanks for guiding me through this, Gary!
>>
>> Attached are 2 stack dumps, one is with the log related jars packaged
>> in WEB-INF/lib, the other is having the jars provided in tomcat/lib,
>> and below are what I noticed; that is,
>> in WEB-INF/lib case, when initializing the
>> private static final Logger log = 
>> LoggerFactory.getLogger(KafkaProducer.class);
>>
>> the getLogger seemed returned a logger right the way, vs in tomcat/lib
>> case, it's trying to go through the getContext etc init stack, which
>> in turn hit the KafkaProducer.java:188 again and had the NULL log at
>> that case...
>>
>> comments?
>>
>> In WEB-INF/lib:
>> at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:346)
>> at 
>> org.apache.kafka.clients.producer.ProducerConfig.<clinit>(ProducerConfig.java:220)
>> at 
>> org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:188)
>> at 
>> org.apache.logging.log4j.core.appender.mom.kafka.DefaultKafkaProducerFactory.newKafkaProducer(DefaultKafkaProducerFactory.java:29)
>>
>> In tomcat/lib:
>> at 
>> org.apache.kafka.clients.producer.ProducerConfig.<clinit>(ProducerConfig.java:220)
>> at 
>> org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:188)
>> at 
>> org.apache.logging.log4j.core.appender.mom.kafka.DefaultKafkaProducerFactory.newKafkaProducer(DefaultKafkaProducerFactory.java:29)
>> at 
>> org.apache.logging.log4j.core.appender.mom.kafka.KafkaManager.startup(KafkaManager.java:86)
>> at 
>> org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.start(KafkaAppender.java:96)
>> at 
>> org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:247)
>> at 
>> org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:496)
>> at 
>> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:566)
>> at 
>> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:582)
>> at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:217)
>> at 
>> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152)
>> at 
>> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
>> at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
>> at 
>> org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:103)
>> at 
>> org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:43)
>> at 
>> org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:42)
>> at 
>> org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
>> at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
>> at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
>> at 
>> org.apache.kafka.clients.producer.KafkaProducer.<clinit>(KafkaProducer.java:131)
>> at 
>> org.apache.logging.log4j.core.appender.mom.kafka.DefaultKafkaProducerFactory.newKafkaProducer(DefaultKafkaProducerFactory.java:29)
>>
>>
>>
>> Thanks,
>> Bill
>>
>>
>> On Fri, Aug 19, 2016 at 1:46 AM, Gary Gregory <garydgreg...@gmail.com 
>> <mailto:garydgreg...@gmail.com>> wrote:
>>> Hello Bill,
>>>
>>> What you could do is start the whole thing in a debugger and put a
>>> breakpoint
>>> in 
>>> org.apache.kafka.clients.producer.KafkaProducer.KafkaProducer(ProducerConfig,
>>> Serializer<K>, Serializer<V>) here:
>>>
>>>        } catch (Throwable t) {
>>>            // call close methods if internal objects are already
>>> constructed
>>>            // this is to prevent resource leak. see KAFKA-2121
>>> ---> BREAKPOINT            close(0, TimeUnit.MILLISECONDS, true);
>>>            // now propagate the exception
>>>            throw new KafkaException("Failed to construct kafka producer",
>>> t);
>>>        }
>>>
>>> This line 333 in the latest client.
>>>
>>> Then you can dump the exception on the console and tell us what it is
>>> because we are not seeing it in the log since the close method causes its
>>> own NPE.
>>>
>>> Finding what the Throwable is will be a lot.
>>>
>>> Gary
>>>
>>> On Thu, Aug 18, 2016 at 11:30 PM, Bill Okara <billok...@gmail.com 
>>> <mailto:billok...@gmail.com>> wrote:
>>>
>>>> Thanks, Gary,
>>>>
>>>> you're probably right, the log in log.info <http://log.info/> seems to be 
>>>> the culprit.
>>>>
>>>> By doing the 'trace' in log4j2.xml, it seems that the initialization
>>>> for the WebappClassLoader actually finished OK, but when initializing
>>>> for the Parent Classloader, it's when the NullPointerException
>>>> happened. Any idea why? or did the config in the previously attached
>>>> src look legit?
>>>>
>>>> Thanks!
>>>> Bill
>>>>
>>>> -------
>>>> 2016-08-19 00:00:28,569 localhost-startStop-1 DEBUG Configuration
>>>> XmlConfiguration[location=jndi:/localhost/log4j-appender/WEB-INF/classes/
>>>> log4j2.xml]
>>>> initialized
>>>> 2016-08-19 00:00:28,570 localhost-startStop-1 DEBUG Starting
>>>> configuration XmlConfiguration[location=jndi:/localhost/log4j-
>>>> appender/WEB-INF/classes/log4j2.xml]
>>>> 2016-08-19 00:00:28,579 localhost-startStop-1 DEBUG PluginManager
>>>> 'Converter' found 41 plugins
>>>> 2016-08-19 00:00:28,579 localhost-startStop-1 DEBUG Starting
>>>> OutputStreamManager SYSTEM_OUT.false.false-3
>>>> 2016-08-19 00:00:28,579 localhost-startStop-1 DEBUG Starting
>>>> LoggerContext[name=1f32e575,
>>>> org.apache.logging.log4j.core.LoggerContext@28b2955f]...
>>>> 2016-08-19 00:00:28,580 localhost-startStop-1 DEBUG Reconfiguration
>>>> started for context[name=1f32e575] at URI null
>>>> (org.apache.logging.log4j.core.LoggerContext@28b2955f) with optional
>>>> ClassLoader: null
>>>> 2016-08-19 00:00:28,580 localhost-startStop-1 DEBUG Using
>>>> configurationFactory
>>>> org.apache.logging.log4j.core.config.ConfigurationFactory$Factory@42223c17
>>>> 2016-08-19 00:00:28,580 localhost-startStop-1 TRACE Trying to find
>>>> [log4j2-test1f32e575.properties] using context class loader
>>>> WebappClassLoader
>>>>  context: /log4j-appender
>>>>  delegate: false
>>>>  repositories:
>>>>    /WEB-INF/classes/
>>>> ----------> Parent Classloader:
>>>> java.net.URLClassLoader@1f32e575
>>>> class loader.
>>>> 2016-08-19 00:00:28,598 localhost-startStop-1 TRACE Trying to find
>>>> [log4j2.jsn] using ClassLoader.getSystemResource().
>>>> 2016-08-19 00:00:28,599 localhost-startStop-1 TRACE Trying to find
>>>> [log4j2.xml] using context class loader WebappClassLoader
>>>>  context: /log4j-appender
>>>>  delegate: false
>>>>  repositories:
>>>>    /WEB-INF/classes/
>>>> ----------> Parent Classloader:
>>>> java.net.URLClassLoader@1f32e575
>>>> .
>>>> 2016-08-19 00:00:28,602 localhost-startStop-1 DEBUG Initializing
>>>> configuration XmlConfiguration[location=/opt/java/apache/apache-tomcat-
>>>> 7.0.70/webapps/log4j-appender/WEB-INF/classes/log4j2.xml]
>>>> 2016-08-19 00:00:28,603 localhost-startStop-1 DEBUG Installed script
>>>> engines
>>>> ...
>>>> 016-08-19 00:00:28,619 localhost-startStop-1 DEBUG Configuration
>>>> XmlConfiguration[location=/opt/java/apache/apache-tomcat-
>>>> 7.0.70/webapps/log4j-appender/WEB-INF/classes/log4j2.xml]
>>>> initialized
>>>> 2016-08-19 00:00:28,619 localhost-startStop-1 DEBUG Starting
>>>> configuration XmlConfiguration[location=/opt/java/apache/apache-tomcat-
>>>> 7.0.70/webapps/log4j-appender/WEB-INF/classes/log4j2.xml]
>>>> Aug 19, 2016 12:00:28 AM org.apache.catalina.core.ContainerBase
>>>> addChildInternal
>>>> SEVERE: ContainerBase.addChild: start:
>>>> org.apache.catalina.LifecycleException: Failed to start component
>>>> [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/log4j-
>>>> appender]]
>>>> at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153)
>>>> at org.apache.catalina.core.ContainerBase.addChildInternal(
>>>> ContainerBase.java:899)
>>>> at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
>>>> at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
>>>> at org.apache.catalina.startup.HostConfig.deployDirectory(
>>>> HostConfig.java:1260)
>>>> at org.apache.catalina.startup.HostConfig$DeployDirectory.
>>>> run(HostConfig.java:2002)
>>>> at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
>>>> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>>>> at java.util.concurrent.ThreadPoolExecutor.runWorker(
>>>> ThreadPoolExecutor.java:1142)
>>>> at java.util.concurrent.ThreadPoolExecutor$Worker.run(
>>>> ThreadPoolExecutor.java:617)
>>>> at java.lang.Thread.run(Thread.java:745)
>>>> Caused by: java.lang.ExceptionInInitializerError
>>>> at org.apache.logging.log4j.core.appender.mom.kafka.
>>>> DefaultKafkaProducerFactory.newKafkaProducer(DefaultKafkaProducerFactory.
>>>> java:29)
>>>> at org.apache.logging.log4j.core.appender.mom.kafka.KafkaManager.startup(
>>>> KafkaManager.java:86)
>>>> at org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.start(
>>>> KafkaAppender.java:96)
>>>> at org.apache.logging.log4j.core.config.AbstractConfiguration.
>>>> start(AbstractConfiguration.java:247)
>>>> at org.apache.logging.log4j.core.LoggerContext.setConfiguration(
>>>> LoggerContext.java:496)
>>>> at org.apache.logging.log4j.core.LoggerContext.start(
>>>> LoggerContext.java:249)
>>>> at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(
>>>> Log4jContextFactory.java:239)
>>>> at org.apache.logging.log4j.core.config.Configurator.
>>>> initialize(Configurator.java:157)
>>>> at org.apache.logging.log4j.web.Log4jWebInitializerImpl.initializeNonJndi(
>>>> Log4jWebInitializerImpl.java:167)
>>>> at org.apache.logging.log4j.web.Log4jWebInitializerImpl.start(
>>>> Log4jWebInitializerImpl.java:109)
>>>> at org.apache.logging.log4j.web.Log4jServletContainerInitializ
>>>> er.onStartup(Log4jServletContainerInitializer.java:57)
>>>> at org.apache.catalina.core.StandardContext.startInternal(
>>>> StandardContext.java:5604)
>>>> at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
>>>> ... 10 more
>>>> Caused by: java.lang.NullPointerException
>>>> at org.apache.kafka.clients.producer.KafkaProducer.close(
>>>> KafkaProducer.java:658)
>>>> at org.apache.kafka.clients.producer.KafkaProducer.<init>(
>>>> KafkaProducer.java:333)
>>>> at org.apache.kafka.clients.producer.KafkaProducer.<init>(
>>>> KafkaProducer.java:188)
>>>> -------------
>>>>
>>>> On Thu, Aug 18, 2016 at 5:40 PM, Gary Gregory <garydgreg...@gmail.com 
>>>> <mailto:garydgreg...@gmail.com>>
>>>> wrote:
>>>>> Based on the stack trace, it looks like the Slf4j logger in KafkaProducer
>>>>> is null:
>>>>>
>>>>>        log.info <http://log.info/>("Closing the Kafka producer with 
>>>>> timeoutMillis = {}
>>>> ms.",
>>>>> timeUnit.toMillis(timeout));
>>>>>
>>>>> It does not look like timeUnit can be null, so it must be log.
>>>>>
>>>>> The root problem of course if that we have an exception thrown in the
>>>>> KafkaProducer
>>>>> ctor.
>>>>>
>>>>> Gary
>>>>>
>>>>> On Thu, Aug 18, 2016 at 3:44 PM, Bill Okara <billok...@gmail.com 
>>>>> <mailto:billok...@gmail.com>> wrote:
>>>>>
>>>>>> tried again, seemed like the .out extension got filtered out by mail
>>>>>> server...
>>>>>>
>>>>>> On Thu, Aug 18, 2016 at 4:41 PM, Bill Okara <billok...@gmail.com 
>>>>>> <mailto:billok...@gmail.com>>
>>>> wrote:
>>>>>>> attach the catalina.out again, didn't seem to go through last time...
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Aug 18, 2016 at 4:33 PM, Bill Okara <billok...@gmail.com 
>>>>>>> <mailto:billok...@gmail.com>>
>>>> wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> When trying out the log4j2 Kafka appender, it works ok if all the
>>>>>>>> log4j2/kafka-client related jars are packaged in the webapp's
>>>>>>>> WEB-INF/lib, like:
>>>>>>>>
>>>>>>>>> ls WEB-INF/lib/
>>>>>>>> jackson-core-2.8.1.jar
>>>>>>>> log4j-core-2.6.2.jar
>>>>>>>> lz4-1.3.0.jar
>>>>>>>> kafka-clients-0.10.0.1.jar
>>>>>>>> log4j-slf4j-impl-2.6.2.jar
>>>>>>>> slf4j-api-1.7.21.jar
>>>>>>>> log4j-api-2.6.2.jar
>>>>>>>> log4j-web-2.6.2.jar
>>>>>>>> snappy-java-1.1.2.6.jar
>>>>>>>>
>>>>>>>>
>>>>>>>> But if the jars are provided in tomcat/lib (for all webapps), and
>>>> each
>>>>>>>> webapp will have its own log4j2.xml (as in attached war), then when
>>>>>>>> launching the webapp, will encounter:
>>>>>>>>
>>>>>>>> -----
>>>>>>>> Caused by: java.lang.NullPointerException
>>>>>>>>        at org.apache.kafka.clients.producer.KafkaProducer.close(
>>>>>> KafkaProducer.java:658)
>>>>>>>>        at org.apache.kafka.clients.producer.KafkaProducer.<init>(
>>>>>> KafkaProducer.java:333)
>>>>>>>>        at org.apache.kafka.clients.producer.KafkaProducer.<init>(
>>>>>> KafkaProducer.java:188)
>>>>>>>>        at org.apache.logging.log4j.core.appender.mom.kafka.
>>>>>> DefaultKafkaProducerFactory.newKafkaProducer(
>>>> DefaultKafkaProducerFactory.
>>>>>> java:29)
>>>>>>>>        at org.apache.logging.log4j.core.appender.mom.kafka.
>>>>>> KafkaManager.startup(KafkaManager.java:86)
>>>>>>>>        at org.apache.logging.log4j.core.appender.mom.kafka.
>>>>>> KafkaAppender.start(KafkaAppender.java:96)
>>>>>>>>        at org.apache.logging.log4j.core.
>>>> config.AbstractConfiguration.
>>>>>> start(AbstractConfiguration.java:247)
>>>>>>>>        at org.apache.logging.log4j.core.LoggerContext.
>>>>>> setConfiguration(LoggerContext.java:496)
>>>>>>>>        at org.apache.logging.log4j.core.LoggerContext.reconfigure(
>>>>>> LoggerContext.java:566)
>>>>>>>> ---------
>>>>>>>>
>>>>>>>> (full stack trace as in attached catalina.out)
>>>>>>>>
>>>>>>>>
>>>>>>>> To reproduce the error, simply:
>>>>>>>> 1) build the attached webapp, and deploy the output to tomcat/webapps
>>>>>>>> 2) move the WEB-INF/lib/*.jar to tomcat/lib (make sure WEB-INF/lib is
>>>>>>>> empty after move)
>>>>>>>> 3) start tomcat
>>>>>>>>
>>>>>>>> Tested with tomcat 7.0.70
>>>>>>>>
>>>>>>>> Anyone encounter similar problem? or is this a bug? (log4j2 or
>>>>>>>> kafka-client bug?)
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Bill
>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>>>>>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>>>>> Java Persistence with Hibernate, Second Edition
>>>>> <http://www.manning.com/bauer3/>
>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>> Blog: http://garygregory.wordpress.com
>>>>> Home: http://garygregory.com/
>>>>> Tweet! http://twitter.com/GaryGregory
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>>>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>>>>
>>>>
>>>
>>>
>>> --
>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>> <stacktrace_webinf.txt><stacktrace_tomcatlib.txt>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org 
>> <mailto:log4j-user-unsubscr...@logging.apache.org>
>> For additional commands, e-mail: log4j-user-h...@logging.apache.org 
>> <mailto:log4j-user-h...@logging.apache.org>

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-user-h...@logging.apache.org

Reply via email to