2014-09-25 73 views
2

我有一个使用嵌入式Jetty的应用程序。一切都很好,除了伐木。我现在正在尝试使用logback,但正在发生致命错误。使用嵌入式Jetty无法使日志记录正常工作

的应用程序加载时,你可以看到:

$ 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 
10:46:02.093 [main] DEBUG org.eclipse.jetty.util.log - Logging to Logger[org.eclipse.jetty.util.log] via org.eclipse.jetty.util.log.Slf4jLog 
10:46:02.098 [main] INFO org.eclipse.jetty.util.log - Logging initialized @76ms 

其次是页面和描述我的应用程序每一个类装载调试语句的网页。这表明它没有找到logback.xml,我已经将org.eclipse.jetty的日志级别设置为ERROR。

最终,我得到以下异常时,应用程序加载:

10:46:30.349 [main] DEBUG o.e.jetty.webapp.WebAppClassLoader - loaded class org.slf4j.impl.StaticLoggerBinder from [email protected] 
10:46:30.354 [main] WARN o.e.j.u.component.AbstractLifeCycle - FAILED [email protected]{/,file:/usr/local/mexp/resources/webapp/,STARTING}{file:/usr/local/mexp/mexp.jar}: java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/eclipse/jetty/webapp/WebAppClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type LoggerFactory; used in the signature 
java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/eclipse/jetty/webapp/WebAppClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type LoggerFactory; used in the signature 
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:306) ~[mexp.jar:na] 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276) ~[mexp.jar:na] 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:288) ~[mexp.jar:na] 
    at com.rc.util.logging.RCLog.<init>(RCLog.java:28) ~[mexp.jar:na] 
    at com.rc.commonwebapp.servlet.filter.SessionTXManager.<init>(SessionTXManager.java:43) ~[na:na] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.7.0_45] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[na:1.7.0_45] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_45] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_45] 
    at java.lang.Class.newInstance(Class.java:374) ~[na:1.7.0_45] 
    at org.eclipse.jetty.server.handler.ContextHandler$Context.createInstance(ContextHandler.java:2370) ~[mexp.jar:na] 
    at org.eclipse.jetty.servlet.ServletContextHandler$Context.createFilter(ServletContextHandler.java:1146) ~[mexp.jar:na] 
    at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:120) ~[mexp.jar:na] 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:850) ~[mexp.jar:na] 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298) ~[mexp.jar:na] 
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1341) ~[mexp.jar:na] 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1334) ~[mexp.jar:na] 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741) ~[mexp.jar:na] 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:497) ~[mexp.jar:na] 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [mexp.jar:na] 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) [mexp.jar:na] 
    at org.eclipse.jetty.server.Server.start(Server.java:380) [mexp.jar:na] 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) [mexp.jar:na] 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) [mexp.jar:na] 
    at org.eclipse.jetty.server.Server.doStart(Server.java:347) [mexp.jar:na] 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [mexp.jar:na] 
    at com.pronto.JettyWebApp.main(JettyWebApp.java:95) [mexp.jar:na] 

java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/eclipse/jetty/webapp/WebAppClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type LoggerFactory; used in the signature 
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:306) ~[mexp.jar:na] 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276) ~[mexp.jar:na] 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:288) ~[mexp.jar:na] 
    at com.rc.util.logging.RCLog.<init>(RCLog.java:28) ~[mexp.jar:na] 
    at com.rc.commonwebapp.servlet.filter.SessionTXManager.<init>(SessionTXManager.java:43) ~[na:na] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.7.0_45] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[na:1.7.0_45] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_45] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_45] 
    at java.lang.Class.newInstance(Class.java:374) ~[na:1.7.0_45] 
    at org.eclipse.jetty.server.handler.ContextHandler$Context.createInstance(ContextHandler.java:2370) ~[mexp.jar:na] 
    at org.eclipse.jetty.servlet.ServletContextHandler$Context.createFilter(ServletContextHandler.java:1146) ~[mexp.jar:na] 
    at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:120) ~[mexp.jar:na] 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:850) ~[mexp.jar:na] 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298) ~[mexp.jar:na] 
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1341) ~[mexp.jar:na] 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1334) ~[mexp.jar:na] 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741) ~[mexp.jar:na] 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:497) ~[mexp.jar:na] 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[mexp.jar:na] 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) ~[mexp.jar:na] 
    at org.eclipse.jetty.server.Server.start(Server.java:380) ~[mexp.jar:na] 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) ~[mexp.jar:na] 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) ~[mexp.jar:na] 
    at org.eclipse.jetty.server.Server.doStart(Server.java:347) ~[mexp.jar:na] 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[mexp.jar:na] 
    at com.pronto.JettyWebApp.main(JettyWebApp.java:95) [mexp.jar:na] 
