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 使用JULIjava.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连接池

使用spring boot在undertow中禁用http TRACK/TRACE

Spring启用/禁用带有配置文件的嵌入式tomcat