【问题标题】:Disable Apache Commons Logging in Spring project在 Spring 项目中禁用 Apache Commons 日志记录
【发布时间】:2019-06-02 08:07:30
【问题描述】:

我有一个带有 spring web mvc 的项目并使用 Log4J。但是一个库(PDFBox / openhtml2pdf)确实使用了 Apache Commons Logging。我想禁用它(或者更好,将其缩小到服务器日志级别)。正如herehere 所写,我必须把

java.util.logging.Logger.getLogger("org.apache.pdfbox")
.setLevel(java.util.logging.Level.OFF);

在主类中的某个地方(主函数或静态初始化块)。不幸的是,我不知道我的主要课程是什么(我一定有一个吗?)。 pom.xml 中没有 MainClassstart-class 或其他定义。那么,我必须在 Spring Web Mvc 项目中的什么地方放线才能在一切开始之前执行它呢?

-- 编辑:

我尝试的另一种方法是在 pom-xml 中排除 commons-logging

    <dependency>
        <!-- Required for PDF export. -->
        <groupId>com.openhtmltopdf</groupId>
        <artifactId>openhtmltopdf-pdfbox</artifactId>
        <version>${openhtml-version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

但这并没有帮助。

-- 编辑 2:

    <dependency>
        <!-- Required for PDF export. -->
        <groupId>com.openhtmltopdf</groupId>
        <artifactId>openhtmltopdf-pdfbox</artifactId>
        <version>${openhtml-version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>${pdfbox-version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <openhtml-version>0.0.1-RC12</openhtml-version>
    <pdfbox-version>2.0.8</pdfbox-version>

我们可以看到here,我的 opnehtml2pdf 版本附带 pdfbox 版本 2.0.8。

-- 编辑 3

我使用 Spring Web MVC,而不是 Spring Boot。我用

开始我的应用程序
mvn tomcat7:run -f pom.xml

但是在测试时日志记录特别烦人:

mvn -Dtest=TestClass test

这是我的 pom.xml 的一些部分

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                    http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>..</groupId>
<artifactId>..</artifactId>
<name>..</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java-version>1.8</java-version>
    <org.springframework-version>4.3.4.RELEASE</org.springframework-version>
    <org.springframework.security-version>4.2.0.RELEASE</org.springframework.security-version>

    ...

    <openhtml-version>0.0.1-RC12</openhtml-version>
    <jsoup-version>1.11.2</jsoup-version>
    <pdfbox-version>2.0.8</pdfbox-version>

</properties>

<dependencies>
    <!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${org.springframework-version}</version>
        <exclusions>
            <!-- Exclude Commons Logging in favor of SLF4j -->
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>but the errors but
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>

    ...

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j-version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j-version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
        <version>${log4j-version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${log4j-version}</version>
        <exclusions>
            <exclusion>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.jms</groupId>
                <artifactId>jms</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jdmk</groupId>
                <artifactId>jmxtools</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jmx</groupId>
                <artifactId>jmxri</artifactId>
            </exclusion>
        </exclusions>
        <scope>runtime</scope>
    </dependency>

    ...

    <dependency>
        <!-- Required for PDF export. -->
        <groupId>com.openhtmltopdf</groupId>
        <artifactId>openhtmltopdf-pdfbox</artifactId>
        <version>${openhtml-version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>${pdfbox-version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    ...


</dependencies>


<repositories>

    <!-- maven central repo -->
    <repository>
        <id>central</id>
        <name>Central Repository</name>
        <url>http://repo.maven.apache.org/maven2</url>
        <layout>default</layout>
    </repository>

    <!-- spring main repo -->
    <repository>
        <id>springsource-repo</id>
        <name>SpringSource Repository</name>
        <url>http://repo.spring.io/release</url>
    </repository>
    <!-- For testing against latest Spring snapshots -->
    <!-- <repository> <id>org.springframework.maven.snapshot</id> <name>Spring 
        Maven Snapshot Repository</name> <url>http://maven.springframework.org/snapshot</url> 
        <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> 
        </snapshots> </repository> -->
    <!-- For developing against latest Spring milestones -->
    <!-- <repository> <id>org.springframework.maven.milestone</id> <name>Spring 
        Maven Milestone Repository</name> <url>http://maven.springframework.org/milestone</url> 
        <snapshots> <enabled>false</enabled> </snapshots> </repository> -->
    <!-- Hibernate -->
    <repository>
        <id>org.hibernate</id>
        <name>Hibernate Repository</name>
        <url>https://repository.jboss.org/nexus/content/groups/public/</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    <!-- MySQL Connector -->
    <repository>
        <id>mysql</id>
        <name>MySQL Connector</name>
        <url>http://mvnrepository.com/artifact/mysql/mysql-connector-java/</url>
    </repository>
    <!-- jitpack.io for pfdbox-layout -->
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-version}</version>
            <configuration>
                <source>${java-version}</source>
                <target>${java-version}</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>${maven-war-version}</version>
            <configuration>
                <warName>data</warName>
            </configuration>
            <executions>
                <execution>
                    <id>package</id>
                    <phase>package</phase>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>${maven-dependency-version}</version>
            <executions>
                <execution>
                    <id>install</id>
                    <phase>install</phase>
                    <goals>
                        <goal>sources</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>${aspectj-maven-version}</version>
            <configuration>
                <source>${java-version}</source>
                <target>${java-version}</target>
                <complianceLevel>${java-version}</complianceLevel>
                <verbose>false</verbose>
                <Xlint>ignore</Xlint>
                <showWeaveInfo>false</showWeaveInfo>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aspects</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <!-- AspectJ -->
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                    <version>${org.aspectj-version}</version>
                </dependency>

                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>${org.aspectj-version}</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <!-- same version as failsafe plugin -->
            <version>${maven-failsafe-version}</version>
            <configuration>
                <junitArtifactName>junit:junit</junitArtifactName>
                <includes>
                    <include>**/Test*.java</include>
                </includes>
                <excludes>
                    <exclude>**/ITest*.java</exclude>
                    <exclude>**/*_Roo_*</exclude>
                </excludes>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>${maven-failsafe-version}</version>
            <configuration>
                <includes>
                    <include>**/ITest*.java</include>
                </includes>
                <excludes>
                    <exclude>**/Test*.java</exclude>
                    <exclude>**/*_Roo_*</exclude>
                </excludes>
            </configuration>
            <executions>
                <execution>
                    <id>integration-test</id>
                    <goals>
                        <goal>integration-test</goal>
                    </goals>
                </execution>
                <execution>
                    <id>verify</id>
                    <goals>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>${maven-tomcat-version}</version>
            <configuration>
                <uriEncoding>UTF-8</uriEncoding>
                <path>/data</path>
            </configuration>
        </plugin>
    </plugins>
</build>
<reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>${maven-javadoc-version}</version>
        </plugin>
    </plugins>
</reporting>
</project>

我试图摆脱的警告如下:

com.openhtmltopdf.css-parse WARNING:: (/#inline_style_1) Found : where ; or } was expected at line 1. Skipping declaration.
com.openhtmltopdf.load INFO:: TIME: parse stylesheets  131ms

-- 编辑 3

我也尝试过使用 log4j-config,但正如 here 所提到的,这是行不通的:

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

-- 编辑 4

Log4J 主要:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration>

<Appenders>
    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout pattern="%-5p[%d{DATE}]: %c - %m%n" />
    </Console>

    <RollingFile name="ROLLING"
                 fileName="...log"
                 filePattern="...log">
        <PatternLayout pattern="%-5p[%d{DATE}]: %c - %m%n" />
        <Policies>
            <SizeBasedTriggeringPolicy size="10240KB" />
        </Policies>
        <DefaultRolloverStrategy max="5" />
    </RollingFile>

    ... other files ...

</Appenders>
<Loggers>
    <logger name="org.springframework.web" level="info" />

    <logger name="de.my.package" level="info" />
    <logger name="de.my.package.controller" level="info" />
    <logger name="de.my.package.service" level="info" />
    <logger name="de.my.package.dao" level="info" />
    <logger name="de.my.package.service.IIPService" level="off" />

    <logger name="org.elasticsearch" level="info" />
    <logger name="com.zaxxer.hikari" level="info" />

    <Logger name="Profiling" additivity="false">
        <AppenderRef ref="..." />
    </Logger>

    <Logger name="DataIntegrityLogger" additivity="false">
        <AppenderRef ref="..." />
    </Logger>

    <Root level="info">
        <AppenderRef ref="ROLLING" />
    </Root>

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

</Loggers>
</Configuration>

log4jsonfig 在测试中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration>

<Appenders>
    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout pattern="%-5p: %c - %m%n" />
    </Console>
</Appenders>



<Loggers>
    <Root level="info">
    </Root>

    <logger name="org.apache.pdfbox" level="ERROR"/>
</Loggers>
</Configuration>

【问题讨论】:

  • Spring 项目有main 类吗?我以为他们在启动时执行了一组侦听器。 ApplicationContextListener 或类似的东西。
  • 好点。我只是假设 OP 正在使用类似 spring boot 或类似的东西,其中将有一个 main in app 源。如果它们在容器中运行,比如 tomcat,那么还有其他一系列可能性。在 OP 提供更多信息(即 log4j 配置、pom.xml、控制台输出)之前,我不确定还有什么可以建议的。
  • 嗨@mar​​kspace,你说得对,显然没有主类。我不使用spring boot,但只使用spring WebMvc。那我就往ApplicationContextListener的方向去调查。
  • 关于您的“编辑 3”,链接的 q/a 未提及使用 SLF4J。根据您的 pom.xml,您 正在 使用 slf4jlog4j-slf4j-impl,因此 log4j 配置 是相关的。使用 commons-logging、log4j 和 tomcat 6 非常复杂(在 SO 上搜索这些术语),并且 pdf 库可能在任何自定义配置开始运行之前正在初始化/记录。但是,对于您的 mvn test 示例而言,情况并非如此,因为在这种情况下,没有 tomcat。
  • @kaliatech 嗯好的,我添加了 log4j-config。

标签: java spring-mvc


【解决方案1】:

编辑

根据较新的 cmets 和对问题的编辑,您正在配置 org.apache.pdfbox 记录器,但是,在您尝试禁用的记录语句的示例中,您正在显示来自记录器 com.openhtmltopdf 的输出。除了当前的 log4j 配置之外,您还需要添加 &lt;logger name="com.openhtmltopdf" level="ERROR"/&gt;

原创

要找到您的主要课程,您可以尝试递归搜索 void main(main (

但根据 cmets 中 @nathan-hughes 的建议,我认为最好排除公共日志记录。

然后根据您最近的评论,我认为您需要从 pdfbox 库中排除,而不是从包含 pdfbox 的 openhtmltopdf-pdfbox 库中排除,然后过渡包含 commons-logging。排除项不可传递。

<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <exclusions>
     <exclusion>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
     </exclusion>
  </exclusions>
</dependency>

【讨论】:

  • 不清楚您在做什么以及如何启动您的应用程序。但如果可能,请在 /lib 目录中查找 commons-logging.jar。如果它仍然存在,那么您可以尝试在开始之前从您的 lib 目录中删除该文件,以确保这是问题所在。另外,我假设您知道您还必须配置 log4j 以禁用相关记录器。您可以考虑在您的问题中发布更多信息(log4j 配置、您看到的输出等)。
  • 嗨@kaliatech,我在主帖中添加了很多信息。正如我链接的第一个线程中指出的那样,log4j-config 似乎不相关(或连接)。无论如何,我都尝试使用它来禁用 apache logger,但没有成功。
  • 您应该发布您尝试使用的 log4j 配置以及放置位置。在您的第一篇文章中,您表明您正在尝试禁用“org.apache.pdfbox”记录器,但您提供的示例输出显示“com.openhtmlpdf”。您也可以尝试运行类似“mvn dependency:tree -Dincludes=commons-logging:commons-logging”之类的东西,看看是否有其他东西正在拉入 commons-logging。
【解决方案2】:

我在 org.apache.commons.beanutils.converters 的 Spring Boot 测试中获得了超过 2400 条 DEBUG 日志行。

对我来说,将 logback-test.xml 文件添加到资源文件夹中会抑制所有这些烦人的消息。

o.a.c.b.converters.BooleanConverter : 设置默认值:false

o.a.c.b.converters.BooleanConverter:将“布尔”值“假”转换为“布尔”类型 o.a.c.b.converters.BooleanConverter :不需要转换,值已经是布尔值 o.a.c.b.converters.ByteConverter :设置默认值:0

这是我使用的 logback-test.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml" />
  <logger name="org.springframework" level="DEBUG"/>
  <logger name="org.apache.commons.beanutils.converters" level="OFF"/>
</configuration>

【讨论】:

    【解决方案3】:

    删除 Apache Commons 日志记录......

    <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.24</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    

    从它的父级中排除任何依赖项

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>                                               <!--Exclude Dependencies-->
            <exclusion>
                    <groupId>org.springframework.boot</groupId>         <!-- Group ID -->
                    <artifactId>spring-boot-starter-logging</artifactId> <!--Name Of Exclude Starter -->
            </exclusion>
        </exclusions>
    </dependency>
    

    排除 Child's Child 的依赖项......

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>                                   <!-- Exclude dependency from parent  -->
            <exclusion>                                     <!-- Exclude Log4J-->
            <groupId>org.apache.logging.log4j</groupId>         <!-- group name of whose dependency want to exclude-->
            <artifactId>log4j-to-slf4j</artifactId>             <!-- Jar Name-->
            </exclusion>
    
            <exclusion>                                     <!-- Exclude LogBack-->
                <groupId>ch.qos.logback</groupId>               <!-- group name of whose dependency want to exclude-->
                <artifactId>logback-classic</artifactId>        <!-- Jar Name-->
            </exclusion>
        </exclusions>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 2012-07-20
      • 2019-08-30
      相关资源
      最近更新 更多