Exception in thread "main" java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/eclipse/jetty/webapp/WebAppClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type LoggerFactory; used in the signature 
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:306) 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276) 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:288) 
    at com.rc.util.logging.RCLog.<init>(RCLog.java:28) 
    at com.rc.commonwebapp.servlet.filter.SessionTXManager.<init>(SessionTXManager.java:43) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at java.lang.Class.newInstance(Class.java:374) 
    at org.eclipse.jetty.server.handler.ContextHandler$Context.createInstance(ContextHandler.java:2370) 
    at org.eclipse.jetty.servlet.ServletContextHandler$Context.createFilter(ServletContextHandler.java:1146) 
    at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:120) 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:850) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298) 
    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) 

一些网络上搜索java.lang.LinkageError的建议,Jetty和我的应用程序有不同的类在尝试加载LoggerFactory时发生冲突的加载器。我不确定接下来要做什么。

ETA: 每@ PavelHoral的建议我加入<scope>provided</scope>我的pom.xml(dependencyManagement部分),但在这个结果时,我尝试启动应用程序:

2014-09-28 16:47:42.491:INFO::main: Logging initialized @66ms 
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 
    at com.rc.util.config.ConfigurationManager.<clinit>(ConfigurationManager.java:31) 
    at com.pronto.JettyWebApp.main(JettyWebApp.java:39) 
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 2 more 

ETA:由每建议@ HD1我添加了桥,它摆脱了LinkageError,所以我们在那里。我仍然因为所有的日志记录转到stdout而仍然处于DEBUG级别这一事实 - 对于产品环境来说当然是不可接受的,所以我需要能够配置它。这是我的logback.xml:

<configuration> 
    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
     <file>/usr/local/mexp/logs/mexp.service.log</file> 
     <encoder> 
      <pattern>"%-5p [%d{dd-MMM-yy HH:mm:ss}] [%t] %-20c %-3x:%m%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="AXIS" class="ch.qos.logback.core.FileAppender"> 
     <file>/usr/local/mexp/logs/axis.log</file> 
     <encoder> 
      <pattern>%-5p [%d{dd-MMM-yy HH:mm:ss}] :%m%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
     <!-- The default pattern: Date Priority [Category] Message\n --> 
     <encoder> 
      <pattern>%d{ABSOLUTE} %-5p [%c{1}] %m%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> 
     <appender-ref ref="AXIS"/> 
    </appender> 

    <logger name="org.apache"> 
     <level value="ERROR"/> 
    </logger> 

    <logger name="org.quartz"> 
     <level value="ERROR" /> 
    </logger> 

    <logger name="org.hibernate"> 
     <level value="ERROR" /> 
    </logger> 

    <logger name="org.apache.struts.action"> 
     <level value="INFO"/> 
    </logger> 

    <logger name="org.apache.catalina.cluster"> 
     <level value="INFO"/> 
    </logger> 

    <logger name="org"> 
     <level value="ERROR" /> 
    </logger> 

    <logger name="net"> 
     <level value="ERROR" /> 
    </logger> 

    <logger name="org.apache.axis.transport.http.HTTPSender" additivity="false"> 
     <level value="ERROR"/> 
     <appender-ref ref="ASYNC"/> 
    </logger> 

    <logger name="com.mchange"> 
     <level value="ERROR"/> 
    </logger> 

    <!-- this silences the HttpClient chatter that starts with "httpclient.wire.header" and "httpclient.wire.content" --> 
    <logger name="org.apache.commons.httpclient"> 
     <level value="fatal"/> 
    </logger> 
    <logger name="httpclient.wire.header"> 
     <level value="fatal"/> 
    </logger> 
    <logger name="httpclient.wire.content"> 
     <level value="fatal"/> 
    </logger> 

    <logger name="org.eclipse.jetty"> 
     <level value="ERROR"/> 
    </logger> 

    <!-- Log the real SQL --> 
    <logger name="org.hibernate.SQL"> 
     <level value="ERROR"/> 
    </logger> 

    <root level="ERROR"> 
     <appender-ref ref="FILE"/> 
    </root> 
