That log4j error appears to be from an expected spring configuration you have. org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:46)
You should look into that, it might be a something discovering log4j on the classpath (possibly in your mexp.jar) or from a forced configuration telling spring to always assume/start log4j based logging. Either way, you have to clean up your classpath and make sure that mexp.jar has no duplicates of classes from other jars. Mixing fat/uber jars with normal jars is possible, but rarely done, as it requires an intimate knowledge of *everything* in the fat/uber jar. -- Joakim Erdfelt <[email protected]> webtide.com <http://www.webtide.com/> - intalio.com/jetty Expert advice, services and support from from the Jetty & CometD experts eclipse.org/jetty - cometd.org On Wed, Sep 24, 2014 at 8:35 AM, Dunn, Barclay <[email protected]> wrote: > Thanks Joakim for this in-depth explanation. I have noticed the slf4j > binding conflict and have searched on that previously without success. I > think it occurs because mexp.jar, which contains all the code for my app, > expands into a temp dir that is a subdir of my main directory (to solve > another issue of needing a path visible to the app to contain my css, js, > and image files) so there are two copies of the same jar on the classpath. > I can't figure out if there is a way not to expand slf4j-jdk14.jar when > expanding mexp.jar - do you know? > > Furthermore ... I actually want to use the JDK logging implementation. > I'm including log4j because I got a runtime error saying this > (JettyWebApp.java:95 is the server.start() line in my jetty runner): > > WARNING: FAILED > o.e.j.w.WebAppContext@3af0ce45{/,file:/usr/local/mexp/resources/webapp/,STARTING}{file:/usr/local/mexp/mexp.jar}: > java.lang.NoClassDefFoundError: org/apache/log4j/xml/DOMConfigurator > java.lang.NoClassDefFoundError: org/apache/log4j/xml/DOMConfigurator > at > org.springframework.util.Log4jConfigurer.initLogging(Log4jConfigurer.java:69) > at > org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:153) > at > org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:46) > at > org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:798) > at > org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:444) > at > org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:789) > at > org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:294) > at > org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1341) > at > org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1334) > at > org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741) > at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:497) > at > org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) > at org.eclipse.jetty.server.Server.start(Server.java:380) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) > at > org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) > at org.eclipse.jetty.server.Server.doStart(Server.java:347) > at > org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) > at com.pronto.JettyWebApp.main(JettyWebApp.java:95) > Caused by: java.lang.ClassNotFoundException: > org.apache.log4j.xml.DOMConfigurator > at java.net.URLClassLoader$1.run(URLClassLoader.java:366) > ... > > From: Joakim Erdfelt <[email protected]> > Reply-To: JETTY user mailing list <[email protected]> > Date: Tuesday, September 23, 2014 at 6:17 PM > To: JETTY user mailing list <[email protected]> > Subject: Re: [jetty-users] Embedded Jetty + Logging - cannot log to file > > Typo... > > This: > slf4j-api.jar - the actual log4j api jar > > Should be: > slf4j-api.jar - the actual slf4j api jar > > > -- > Joakim Erdfelt <[email protected]> > webtide.com <http://www.webtide.com/> - intalio.com/jetty > Expert advice, services and support from from the Jetty & CometD experts > eclipse.org/jetty - cometd.org > > On Tue, Sep 23, 2014 at 3:13 PM, Joakim Erdfelt <[email protected]> > wrote: > >> Ooof. OK >> >> - <artifactId>slf4j-jdk14</artifactId> is for making slf4j >> output/emit jdk14 logging events. >> - mexp.jar is also an emitter of slf4j logging events (this is now an >> slf4j binding conflict) >> - jetty doesn't use log4j, it uses its own StdErrLog (emit to >> System.err), or Slf4jLog (if slf4j is present, emit to slf4j api), and can >> be configured for JavaUtilLog (emit to jdk14 logging api). >> - Since you have slf4j present on your classpath Jetty is likely >> using the Slf4jLog implementation internally. >> >> First things first, you have to understand how slf4j works. >> >> It has 2 basic features. >> >> 1. It can masquerade and be any (1..n) of the popular logging >> frameworks from the point of view of those APIs >> 2. It can route to any logging framework you want. This is called >> the binding layer. There can be only 1. Pick wisely. >> >> Now, if you want to capture everything, but only use log4j for actual "to >> file" management, you'll want the following. >> >> Your type 1 (masquerade) jars >> >> - jul-to-slf4j.jar - pretends to be a java.util.logging Logger >> (routes to slf4j) >> - jcl-over-slf4j.jar - pretends to be commons-logging (routes to >> slf4j) >> - slf4j-api.jar - the actual log4j api jar >> >> Your type 2 (binding) jar >> >> - slf4j-log4j.jar - slf4j routing to log4j implementation >> >> Your log file management jar >> >> - log4j.jar - the logging layer you seem to want to use >> >> Do this and you'll start to be able to configure your logging via >> log4j, no matter what class / library emitted the logging event. >> >> -- >> Joakim Erdfelt <[email protected]> >> webtide.com <http://www.webtide.com/> - intalio.com/jetty >> Expert advice, services and support from from the Jetty & CometD experts >> eclipse.org/jetty - cometd.org >> >> On Tue, Sep 23, 2014 at 1:31 PM, Dunn, Barclay <[email protected]> >> wrote: >> >>> Hello list, >>> >>> I'm using embedded Jetty and I want my application to log to a file. I >>> am okay with Jetty logging its output to stdout. I have a log4j.xml config >>> file that is clearly being imported but the app isn't heeding the >>> instructions in log4j.xml. >>> >>> Here's my embedded-Jetty runner (abridged): >>> >>> public static void main(String[] args) throws Exception { >>> >>> Server server = new Server(); >>> >>> // PARSE JSON INPUT >>> MEXPJsonProps mexpJsonProps = >>> ConfigurationManager.parseJsonInput(args[1]); >>> >>> // CREATE CONNECTORS >>> ... >>> // set the connectors >>> server.setConnectors(new Connector[] { http, httpAdmin }); >>> >>> Map<String, String> localConfiguration = >>> mexpJsonProps.getLocalConfiguration(); >>> >>> // CREATE CONTEXT >>> WebAppContext context = new WebAppContext(); >>> context.setContextPath("/"); >>> >>> ProtectionDomain domain = >>> JettyWebApp.class.getProtectionDomain(); >>> URL location = domain.getCodeSource().getLocation(); >>> context.setWar(location.toExternalForm()); >>> >>> context.setDescriptor(location.toExternalForm() + >>> "/WEB-INF/web.xml"); >>> >>> // SET UP JSP CONFIGS >>> ... >>> >>> System.setProperty("java.util.logging.config.file", >>> "log4j.xml"); >>> >>> // Set the handler >>> server.setHandler(context); >>> >>> server.start(); >>> server.join(); >>> } >>> >>> Here's the log4j.xml file. I'm using a very simple one to start: >>> >>> <?xml version="1.0" encoding="UTF-8" ?> >>> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> >>> <log4j:configuration debug="true" >>> xmlns:log4j='http://jakarta.apache.org/log4j/'> >>> >>> <appender name="file" class="org.apache.log4j.RollingFileAppender"> >>> <param name="append" value="false" /> >>> <param name="maxFileSize" value="10KB" /> >>> <param name="maxBackupIndex" value="5" /> >>> <param name="file" value="/usr/local/mexp/logs/mexp.service.log" /> >>> <layout class="org.apache.log4j.PatternLayout"> >>> <param name="ConversionPattern" >>> value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> >>> </layout> >>> </appender> >>> >>> <root> >>> <level value="ERROR" /> >>> <appender-ref ref="file" /> >>> </root> >>> </log4j:configuration> >>> >>> I'm using slf4j via JDK logger: >>> >>> <dependency> >>> <groupId>org.slf4j</groupId> >>> <artifactId>slf4j-jdk14</artifactId> >>> <version>1.7.7</version> >>> <exclusions> >>> <exclusion> >>> <groupId>org.slf4j</groupId> >>> <artifactId>slf4j-api</artifactId> >>> </exclusion> >>> </exclusions> >>> </dependency> >>> <dependency> >>> <groupId>org.slf4j</groupId> >>> <artifactId>slf4j-api</artifactId> >>> <version>1.7.7</version> >>> </dependency> >>> >>> Nothing is being appended to the file I've specified. I know the app >>> is parsing log4j.xml, because previously I had an incorrect path to the >>> logging output file in log4j.xml and the app complained (to stdout). >>> >>> Here's the first lines of logging output: >>> >>> hackintosh:mexp barclayadunn$ java -XX:+UseConcMarkSweepGC >>> -XX:PermSize=64M -XX:MaxPermSize=256M -Xms1G -Xmx1G >>> -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -jar >>> /usr/local/mexp/mexp.jar server /usr/local/mexp/mexp.json >>> >>> Sep 23, 2014 4:16:52 PM org.eclipse.jetty.util.log.Log initialized >>> >>> INFO: Logging initialized @65ms >>> >>> Sep 23, 2014 4:16:52 PM org.eclipse.jetty.server.Server doStart >>> >>> INFO: jetty-9.2.z-SNAPSHOT >>> >>> Sep 23, 2014 4:17:19 PM >>> org.eclipse.jetty.server.handler.ContextHandler$Context log >>> >>> INFO: Set web app root system property: 'webapp.root' = >>> [/usr/local/mexp/resources/webapp] >>> >>> Sep 23, 2014 4:17:20 PM >>> org.eclipse.jetty.server.handler.ContextHandler$Context log >>> >>> INFO: Initializing log4j from >>> [/usr/local/mexp/resources/webapp/WEB-INF/log4j.xml] >>> >>> log4j: reset attribute= "false". >>> >>> log4j: Threshold ="null". >>> >>> log4j: Level value for root is [ERROR]. >>> >>> log4j: root level set to ERROR >>> >>> log4j: Class name: [org.apache.log4j.RollingFileAppender] >>> >>> log4j: Setting property [append] to [false]. >>> >>> log4j: Setting property [maxFileSize] to [10KB]. >>> >>> log4j: Setting property [maxBackupIndex] to [5]. >>> >>> log4j: Setting property [file] to >>> [/usr/local/mexp/logs/mexp.service.log]. >>> >>> log4j: Parsing layout of class: "org.apache.log4j.PatternLayout" >>> >>> log4j: Setting property [conversionPattern] to [%d{yyyy-MM-dd HH:mm:ss} >>> %-5p %c{1}:%L - %m%n]. >>> >>> log4j: setFile called: /usr/local/mexp/logs/mexp.service.log, false >>> >>> log4j: setFile ended >>> >>> log4j: Adding appender named [file] to category [root]. >>> >>> Sep 23, 2014 4:17:20 PM >>> org.eclipse.jetty.server.handler.ContextHandler$Context log >>> >>> INFO: Initializing Spring root WebApplicationContext >>> >>> SLF4J: Class path contains multiple SLF4J bindings. >>> >>> SLF4J: Found binding in >>> [jar:file:/usr/local/mexp/resources/webapp/WEB-INF/lib/slf4j-jdk14-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class] >>> >>> SLF4J: Found binding in >>> [jar:file:/usr/local/mexp/mexp.jar!/org/slf4j/impl/StaticLoggerBinder.class] >>> >>> SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an >>> explanation. >>> >>> SLF4J: Actual binding is of type [org.slf4j.impl.JDK14LoggerFactory] >>> >>> Sep 23, 2014 4:17:20 PM com.rc.util.logging.RCLog info >>> >>> INFO: Entering initialization >>> >>> Sep 23, 2014 4:17:20 PM com.pronto.common.util.FileUtil getInputStream >>> >>> INFO: -> Found /WEB-INF/log4j.xml in resource bundle >>> >>> Sep 23, 2014 4:17:20 PM com.rc.util.logging.RCLog info >>> >>> INFO: Exiting initialization >>> >>> Sep 23, 2014 4:17:20 PM com.pronto.common.util.FileUtil getInputStream >>> >>> INFO: -> Found /mpds.properties in resource bundle >>> >>> Sep 23, 2014 4:17:21 PM com.rc.util.logging.RCLog info >>> >>> INFO: Entering servlet init. >>> >>> Sep 23, 2014 4:17:21 PM org.quartz.impl.StdSchedulerFactory instantiate >>> >>> INFO: Using default implementation for ThreadExecutor >>> >>> Sep 23, 2014 4:17:21 PM org.quartz.core.SchedulerSignalerImpl <init> >>> >>> INFO: Initialized Scheduler Signaller of type: class >>> org.quartz.core.SchedulerSignalerImpl >>> >>> Sep 23, 2014 4:17:21 PM org.quartz.core.QuartzScheduler <init> >>> >>> INFO: Quartz Scheduler v.2.2.1 created. >>> >>> Sep 23, 2014 4:17:21 PM >>> org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin initialize >>> >>> INFO: Registering Quartz Job Initialization Plug-in. >>> >>> Sep 23, 2014 4:17:21 PM org.quartz.simpl.RAMJobStore initialize >>> >>> INFO: RAMJobStore initialized. >>> >>> Sep 23, 2014 4:17:21 PM org.quartz.core.QuartzScheduler initialize >>> >>> INFO: Scheduler meta-data: Quartz Scheduler (v2.2.1) 'MexpScheduler' >>> with instanceId 'dev' >>> >>> Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. >>> >>> NOT STARTED. >>> >>> Currently in standby mode. >>> >>> Number of jobs executed: 0 >>> >>> Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 5 threads. >>> >>> Using job-store 'org.quartz.simpl.RAMJobStore' - which does not >>> support persistence. and is not clustered. >>> >>> >>> Sep 23, 2014 4:17:21 PM org.quartz.impl.StdSchedulerFactory instantiate >>> >>> INFO: Quartz scheduler 'MexpScheduler' initialized from an externally >>> provided properties instance. >>> >>> Sep 23, 2014 4:17:21 PM org.quartz.impl.StdSchedulerFactory instantiate >>> >>> INFO: Quartz scheduler version: 2.2.1 >>> >>> Sep 23, 2014 4:17:21 PM org.quartz.xml.XMLSchedulingDataProcessor >>> processFile >>> >>> INFO: Parsing XML file: mexp-dev-jobs.xml with systemId: >>> mexp-dev-jobs.xml >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding 13 jobs, 13 triggers. >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: skuLevelBiddingReportGroup.skuLevelBiddingReportJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: emailNotificationsGroup.emailNotificationsJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: balanceReplenishmentGroup.balanceReplenishmentJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: >>> balanceReplenishmentCappedInvoiceGroup.balanceReplenishmentCappedInvoiceJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: merchantTxnProcessingGroup.merchantTxnProcessingJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: feedFileManagerGroup.feedFileManagerJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: merchantPaymentManagerGroup.merchantPaymentManagerJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Replacing job: merchantTxnProcessingGroup.merchantTxnProcessingJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: expiredAccountUpdaterGroup.expiredAccountUpdaterJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: >>> placementsForDatasyncUpdaterGroup.placementsForDatasyncUpdaterJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: >>> placementPaymentProcessingGroup.placementPaymentProcessingJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: >>> switchingMerchantsToInvoiceGroup.switchingMerchantsToInvoiceJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.xml.XMLSchedulingDataProcessor >>> scheduleJobs >>> >>> INFO: Adding job: toggleActiveStateGroup.toggleActiveStateJob >>> >>> Sep 23, 2014 4:17:22 PM org.quartz.core.QuartzScheduler start >>> >>> INFO: Scheduler MexpScheduler_$_dev started. >>> >>> Sep 23, 2014 4:17:22 PM org.eclipse.jetty.server.handler.ContextHandler >>> doStart >>> >>> INFO: Started o.e.j.w.WebAppContext@6783e43b >>> {/,file:/usr/local/mexp/resources/webapp/,AVAILABLE}{file:/usr/local/mexp/mexp.jar} >>> >>> Sep 23, 2014 4:17:22 PM >>> org.quartz.plugins.history.LoggingTriggerHistoryPlugin triggerFired >>> >>> INFO: Trigger >>> JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml >>> fired job >>> JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml >>> at: 16:17:22 09/23/2014 >>> >>> Sep 23, 2014 4:17:22 PM >>> org.quartz.plugins.history.LoggingJobHistoryPlugin jobToBeExecuted >>> >>> INFO: Job >>> JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml >>> fired (by trigger >>> JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml) >>> at: 16:17:22 09/23/2014 >>> >>> Sep 23, 2014 4:17:22 PM >>> org.quartz.plugins.history.LoggingJobHistoryPlugin jobWasExecuted >>> >>> INFO: Job >>> JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml >>> execution complete at 16:17:22 09/23/2014 and reports: null >>> >>> Sep 23, 2014 4:17:22 PM >>> org.quartz.plugins.history.LoggingTriggerHistoryPlugin triggerComplete >>> >>> INFO: Trigger >>> JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml >>> completed firing job >>> JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml >>> at 16:17:22 09/23/2014 with resulting trigger instruction code: DO NOTHING >>> >>> Sep 23, 2014 4:17:22 PM org.eclipse.jetty.server.AbstractConnector >>> doStart >>> >>> INFO: Started ServerConnector@1c6c0838{HTTP/1.1}{0.0.0.0:8080} >>> >>> Sep 23, 2014 4:17:22 PM org.eclipse.jetty.server.AbstractConnector >>> doStart >>> >>> INFO: Started ServerConnector@3cdd9094{HTTP/1.1}{0.0.0.0:8081} >>> >>> Sep 23, 2014 4:17:22 PM org.eclipse.jetty.server.Server doStart >>> >>> INFO: Started @30257ms >>> >>> ... >>> >>> (further activity in the web app results in logging appended to stdout >>> after this) >>> >>> >>> I see lines at the start about org.eclipse.jetty.util.log.Log. I don't >>> know what this is but I definitely don't want it to override my preferences. >>> >>> >>> Any help would be appreciated. Ideally I'd prefer nothing logged to >>> stdout other than embedded Jetty's initial startup. >>> >>> >>> Thanks, >>> >>> Barclay >>> >>> >>> >>> _______________________________________________ >>> jetty-users mailing list >>> [email protected] >>> To change your delivery options, retrieve your password, or unsubscribe >>> from this list, visit >>> https://dev.eclipse.org/mailman/listinfo/jetty-users >>> >> >> > > _______________________________________________ > jetty-users mailing list > [email protected] > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://dev.eclipse.org/mailman/listinfo/jetty-users >
_______________________________________________ jetty-users mailing list [email protected] To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/jetty-users
