programing

스프링 부트 내장 Tomcat 로그

jooyons 2023. 10. 12. 22:42
반응형

스프링 부트 내장 Tomcat 로그

스프링부트 1.5.9와 함께 스프링부트 내장 톰캣을 사용하고 있고, Log4j2도 사용하고 있습니다.

최근 로드 중 문제가 발생하여 Tomcat 로그[Not the access Logs]를 더 잘 이해하고 싶습니다. (application.properties에서):

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

하지만 위의 것들 중 아무 것도 효과가 없었습니다.그것을 성취하기 위한 다른 방법이 있습니까?

찾았어요!!이제 앱의 Log4j 로그 파일에서 내장된 Tomcat의 내부 로그를 다음과 같은 3가지 쉬운 단계로 볼 수 있습니다.

1] 폼에 추가:

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

2] 실행 중인 arg에 새 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(실제 Logging way Embedded tomcat 사용)로 전파되지 않기 때문에 위에서 JUL 및 Log4j 로그 레벨과의 연결을 달성하기 때문입니다.

참조: Spring boot 1.5.10 릴리즈 노트(Spring boot 1.5.10 릴리즈 노트는 솔루션에 필요하지 않음)를 읽고 솔루션을 구현하는 방법과 설명을 설명하는 새 문서를 보았습니다.

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

저는 매우 힘들어했고, 제 도움을 전혀 찾지 못했습니다.결국 저는 스프링부팅 애플리케이션에서 "WAR"을 만들었습니다.Tomcat 인스턴스에 배포하고 아래 단계에 따라 모든 내부 Tomcat 로그(JULI) 로그를 내 응용 프로그램 로그 파일로 리디렉션합니다.

  1. 기존 JULI 라이브러리(CATALINA_HOME/bin/tomcat-juli.jar 파일)와 기존 Tomcat Java Logging 구성 파일(CATALINA_HOME/conf/logging.properties)을 삭제합니다.

  2. Tomcat 다운로드의 엑스트라 섹션(http://tomcat.apache.org/download-70.cgi) 에서 JULI Log4j Tomcat 라이브러리(tomcat- juli.jar)를 다운로드합니다.다운로드한 파일을 CATALINA_HOME/bin 디렉토리에 놓습니다.

  3. Tomcat 다운로드의 Extras 섹션에서 Tomcat JULI adapters 라이브러리(tomcat-juli-adapters.jar)를 다운로드합니다.이 파일을 CATALINA_HOME/lib 디렉토리에 놓습니다.

  4. Log4j(버전 1.2 이상)를 다운로드하고 다운로드한 라이브러리 파일을 CATALINA_HOME/lib 디렉토리에 놓습니다.

  5. CATALINA_HOME/lib/log4j.properties 위치에 Log4j 구성 파일을 만듭니다.기본 Java Logging 구성과 일치하는 log4j 구성을 아래에서 확인합니다.

  6. Tomcat을 다시 시작합니다.

Log4j 구성 파일 기본 Tomcat 로깅 설정과 일치:

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 @ 링크에서 사용 가능한 어댑터를 확인할 수도 있습니다.

스프링 부트 응용 프로그램에서는 스프링 부트의 Tomcat Embedded Servlet ContainerFactory.class를 사용하여 jars, 폴더를 추가 및 제거하거나 사용자 지정 구성 파일을 추가하는 등의 변경을(를) 스프링 부트의 Tomcat Embedded ServletContainerFactory.class.

slf4j 및 Spring Boot 2의 경우 Tomcat에서 예외를 숨기고 직접 처리합니다.

  • 폼에 추가:

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

Java Util Logging, Log4J, Log4J2 및 Logback에 대한 기본 구성이 제공됩니다.각 경우에 로거는 콘솔 출력을 사용하도록 미리 구성되어 있으며 옵션 파일 출력도 사용할 수 있습니다.

다음 링크 참조: https://stackoverflow.com/questions/31939849/spring-boot-default-log-location/31939886

스프링 부트에 내장된 Tomcat은 내부적으로 로그를 에코하여 콘솔에 전달합니다.기본 로그 구성은 메시지가 기록될 때 콘솔에 에코됩니다.따라서 설명한 대로 파일을 명시적으로 지정할 때까지 해당 파일은 콘솔에 남아 있습니다.

스프링 부트 기록 문서에서.

필요에 따라 로깅을 사용자 정의할 수 있습니다.

생성된 로그 파일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;
    }
}

스프링 부츠 2와 함께하면 훨씬 더 좋아집니다.

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

언급URL : https://stackoverflow.com/questions/48312851/spring-boot-embedded-tomcat-logs

반응형