</configuration> 

ETA:我还试图记录分离描述here - 将此添加到web.xml中:

<env-entry> 
    <env-entry-name>logback/context-name</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>mexp</env-entry-value> 
</env-entry> 

和这在我的码头转轮主要方法

System.setProperty("logback.ContextSelector", "JNDI"); 

(并将logback文件的名称更改为logback-mexp.xml),但所有这些都不会导致行为更改。

我们肯定会越来越近,但对于赏金我需要整个解决方案。谢谢!


ETA当前状态的东西。我不再收到LinkageError。我的应用程序加载并执行正常。事实上,现在我已经有了相当大的改进,现在我不会在标准输出中获得DEBUG行的页面和页面。我仍然得到我所有的stdout日志记录,如下所示:

$ 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 
Oct 01, 2014 3:54:28 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization started 
Oct 01, 2014 3:54:28 PM org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh 
INFO: Refreshing Root WebApplicationContext: startup date [Wed Oct 01 15:54:28 EDT 2014]; root of context hierarchy 
Oct 01, 2014 3:54:28 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [mexpPapiContext.xml] 
Oct 01, 2014 3:54:28 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization completed in 352 ms 
SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/usr/local/mexp/resources/webapp/WEB-INF/lib/slf4j-log4j12-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.Log4jLoggerFactory] 
15:54:28,596 INFO GlobalRootManager:85 - Entering initialization 
15:54:28,840 INFO GlobalRootManager:85 - Exiting initialization 
15:54:28,868 INFO FileUtil:220 - -> Found /mpds.properties in resource bundle 
Oct 01, 2014 3:54:29 PM org.apache.struts.action.ActionServlet initChain 
INFO: Loading chain catalog from jar:file:/usr/local/mexp/resources/webapp/WEB-INF/lib/struts-core-1.3.10.jar!/org/apache/struts/chain/chain-config.xml 
Oct 01, 2014 3:54:29 PM org.apache.struts.action.ActionServlet initChain 
INFO: Loading chain catalog from jar:file:/usr/local/mexp/mexp.jar!/org/apache/struts/chain/chain-config.xml 
Oct 01, 2014 3:54:29 PM org.apache.struts.validator.ValidatorPlugIn initResources 
INFO: Loading validation rules file from '/WEB-INF/struts/validator-rules.xml' 
Oct 01, 2014 3:54:29 PM org.apache.struts.validator.ValidatorPlugIn initResources 
INFO: Loading validation rules file from '/WEB-INF/struts/validation-mexp.xml' 
15:54:29,529 INFO QuartzStartupServlet:85 - Entering servlet init. 
15:54:29,562 INFO StdSchedulerFactory:1184 - Using default implementation for ThreadExecutor 
15:54:29,575 INFO SchedulerSignalerImpl:61 - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 
15:54:29,575 INFO QuartzScheduler:240 - Quartz Scheduler v.2.2.1 created. 
15:54:29,576 INFO XMLSchedulingDataProcessorPlugin:200 - Registering Quartz Job Initialization Plug-in. 
15:54:29,578 INFO RAMJobStore:155 - RAMJobStore initialized. 
15:54:29,578 INFO QuartzScheduler:305 - 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. 

