【问题标题】:Spring boot embedded tomcat logsSpring Boot 嵌入式 tomcat 日志
【发布时间】:2018-06-27 00:39:08
【问题描述】:

我正在使用带有 spring boot 1.5.9 的 spring boot 嵌入式 tomcat, 我也在使用 Log4j2。

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

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

但上述方法均无效。还有其他方法可以实现吗?

【问题讨论】:

    标签: spring spring-boot logging tomcat8 embedded-tomcat-8


    【解决方案1】:

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

    参考此链接:https://stackoverflow.com/questions/31939849/spring-boot-default-log-location/31939886

    spring boot 中的嵌入式 tomcat 在内部将日志回显到控制台。 默认日志配置将在写入消息时将消息回显到控制台。因此,除非您按照描述明确指定文件,否则它会保留在控制台中。

    来自spring boot logging doc

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

    【讨论】:

    • 嗨 Ramesh 在我使用 Log4j2 的问题中声明,所以我的应用程序的日志没有写入控制台。
    • 为 Java Util Logging、Log4J、Log4J2 和 Logback 提供了默认配置。在每种情况下,记录器都预先配置为使用控制台输出以及可选的文件输出
    【解决方案2】:

    我挣扎了很多,但没有找到任何帮助。最终我已经从我的 Spring Boot 应用程序中构建了“WAR”。将它部署到 tomcat 实例和 按照以下步骤,将所有内部 tomcat 日志(JULI)日志重定向到我的应用程序日志文件。

    1. 删除现有的 JULI 库(CATALINA_HOME/bin/tomcat-juli.jar 文件)和现有的 Tomcat Java Logging 配置文件(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 应用程序中,您可以进行更改,例如添加和删除 jar、嵌入式 Tomcat 服务器中的文件夹,甚至可以使用 Spring Boot 的 TomcatEmbeddedServletContainerFactory.class 向其添加自定义配置文件。 p>

    【讨论】:

    • 感谢您提供详细信息!但我确实需要使用嵌入式 tomcat,在使用嵌入式 tomcat 时,你有办法让 Tomcat 登录到应用程序的日志中吗?
    【解决方案3】:

    嵌入式tomcat的包是org.springframework.boot.context.embedded.tomcat 因此,将其添加到您的 application.properties 文件中

    logging.level.org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer=INFO
    

    【讨论】:

      【解决方案4】:

      找到了!!您现在可以通过 3 个简单的步骤在应用程序的 Log4j 日志文件中查看 Embedded Tomcat 的内部日志:

      1] 添加到您的 pom 中:

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

      2] 将新的 JVM 参数添加到正在运行的 arg 中,例如:

      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 使用的实际 Logging 方式)所以上面实现了与 JUL 和 Log4j 日志级别的这种连接。

      参考: 在阅读了 Spring boot 1.5.10 发行说明(解决方案不需要)之后,我看到了阐明如何实现它并解释它的新文档:

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

      【讨论】:

      • 如果你使用默认的 logback 会怎样
      • @Kalpesh Soni 不可能,因为我需要在已经使用 log4j2 的非常大规模的代码库中执行此操作,更改为 logback 不是一种选择...
      • 在较新版本的 Spring Boot(例如 2.1.9)中,您不需要添加对 org.apache.logging.log4j:log4j-jul 的依赖项,因为它将由 org.springframework.boot:spring-boot-starter-log4j2 添加。
      【解决方案5】:

      对于 slf4j 和 Spring Boot 2 对 Tomcat 隐藏异常并自行处理:

      • 添加到 pom:

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        
      • 添加到配置:

        @PostConstruct
        void postConstruct() {
            SLF4JBridgeHandler.install();
        }
        
      • 添加到application.yaml

        logging:
            level:
              org.apache.catalina: off
        
      • 处理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)));
           }
        }
        

      【讨论】:

        【解决方案6】:

        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);
                };
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-28
          • 2017-02-15
          • 1970-01-01
          • 2018-05-28
          • 2017-03-12
          • 2014-06-29
          • 2014-01-01
          • 2016-02-17
          相关资源
          最近更新 更多