Spring Boot:如何禁用 Tomcat 启动日志记录?
Posted
技术标签:
【中文标题】Spring Boot:如何禁用 Tomcat 启动日志记录?【英文标题】:Spring Boot: How to disable Tomcat startup logging? 【发布时间】:2019-06-03 06:14:01 【问题描述】:我正在使用带有 Logback 的 Spring Boot 2.0.x。在我的应用程序启动时(使用嵌入式 tomcat),我看到几条 INFORMATION
日志消息(写入标准错误),这些消息显然直接来自嵌入式 tomcat。
与我所有的日志记录相比,这些消息似乎不是由 Logback 写入的。消息内容如下:
Jan 08, 2019 3:13:00 PM org.apache.coyote.AbstractProtocol init
INFORMATION: Initializing ProtocolHandler ["http-nio-8080"]
Jan 08, 2019 3:13:00 PM org.apache.catalina.core.StandardService startInternal
INFORMATION: Starting service [Tomcat]
Jan 08, 2019 3:13:00 PM org.apache.catalina.core.StandardEngine startInternal
INFORMATION: Starting Servlet Engine: Apache Tomcat/8.5.34
Jan 08, 2019 3:13:01 PM org.apache.catalina.core.ApplicationContext log
INFORMATION: Initializing Spring embedded WebApplicationContext
我对这些都不感兴趣,这只是噪音。我如何摆脱这些日志?我尝试了各种解决方案,但到目前为止都没有奏效。
【问题讨论】:
你可以试试baeldung.com/spring-boot-disable-console-logging提供的建议吗? 谢谢,我都一一尝试了,但是嵌入式tomcat一直在记录... 【参考方案1】:好的,我花了大约 5 个小时才弄明白:
Tomcat 使用JULI
,java.util.logging
的派生词
JULI 本身与java.util.logging
兼容,所以你可以同样的方式配置它
启动时,嵌入式 tomcat 不会关心您的任何日志记录设置(至少它不适合我)
结果是:在我启动我的 spring-embedded tomcat 之前,我必须这样做:
java.util.logging.Logger.getLogger("org.apache").setLevel(java.util.logging.Level.WARNING);
这将指示java.util.logging
(由 JULI 实现)仅将警告传播到控制台。这消除了 tomcat 的所有启动噪音,并且所有其他日志记录将由您选择的日志记录框架执行(在我的情况下为 logback),因此这根本不会影响您的标准日志记录。
【讨论】:
你把这行代码放在哪里了?在主应用程序类中? 在 Java main 方法中,在 (!) 启动 Spring Boot 应用程序之前。【参考方案2】:在 SpringBootApplication 这样启动之前,可以通过将 java.util.logging 格式化程序系统属性设置为空字符串来省略 Apache juli 日志
System.setProperty("java.util.logging.SimpleFormatter.format", "");
【讨论】:
【参考方案3】:您可以在application.properties
中设置以下内容:
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
logging.level.tomcat=OFF
由于嵌入式 Tomcat 使用 JUL,这会将有关 Tomcat 相关类的 JUL 日志记录级别设置为OFF
。
【讨论】:
我认为应该将其设置为OFF
以禁用所有消息? TRACE
会显示一切,我认为是小错误。
据我所知,嵌入式 Tomcat 使用 JULI,它是 JUL 的某种分支。我刚刚尝试了您的解决方案,不幸的是它不起作用 - 日志仍然出现在我的控制台上......【参考方案4】:
查看控制台中出现的 Loggername(如果是 Log4j(2))。
然后,复制名称并将其添加到您的 application.properties 文件中的 logging.level. .
在下面的屏幕截图中,如果我取消注释 DispatcherServlet 行,日志记录就会消失:
【讨论】:
【参考方案5】:一种不太显眼的方法是将 JUL 配置属性文件指定为系统属性(参见 JUL JavaDoc 和 How to set up java logging using a properties file? (java.util.logging)),并根据需要降低日志级别。
所以添加这样一个系统属性:-Djava.util.logging.config.file=logging.properties
并在该文件中使用这样的配置:
.level=WARNING
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=WARNING
使用WARNING
将使所有Tomcat 启动日志静音,但仍会显示任何问题。确保文件位置正确,我发现 JUL 只是完全静默,如果找不到,则不会给出任何提示。
另一种方法是将 JUL 日志重新路由到 log4J 或 Logback,参见。
Spring boot embedded tomcat logs How to make java.util.logging send logs to Logback? Configuring lo4j2 logging with Tomcat embedded in a Spring Boot web app【讨论】:
以上是关于Spring Boot:如何禁用 Tomcat 启动日志记录?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中禁用 Tomcat 的 permessage-deflate WebSocket 压缩?
Spring Boot 使用配置文件启用/禁用嵌入式 tomcat
在 Spring Boot 中嵌入 tomcat 中禁用 Jar Scan 的 scanManifest
SFA官方翻译Spring Boot中配置Tomcat连接池