15:54:29,578 INFO StdSchedulerFactory:1339 - Quartz scheduler 'MexpScheduler' initialized from an externally provided properties instance. 
15:54:29,578 INFO StdSchedulerFactory:1343 - Quartz scheduler version: 2.2.1 
15:54:29,592 INFO XMLSchedulingDataProcessor:471 - Parsing XML file: mexp-dev-jobs.xml with systemId: mexp-dev-jobs.xml 
15:54:29,948 INFO XMLSchedulingDataProcessor:996 - Adding 13 jobs, 13 triggers. 
15:54:29,949 INFO XMLSchedulingDataProcessor:1034 - Adding job: skuLevelBiddingReportGroup.skuLevelBiddingReportJob 
15:54:29,951 INFO XMLSchedulingDataProcessor:1034 - Adding job: emailNotificationsGroup.emailNotificationsJob 
15:54:29,952 INFO XMLSchedulingDataProcessor:1034 - Adding job: balanceReplenishmentGroup.balanceReplenishmentJob 
15:54:29,953 INFO XMLSchedulingDataProcessor:1034 - Adding job: balanceReplenishmentCappedInvoiceGroup.balanceReplenishmentCappedInvoiceJob 
15:54:29,954 INFO XMLSchedulingDataProcessor:1034 - Adding job: merchantTxnProcessingGroup.merchantTxnProcessingJob 
15:54:29,956 INFO XMLSchedulingDataProcessor:1034 - Adding job: feedFileManagerGroup.feedFileManagerJob 
15:54:29,957 INFO XMLSchedulingDataProcessor:1034 - Adding job: merchantPaymentManagerGroup.merchantPaymentManagerJob 
15:54:29,958 INFO XMLSchedulingDataProcessor:1032 - Replacing job: merchantTxnProcessingGroup.merchantTxnProcessingJob 
15:54:29,958 INFO XMLSchedulingDataProcessor:1034 - Adding job: expiredAccountUpdaterGroup.expiredAccountUpdaterJob 
15:54:29,959 INFO XMLSchedulingDataProcessor:1034 - Adding job: placementsForDatasyncUpdaterGroup.placementsForDatasyncUpdaterJob 
15:54:29,960 INFO XMLSchedulingDataProcessor:1034 - Adding job: placementPaymentProcessingGroup.placementPaymentProcessingJob 
15:54:29,961 INFO XMLSchedulingDataProcessor:1034 - Adding job: switchingMerchantsToInvoiceGroup.switchingMerchantsToInvoiceJob 
15:54:29,962 INFO XMLSchedulingDataProcessor:1034 - Adding job: toggleActiveStateGroup.toggleActiveStateJob 
15:54:29,963 INFO QuartzScheduler:575 - Scheduler MexpScheduler_$_dev started. 
15:54:29,982 INFO LoggingTriggerHistoryPlugin:387 - Trigger JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml fired job JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml at: 15:54:29 10/01/2014 
15:54:29,983 INFO LoggingJobHistoryPlugin:469 - Job JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml fired (by trigger JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml) at: 15:54:29 10/01/2014 
15:54:29,984 INFO LoggingJobHistoryPlugin:513 - Job JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml execution complete at 15:54:29 10/01/2014 and reports: null 
15:54:29,984 INFO LoggingTriggerHistoryPlugin:433 - Trigger JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml completed firing job JobSchedulingDataLoaderPlugin.JobSchedulingDataLoaderPlugin_jobInitializer_mexp-dev-jobs_xml at 15:54:29 10/01/2014 with resulting trigger instruction code: DO NOTHING 
+0

你在使用Maven吗?如果是这样,请告诉我们你的依赖关系。或者更好,展示你的应用程序结构。这个错误表明你正在用你的webapp打包slf4j,但是也可以从你的可执行JAR的META-INF中引用它。我不是Jetty的专家,但其中的一个不应该在他们的classpath上有slf4j(可能是webapp)。 – 2014-09-28 15:39:16

+0

我正在使用maven。这是一个巨大的应用程序,有11个模块和几乎N-1的依赖关系。我很高兴分享pom.xml,但我不想在这里粘贴整个东西。 webapp和其他几个模块广泛使用slf4j,所以我不确定我怎么可以忽略它作为依赖关系,并让应用程序进行编译。我已经在使用它的所有模块中排除了slf4j,但它仍然包含在内。有没有一种方法可以在没有随后在战争中包含依赖的情况下进行编译(包含在uber-jar中)? – barclay 2014-09-28 18:09:19

+0

看起来'slf4j'找到多个'LoggerFactory'的实例。我可以使用'org.eclipse.jetty.util.log.Slf4jLog'来查看jetty日志。我不习惯码头(使用tomcat ...),但码头记录工作如何?如果您尝试通过slf4j登录而不将logback添加到类路径,会发生什么? slf4j是否尝试使用码头日志? – 2014-09-28 18:20:50

回答

3

请参阅this page on the slf4j site。我怀疑你没有包含合适的桥梁罐。例如,对于log4j,你将需要在你的pom.xml以下节:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.7</version> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.7.7</version> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>log4j-over-slf4j</artifactId> 
    <version>1.7.7</version> 
</dependency> 

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
</dependency> 

希望有所帮助。如果没有,请随时发表评论。

+0

谢谢,但它没有帮助。当我用log4j-over-slf4j替换log4j时仍然会得到相同的'java.lang.LinkageError'。 – barclay 2014-09-29 00:28:18

+0

