Spring Boot 内嵌 Tomcat 日志记录

18

我正在使用Spring Boot 1.5.9嵌入式Tomcat,并且还在使用Log4j2。

最近我在加载过程中遇到了问题,因此我想更好地了解Tomcat日志[不是访问日志],我尝试了(在application.properties中):

logging.level.org.apache.tomcat: INFO
logging.level.org.apache.catalina: INFO

但以上方法都没有成功,还有其他实现方式吗?

5个回答

11

找到了!! 您只需三个简单步骤就可以在应用程序的Log4j日志文件中查看嵌入式Tomcat的内部日志:

1] 将以下内容添加到您的pom文件中:

 <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-jul</artifactId>
     </dependency>

2] 添加一个新的JVM参数到您正在运行的参数中,例如:

java -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -jar target/demo-0.0.1-SNAPSHOT.jar

3] 将以下内容添加到application.properties文件中:

logging.level.org.apache=DEBUG

享受生活!:)

说明:问题是由于Log4j日志级别没有传递到JUL(这是嵌入式Tomcat使用的实际日志记录方式),因此上述代码实现了JUL和Log4j日志级别之间的连接。

参考资料:阅读Spring Boot 1.5.10版本发布说明后,我看到了新文档,解释了如何实现它以及其说明:

https://github.com/spring-projects/spring-boot/issues/2923#issuecomment-358451260


1
如果您使用默认的Logback呢? - Kalpesh Soni
@Kalpesh Soni不可能,因为我需要在一个已经使用log4j2的大型代码库中完成它,改用logback不是一个选择... - Robocide
1
在较新版本的Spring Boot(例如2.1.9)中,您无需添加对org.apache.logging.log4j:log4j-jul的依赖项,因为它将由org.springframework.boot:spring-boot-starter-log4j2添加。 - Behrang

1

我很努力地尝试了很多,但没有找到任何有用的东西。最终,我使用我的Spring Boot应用程序构建了“WAR”文件。将其部署到Tomcat实例并按照以下步骤操作,将所有内部Tomcat日志(JULI)重定向到我的应用程序日志文件中。

  1. 删除现有的JULI库(CATALINA_HOME/bin/tomcat-juli.jar文件)和现有的Tomcat Java日志配置文件(CATALINA_HOME/conf/logging.properties)。

  2. 从Tomcat下载的Extras部分(http://tomcat.apache.org/download-70.cgi),下载JULI Log4j Tomcat库(tomcat-juli.jar)。将下载的文件放置在CATALINA_HOME/bin目录中。

  3. 从Tomcat下载的Extras部分,下载Tomcat JULI适配器库(tomcat-juli-adapters.jar)。将此文件放置在CATALINA_HOME/lib目录中。

  4. 下载Log4j(版本1.2或更高版本),并将下载的库文件放置在CATALINA_HOME/lib目录中。

  5. 在以下位置创建Log4j配置文件:CATALINA_HOME/lib/log4j.properties。检查下面的log4j配置是否与默认的Java Logging配置匹配。

  6. 重新启动Tomcat。

与默认Tomcat日志设置匹配的Log4j配置文件:

log4j.rootLogger=INFO, CATALINA
//Define all the appenders log4j.appender.CATALINA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.File=${catalina.base}/logs/catalina.
log4j.appender.CATALINA.Append=true log4j.appender.CATALINA.Encoding=UTF-8

//Roll-over the log once per day
log4j.appender.CATALINA.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout

log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.LOCALHOST=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOCALHOST.File=${catalina.base}/logs/localhost.
log4j.appender.LOCALHOST.Append=true log4j.appender.LOCALHOST.Encoding=UTF-8
log4j.appender.LOCALHOST.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.MANAGER=org.apache.log4j.DailyRollingFileAppender
log4j.appender.MANAGER.File=${catalina.base}/logs/manager.
log4j.appender.MANAGER.Append=true log4j.appender.MANAGER.Encoding=UTF-8
log4j.appender.MANAGER.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.HOST-MANAGER=org.apache.log4j.DailyRollingFileAppender
log4j.appender.HOST-MANAGER.File=${catalina.base}/logs/host-manager.
log4j.appender.HOST-MANAGER.Append=true log4j.appender.HOST-MANAGER.Encoding=UTF-8
log4j.appender.HOST-MANAGER.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

//Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].
[localhost]=INFO,
 LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].
