I didn’t get an attachment. I believe the mailing list manager strips attachments.
Ralph > On Aug 19, 2016, at 1:52 PM, Bill Okara <billok...@gmail.com> wrote: > > 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 > <mailto: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 >>> <mailto: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> <mailto: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> <mailto:billok...@gmail.com >>>> <mailto:billok...@gmail.com>>> wrote: >>>> >>>>> Thanks, Gary, >>>>> >>>>> you're probably right, the log in log.info <http://log.info/> >>>>> <http://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> <mailto: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/> <http://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> <mailto: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> <mailto: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> <mailto: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 >>>>>>> <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> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | >>>>>> ggreg...@apache.org <mailto:ggreg...@apache.org> >>>>>> Java Persistence with Hibernate, Second Edition >>>>>> <http://www.manning.com/bauer3/ <http://www.manning.com/bauer3/>> >>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/ >>>>>> <http://www.manning.com/tahchiev/>> >>>>>> Spring Batch in Action <http://www.manning.com/templier/ >>>>>> <http://www.manning.com/templier/>> >>>>>> Blog: http://garygregory.wordpress.com >>>>>> <http://garygregory.wordpress.com/> >>>>>> Home: http://garygregory.com/ <http://garygregory.com/> >>>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory> >>>>> >>>>> --------------------------------------------------------------------- >>>>> 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> >>>>> >>>>> >>>> >>>> >>>> -- >>>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | >>>> ggreg...@apache.org <mailto:ggreg...@apache.org> >>>> Java Persistence with Hibernate, Second Edition >>>> <http://www.manning.com/bauer3/ <http://www.manning.com/bauer3/>> >>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/ >>>> <http://www.manning.com/tahchiev/>> >>>> Spring Batch in Action <http://www.manning.com/templier/ >>>> <http://www.manning.com/templier/>> >>>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> >>>> Home: http://garygregory.com/ <http://garygregory.com/> >>>> Tweet! http://twitter.com/GaryGregory <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> >>> <mailto: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> >>> <mailto:log4j-user-h...@logging.apache.org >>> <mailto:log4j-user-h...@logging.apache.org>> > > --------------------------------------------------------------------- > 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>