你不会取代它,你添加桥罐到你的pom。我举了一个你需要的例子。 – hd1 2014-09-29 04:03:41

+0

谢谢。我恢复了log4j include并添加了另外两个依赖项;该应用程序启动,并没有LinkageError,这是伟大的!但是,日志记录仍然处于DEBUG级别,并且都转到stdout。任何想法我需要做的下一步来获取日志使用我的配置?我在我的classpath中有一个logback.xml,我将在上面添加到我的原始文章中。 – barclay 2014-09-29 14:54:41

0

我不认为这里有一个银色的子弹:登录Java采取多种形式,它需要注意细节才能正确使用。尤其是当类加载器像网络应用程序一样进入游戏时。

有关如何通过Joakim Erdfelt与Slf4j进行日志记录的解释很不错(我在前面看到过你在mail-conversation中的这个)。

我只能加做一个适当的清理:

  • 将JAR-文件的logback的SLF4J的API和所需SLF4J桥(JCL-过SLF4J,log4j的,在-slf4j)在主/通用/启动类路径中。
  • 删除与日志记录(log4j,commons-logging等)有关的所有其他内容。 Pavel Horal在评论中提到的“范围提供的依赖管理”技巧可以在这里派上用场。
  • 对于需要以编程方式将Slf4j设置为记录器的某些组件,例如,对于Hibernate 4.3,在Hibernate启动之前使用System.setProperty("org.jboss.logging.provider", "slf4j");
  • 如果Slf4j无法设置为组件的记录器,请尝试设置Log4j。 slf4j-bridge“log4j-over-slf4j”会将日志记录从Log4j重定向到Slf4j,Slf4j会将其发送到日志记录实现(Logback)。请注意,您只需要在主要类路径中使用bridge jar文件“log4j-over-slf4j”,而不是log4j-jar(该桥将为Log4j类提供替代)。

现在你应该在你的整个组件只有一个JAR文件和/或类应用程序在清理的第一点提到的每个记录相关组件。仔细检查任何Web应用程序(WEB-INF/lib文件夹)中是否有与日志记录相关的jar文件。在一个侧面节点上:如果使用JDBC驱动程序,请按照相同的步骤进行操作(如果它们不在主要类路径中,这些程序也会带来麻烦)。

在您开始清理之前,您应该使用内嵌了Jetty的Logback验证您的基本设置Hello World example

需要一些努力才能使所有这些日志记录正常进行,但正如您所说,它是生产所必需的,它在开发过程中对我有帮助:只需打开第三方组件的跟踪/调试(通过记录器) logback-test.xml中的类别)可以提供关于发生的事情的大量信息(尤其是与单元测试结合使用时)。

+0

我尝试了所有这些想法,但没有任何帮助。 – barclay 2014-10-06 14:22:04

0

我有这个问题。原来,我发现了一个令人难以忍受的容易溶剂(在我的情况)。

Jetty没有找到我的slf4j - *。jar(s),除非我将它们作为依赖项添加到插件配置本身。我不会包含我的整个pom.xml,而只是插件conf。希望这可以帮助。

干杯

... 
    <plugin> 
<groupId>org.mortbay.jetty</groupId> 
<artifactId>jetty-maven-plugin</artifactId> 
<version>8.1.10.v20130312</version> 
<configuration> 
    <webAppConfig> 
    </webAppConfig> 
</configuration> 
<dependencies> 
    <dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.7</version> 
    </dependency> 
    <dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.7.7</version> 
    </dependency> 
    <dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>log4j-over-slf4j</artifactId> 
    <version>1.7.7</version> 
    </dependency> 
    <dependency> 
    <groupId>org.codehaus.fabric3</groupId> 
    <artifactId>fabric3-atomikos-library</artifactId> 
    <version>1.9.6</version> 
    </dependency> 
    <dependency> 
    <groupId>javax.transaction</groupId> 
    <artifactId>jta</artifactId> 
    <version>1.1</version> 
    <scope>runtime</scope> 
    </dependency> 
     <dependency> 
     <groupId>org.codehaus.btm</groupId> 
     <artifactId>btm-jetty6-lifecycle</artifactId> 
     <version>1.3.3</version> 
     </dependency> 
</dependencies> 
    </plugin> 
... 

我再检查使用Maven的依赖插件项目依赖关系树和删除/排除的依赖关系包括了所有不必要的日志框架和它的工作。

相关问题