[localhost].[/manager]=INFO,MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].
[localhost].[/host-manager]=
INFO, HOST-
MANAGER

你也可以在GIT上检查可用的适配器 @ link

在你的Spring Boot应用程序中,你可以进行更改,比如从嵌入式Tomcat服务器中添加和删除jar、文件夹,甚至使用Spring Boot的TomcatEmbeddedServletContainerFactory.class添加自定义配置文件。


1
谢谢您提供这么详细的信息!但是我确实需要使用嵌入式Tomcat,您有办法在使用嵌入式Tomcat时将Tomcat日志记录到应用程序日志中吗? - Robocide

1

如果您正在使用slf4j和Spring Boot 2,并希望隐藏来自Tomcat的异常并自行处理,可以执行以下操作:

  • Add to pom:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    
  • Add to config:

    @PostConstruct
    void postConstruct() {
        SLF4JBridgeHandler.install();
    }
    
  • Add to application.yaml

    logging:
        level:
          org.apache.catalina: off
    
  • Handle exception in ErrorController

    @Controller
    @Slf4j
    public class ErrorController implements 
                  org.springframework.boot.web.servlet.error.ErrorController {
        private static final String ERROR_PATH = "/error";
    
       @Autowired
       private ErrorAttributes errorAttributes;
    
       @Override
       public String getErrorPath() {
          return ERROR_PATH;
       }
    
       @RequestMapping(ERROR_PATH)
       public ModelAndView error(HttpServletRequest request) {
           return processException(errorAttributes.getError(new ServletWebRequest(request)));
       }
    }
    

-1

Java Util Logging、Log4J、Log4J2和Logback都提供了默认配置。在每种情况下,记录器都预先配置为使用控制台输出,并且还可以选择文件输出。

请参考此链接:https://dev59.com/qFwZ5IYBdhLWcg3wBcWz#31939886

Spring Boot中的嵌入式Tomcat会将日志内部回显到控制台。默认的日志配置将按照编写顺序将消息回显到控制台。因此,在您明确指定文件之前,它将保留在控制台中。

请参考spring boot logging doc

您可以根据需要自定义日志记录。


嗨Ramesh,根据问题声明,我使用Log4j2,因此我的应用程序的日志不会写入控制台。 - Robocide
默认配置已提供给Java Util Logging、Log4J、Log4J2和Logback。在每种情况下,记录器都预先配置为使用控制台输出,并且还可选择文件输出。 - Ramesh Fadatare

-1

org.apache.catalina.valves.AccessLogValve 生成的日志文件通常被命名为 localhost_access_log,可以按照以下方式进行配置:

@Configuration
public class EmbeddedTomcatConfig {
    @Bean
    public TomcatEmbeddedServletContainerFactory containerFactory() {
        TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory = new TomcatEmbeddedServletContainerFactory();
        AccessLogValve accessLogValve = new AccessLogValve();
        // set desired properties like
        accessLogValve.setDirectory(...);
        tomcatEmbeddedServletContainerFactory.addEngineValves(accessLogValve);
        return tomcatEmbeddedServletContainerFactory;
    }
}

或者,使用Spring Boot 2会更好:

   @Bean
   public WebServerFactoryCustomizer<TomcatServletWebServerFactory> customizer() {
        return container -> {
            AccessLogValve accessLogValve = new AccessLogValve();
            // set desired properties like
            accessLogValve.setDirectory("...");
            container.addEngineValves(accessLogValve);
        };
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接