【问题标题】:How to enable debugging in Log4j using .properties file and maven?如何使用 .properties 文件和 maven 在 Log4j 中启用调试?
【发布时间】:2017-08-31 11:13:14
【问题描述】:

我正在尝试为一个 Maven 项目启用打印调试信息。我将 log4j 作为依赖项添加到 pom.xml 并添加 log4j.properties 以及 log4j2.propertiesrootloger=DEBUG, sdoutsrc/main/resources 文件夹。然后在所需的类中,我在所需的类“org.pakage1.ClassA”中启动一个记录器并添加logger.debug() 行,但我的领事中没有显示任何内容。当我检查logger.isDebugEnabled() 它返回false

  • pom.xml

    <dependencies>
    .....
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
    </dependency>
    

  • log4j.properties 和类似的 log4j2

    log4j.debug=true
    log4j.rootLogger=DEBUG, stdout
    
    log4j.appender.Stdout.threshold=debug
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%-5p %d [%t] %c{1} - %m%n
    

    作为额外的步骤,我尝试添加

    log4j.logger.extendedsldnf.ExtendedSLDNFEvaluator=DEBUG 
    

    但它也没有工作。

    package package1;
    ......
    class ClassA{
        private Logger logger = LoggerFactory.getLogger(getClass());
        ......
        public static void main(String []args){
               logger.debug("message");
        }
    
    
    }
    

知道我收到警告

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

此外,该项目还有其他子模块也启用了类似的日志记录,并且在 log4j.properties 文件中说明时调试消息效果很好

有什么遗漏吗?如何检查是否有冲突?

【问题讨论】:

    标签: java maven logging log4j slf4j


    【解决方案1】:

    如果您想使用 log4j appender 打印 slf4j logger 的日志,请确保您有 slf4j-log4j12 jar 并删除 logback jar,否则使用 log4j 或 logback 将无法控制。

    【讨论】:

      【解决方案2】:

      添加了 log4j.properties 以及 log4j2.properties

      第一个用于 log4j 1,第二个用于 log4j 2。 声明两者都不是解决问题的方法。
      仅使用与您的实际 log4j 版本匹配的那个。

      SLF4J:类路径包含多个 SLF4J 绑定。 SLF4J:实际 绑定是类型 [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

      确实,问题很明显:您希望使用 log4J 实现作为 SLF4J 绑定但是您在运行时在类路径中至少有一个另一个 SLF4J 绑定。这里提到了来自 Logback 的 ContextSelectorStaticBinder,它是另一个绑定。
      您必须在运行时在类路径中拥有 SLF4J 的单个实现/绑定。

      要解决您的问题,这很简单。
      当您使用 Maven 时,我建议您从应用程序的 agreggator pom 中执行 mvn dependency:tree 命令,或者如果您没有 agreggator pom,则从打包您的应用程序的 pom 中执行。
      此命令会将依赖项(包括您的 pom 拉取的传递依赖项)作为输出写入。

      它会输出类似的东西:

      [INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ Test-Spring-Boot ---
      [INFO] Test-Spring-Boot:Test-Spring-Boot:jar:0.0.1-SNAPSHOT
      [INFO] \- org.springframework.boot:spring-boot-starter-web:jar:1.4.4.RELEASE:compile
      [INFO]    +- org.springframework.boot:spring-boot-starter:jar:1.4.4.RELEASE:compile
      [INFO]    |  +- org.springframework.boot:spring-boot:jar:1.4.4.RELEASE:compile
      [INFO]    |  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.4.4.RELEASE:compile
      [INFO]    |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.4.4.RELEASE:compile
      [INFO]    |  |  +- ch.qos.logback:logback-classic:jar:1.1.9:compile
      [INFO]    |  |  |  +- ch.qos.logback:logback-core:jar:1.1.9:compile
      [INFO]    |  |  |  \- org.slf4j:slf4j-api:jar:1.7.22:compile
      [INFO]    |  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.22:compile
      [INFO]    |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.22:compile
      [INFO]    |  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.22:compile
      [INFO]    |  +- org.springframework:spring-core:jar:4.3.6.RELEASE:compile
      [INFO]    |  \- org.yaml:snakeyaml:jar:1.17:runtime
      [INFO]    +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.4.4.RELEASE:compile
      [INFO]    |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.11:compile
      [INFO]    |  +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.11:compile
      [INFO]    |  \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.11:compile
      [INFO]    +- org.hibernate:hibernate-validator:jar:5.2.4.Final:compile
      [INFO]    |  +- javax.validation:validation-api:jar:1.1.0.Final:compile
      [INFO]    |  +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile
      [INFO]    |  \- com.fasterxml:classmate:jar:1.3.3:compile
      [INFO]    +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.6:compile
      [INFO]    |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.6:compile
      [INFO]    |  \- com.fasterxml.jackson.core:jackson-core:jar:2.8.6:compile
      [INFO]    +- org.springframework:spring-web:jar:4.3.6.RELEASE:compile
      [INFO]    |  +- org.springframework:spring-aop:jar:4.3.6.RELEASE:compile
      [INFO]    |  +- org.springframework:spring-beans:jar:4.3.6.RELEASE:compile
      [INFO]    |  \- org.springframework:spring-context:jar:4.3.6.RELEASE:compile
      [INFO]    \- org.springframework:spring-webmvc:jar:4.3.6.RELEASE:compile
      [INFO]       \- org.springframework:spring-expression:jar:4.3.6.RELEASE:compile
      

      您只需确定从何处提取 logback 依赖项。
      一旦确定了它,如果它是从我们自己的 pom.xml 显式声明的依赖项,则删除它的依赖项。
      如果是传递依赖,use the exclusion dependency mechanism of Maven.

      【讨论】:

      • 感谢您的回答对我来说似乎是合理的,但有一点.. 为什么logger.isDbugEnabled() 在配置文件明确说明它是真的时返回错误?
      • 不客气。因为运行时使用的是 Logback 配置,而不是 Log4J 配置。
      • 我刚刚弄清楚了,我还发现如果项目或其依赖项中有多个 log4j.properties 文件,则只加载其中一个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2012-03-25
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多