java - Spring Boot 忽略来自外部 application.properties 的日志记录级别

标签 java spring tomcat logging spring-boot

我正在 Tomcat 上运行打包在 war 文件中的 Spring Boot(版本 1.5.2.RELEASE)应用程序。在我的上下文文件 (conf/Catalina/localhost/ROOT.xml) 中,我指定了外部属性文件的路径,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Environment name="spring.config.location" value="file:/opt/shared/home/.airlines-data/" type="java.lang.String"/>
</Context>

在路径 /opt/shared/home/.airlines-data/ 中,我有一个带有以下行的 application.properties 文件:

logging.level.root=WARN
logging.level.org.hibernate=ERROR
logging.level.org.springframework.web=WARN
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.show-sql=false
logging.file=/opt/shared/home/.airlines-data/Errors.log

文件被正确读取。属性 logging.file=/opt/shared/home/.airlines-data/Errors.log 也被正确加载,如果我将其值更改为其他值,一切都会按预期工作。不幸的是,Spring Boot 忽略了所有的日志级别设置。它记录 INFO 级别及更高级别的所有内容。 Hibernate 还将其所有查询记录到日志文件中。这使得日志文件在短时间内变得非常大。有没有其他方法可以将日志记录级别更改为 WARN 或 ERROR 并使用外部配置禁用 Hibernate SQL 日志记录?我正在使用 Spring Boot 提供的标准日志记录设置。以下是我的依赖项:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-jdbc')
    compile('org.springframework.boot:spring-boot-starter-jooq')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.liquibase:liquibase-core')
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-mail')
    compile("org.springframework:spring-messaging")
    compile('org.apache.commons:commons-lang3:3.4')
    compile('commons-io:commons-io:2.4')
    compile('commons-beanutils:commons-beanutils:1.9.2')
    compile('com.samaxes.filter:cachefilter:2.3.1')
    compile('com.monitorjbl:xlsx-streamer:0.2.12')
    compile('org.apache.commons:commons-csv:1.2')
    compile('org.imgscalr:imgscalr-lib:4.2')
    compile('xerces:xercesImpl:2.11.0')
    compile('com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:2.6.4')
    compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity4:2.1.2.RELEASE')
    compile('org.jodd:jodd-mail:3.7.1')
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
    testCompile('org.springframework.boot:spring-boot-starter-test') 
}

我的 Error.log 文件很快就填满了,并且包含很多类似的行:

2017-02-17 18:45:13.338 DEBUG 5168 --- [localhost-startStop-1] o.s.boot.SpringApplication               : Loading source class pl.eb2b.AirlinesApplication,class org.springframework.boot.context.web.ErrorPageFilter
2017-02-17 18:45:13.851 DEBUG 5168 --- [localhost-startStop-1]
2017-02-17 18:45:13.851 DEBUG 5168 --- [localhost-startStop-1] o.s.b.c.c.ConfigFileApplicationListener  : Loaded config file 'file:/opt/shared/home/.airlines-data/application.properties'
2017-02-17 18:45:13.852 DEBUG 5168 --- [localhost-startStop-1] o.s.b.c.c.ConfigFileApplicationListener  : Loaded config file 'classpath:/application.properties'
2017-02-18 00:21:34.997 DEBUG 9026 --- [http-nio-8080-exec-8] o.s.b.c.web.OrderedRequestContextFilter  : Bound request context to thread: org.apache.catalina.connector.RequestFacade@14ab2c1f
2017-02-18 00:21:35.000 DEBUG 9026 --- [http-nio-8080-exec-8] o.s.b.c.web.OrderedRequestContextFilter  : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@14ab2c1f
2017-02-20 13:15:09.526 DEBUG 11701 --- [http-nio-8080-exec-4] org.hibernate.SQL                        : select count(*) as y0_ from cars_car_contract this_

我也试过将 logback-spring.xml 文件放在我的类路径中:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <root level="WARN">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
    <logger name="org.hibernate" level="ERROR" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>
</configuration>

它在我的本地机器上工作,但在服务器上被忽略了。

2017-04-07 更新:

我在 catalina.out 日志中发现了一些附加信息,其中包含打印到控制台的所有内容(也许会有帮助):

07-Apr-2017 06:12:48.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /opt/repo/versions/8.5.3
07-Apr-2017 06:12:48.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /opt/repo/versions/8.5.3
07-Apr-2017 06:12:48.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/opt/repo/versions/8.5.3/conf/logging.properties
07-Apr-2017 06:12:48.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
07-Apr-2017 06:12:48.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -DReceiverIp=
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -DMagicPort=
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djvm=jelastic
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.awt.headless=true
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.net.preferIPv4Stack=true
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -DjvmRid=
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xms32M
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmn30M
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx512M
07-Apr-2017 06:12:48.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xminf0.1
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmaxf0.3
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:+UseG1GC
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:+UseCompressedOops
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:MinHeapFreeRatio=15
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:MaxHeapFreeRatio=30
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/opt/repo/versions/8.5.3
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/opt/repo/versions/8.5.3
07-Apr-2017 06:12:48.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/opt/repo/versions/8.5.3/temp

由于我的服务器是基于 Jelastic 的云服务器,所以它会自动使用这些参数进行配置。不知道有没有关系,但是param -Djava.util.logging.config.file=/opt/repo/versions/8.5.3/conf/logging.properties 看起来像与日志记录有关。以下是该文件的内容:

handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.

2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.

3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter


org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = WARNING
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler

最佳答案

我们能够找到的一些文章(12)说了以下内容:

Default Logging Support in Spring Boot

Spring Boot reference document says:

By default, If you use the ‘Starter POMs’, Logback will be used for logging. Appropriate Logback routing is also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J or SLF4J will all work correctly.

因此,您可以在 application.properties 文件中调整 SpringBoot 的日志记录级别,最有可能通过以下路径:

cat /opt/tomcat/webapps/ROOT/WEB-INF/classes/application.properties
logging.level.*=OFF
logging.level.org.springframework.web=WARN
logging.level.org.springframework.boot=OFF
logging.level.org.hibernate.SQL=OFF

更改完成后,调试消息应该从 catalina.out 中消失

关于java - Spring Boot 忽略来自外部 application.properties 的日志记录级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42482991/

相关文章:

java - 是否可以从普通的java文件中禁用tomcat缓存

java - 不共享任何外键关系的 JPA 实体之间的 @OneToOne 关系

java - Spring 中的 ProxyBean 方法

java - 如何在单元测试中在ApplicationRunner之前运行代码?

java - 使用 HttpServletResponseWrapper 捕获包括 header 在内的整个响应

java - 正在使用哪个cacert?

java - 我能够在 TreeSet 中插入重复条目。如何克服这个

java - JDK 环境变量(Ubuntu 12.04)与 tomcat

java - spring-data-jdbc 只读

java - tomcat cpu 使用率通过虚拟 ip 配置达到 100%