调试SLF4J后Gradle转换



很烦人…我们将我们的项目转换为Gradle,日志记录不再工作了。我选择了与当前版本1.6.6匹配的导入,但我们得到的唯一输出只是时间信息,如下所示:

2014年8月14日星期四18:51:53 EDT

SLF4J是实现,我们使用存储在classes目录中的log4j.xml文件进行设置。如果我从Eclipse中运行单元测试,日志机制工作得很好,但是在将它部署到Tomcat之后,我就不走运了。我也试过升级到最新版本,但是没有解决问题。

下面是当前gradle条目:

compile 'org.slf4j:slf4j-api:1.7.7'
compile 'org.slf4j:slf4j-log4j12:1.7.7'

就像我说的,我们使用log4jxml。配置文件相当长,可能没有必要(只是因为,就像我说的,这之前是工作的),但这里有一个简短的版本,不起作用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <param name="Threshold" value="info"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p: %c - %m%n LOGTEST" />
    </layout>
</appender>
    <appender name="file" class="org.apache.log4j.RollingFileAppender">
      <param name="append" value="false"/>
      <param name="Threshold" value="info"/>
      <param name="file" value="${catalina.base}/logs/application.log"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
      </layout>
   </appender>
    <logger name="org.springframework.ws">
        <level value="trace" />
    </logger>
    <!-- Root Logger -->
    <root>
        <priority value="trace" />
        <appender-ref ref="file" />
        <appender-ref ref="errorFile" />
        <appender-ref ref="console" />
    </root>
</log4j:configuration>

对于在Eclipse中运行单元测试是有效的。但是,如果我将它部署到Tomcat并从Eclipse启动服务器,我将不再获得输出。注意上面的"LOGTEST"字符串。下面是我的控制台日志输出:

LOGTESTINFO : org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'
LOGTESTINFO : com.mycompany.cerp.app.MyApp - Loading trusted certs from C:tomcatwebappsROOTWEB-INFvalidcerts
LOGTESTINFO : com.mycompany.cerp.app.MyApp - Loading Certificate: C:tomcatwebappsROOTWEB-INFvalidcertscerts_output.crt
LOGTESTINFO : org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'mvc-dispatcher': initialization completed in 874 ms
LOGTESTAug 18, 2014 6:34:56 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8000"]
Aug 18, 2014 6:34:56 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Aug 18, 2014 6:34:56 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 8561 ms
Aug 18, 2014 6:35:06 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Thu Aug 14 18:51:53 EDT 2014
Thu Aug 14 18:51:53 EDT 2014

注意,最后两行反映了自定义记录器的消失

这个问题的本质以及我无法看到解决方案代表了某种对依赖性的故意忽视。如果我使用slf4j和log4j作为底层实现,为什么需要两个单独的导入?换句话说,就其本质而言,slf4j-log4j12:1.7.7同时需要slf4j和log4j,因此后者不应该被列为依赖项。

我在OP中使用的两个import语句是不兼容的,我通过将import更改为:

来解决这个问题:
compile 'org.slf4j:slf4j-log4j12:1.7.7'

最新更新