ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [08] Spring boot logging
    Spring/Spring boot 2020. 6. 5. 08:55
    반응형

    [Logging facade]

    • Commons Logging, SLF4j(Simple Logging Facade for Java).
      • logger API를 추상화 한 interface들입니다.
      • framework 개발자들이 주로 사용합니다.
      • logging facade를 사용하면 logger를 변경할 수 있습니다.
      • Spring boot 개발 당시 logging facade로 Commons Logging을 사용했습니다. 하지만 Commons Logging은 여러 가지 문제점을 내포합니다.
      • Commons Logging의 문제점을 해결하기 위해 새롭게 등장한 logging facade가 SLF4j이며 이를 사용하기 위해 spring boot 1.x대에서는 pom.xml에서 Common Logging관련 의존성을 exlusion 시키고 SLF4j 의존성을 추가하여 사용했습니다.
      • spring 5부터는 Jakarta Commons Logging(JCL) module을 통해 compile 시점에 Commons Logging을 Log4j2(Logger)나 SLF4j(Logging facade)로 변경합니다.

     

     

     


     

    [Logger]

    • Application 개발자가 Log를 남기기 위해 주로 사용하게 되는 도구입니다.
      • Logger의 종류는 JUL, Log4j2, Logback 등이 있으며 spring boot는 Logback을 기본으로 사용합니다.
      • Logger API -> Logging facade (SLF4j) -> Logger(LogBack) 순서에 걸쳐 Log가 찍힙니다.
      • 의존성을 확인해보면 Logback은 slf4j의 구현체 이고 java util logger나 log4j의 요청을 hooking 해서 slf4j로 보내도록 하고 있습니다. slf4j는 Logback으로 보내서 최종적으로 log를 남깁니다.

     

     

     


    [Log 출력 설정]

    Spring boot에 출력되는 로그 정보

    1. 일시 : 로그가 찍힌 시점이며 YYYY-MM-DD HH:MM:SS.ms 형식으로 기록합니다.
    2. Log event level : 총 6단계의 log event level이 있습니다.
      1. trace : debug보다 세밀한 log를 남깁니다.
      2. debug : application debugging에 유용한 log를 남깁니다.
      3. info : application의 진행 상태를 대략적으로 알 수 있도록 log를 남깁니다.
      4. warn : 현재는 문제가 없으나 잠재적으로 위험할 수 있는 요소들에 대해 log를 남깁니다.
      5. error : application 오류가 발생할 경우 log를 남깁니다.
      6. fatal : application이 종료될 정도의 심각한 오류가 발생할 경우 log를 남깁니다.
    3. process id
    4. thread name
    5. full package path, class name
    6. log message

     

     

    출력할 Log event level의 변경

    Debug level로 log를 출력하고자 하는 경우 Run/Debug Configurations 메뉴에서 VM options에 -Ddebug를 주거나 Program Arguments에 --debug를 줍니다.

    (참고로 debug level로 설정하면 container,  Hibernate, Spring. Boot에 대한 log가 찍히는데, 만약 모든 log를 보고싶다면 log event level을 trace로 변경하면 됩니다.)

     

     

     

    Log를 colorful하게 출력하기

    application.properties file에 다음 key value pair를 추가합니다.

    spring.output.ansi.enabled=always

     

     

    Log를 file로 출력하기

    spring boot log 출력 위치는 기본으로 console입니다. 만약 file에 log를 출력하고자 하는 경우에는 application.properties file에 다음 key value pair를 추가합니다.

    #지정된 log file에 log를 씁니다.
    logging.file={*.log}
    
    #spring.log file을 특정 directory에 작성합니다.
    loging.path={/log_directory_name}

    log file은 10mb에 도달하면 기존 log file은 따로 보관하고 새로운 log file로 대체하여 작성합니다. log file 용량은 설정 가능합니다.

     

     

    Log level 변경하기

    출력되는 log level을 변경하기 위해 application.properties file에 다음의 key value pair를 추가합니다. 지정된 package 이하에서 발생하는 모든 log의 level을 변경합니다.

    logging.level.{package} = {log level}

     

     

     


    [Logger를 사용하여 Log 출력]

    Log 출력을 debug level로 진행하여 출력을 테스트 해보도록 하겠습니다. 우선 application.properties에 다음의 key, value pair를 추가해줍니다.

    logging.level.me.dave=DEBUG
    

     

    Log로 properties file의 내용을 출력해볼 예정입니다. application.properties file에 다음의 내용을 추가합니다.

    dave.name=Dave
    dave.full-name=${dave.name} Kim

     

    Property 접근용 bean을 생성하기 위한 class를 선언합니다.

    @Component
    @ConfigurationProperties("dave")
    public class AccessProperties {
        String name;
    
        String fullName;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getFullName() {
            return fullName;
        }
    
        public void setFullName(String fullName) {
            this.fullName = fullName;
        }
    
    }
    

     

     

    Runner class에 logger를 추가합니다.

    @Component
    public class AppRunner implements ApplicationRunner {
    
        @Autowired
        private AccessProperties accessProperties;
    
        private Logger logger = LoggerFactory.getLogger(AppRunner.class);	//	①
        
        public void run(ApplicationArguments args) throws Exception {
            
            //	②
            logger.info("=========================================");
            logger.info("name: "+accessProperties.getName());
            logger.info("fullName: "+accessProperties.getFullName());
            logger.info("=========================================");
        }
    }
    

    ① Logger를 추가합니다.

    ② Logger를 사용하여 log를 출력합니다.

     

     

    다음은 application을 실행한 결과입니다.

    result

    Logger를 통해 출력하고자 했던 message가 출력됩니다.

     

     

     

     


    [Log 설정 file의 사용]

    Logging과 관련된 전반저인 설정이 필요한 경우 log 설정 file을 사용할 수 있습니다. 각 logger에 대한 설정 file은 다음과 같습니다.

    1. Logback : logback-spring.xml (recommended)
    2. Log4J2 : log4j2-spring.xml
    3. JUL : logging.properties (not recommended)
    4. Logback extention :
      • profile <springProfile name={profile}>
      • Environment property <springPropert>

    (참고) https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-logging

     

     

    Logback의 Log 설정 file인 logback-spring.xml은 classpath에 위치하면 되고 상황에 맞춰서 설정을 변경해주면 됩니다. 여기서는 reference site의 설정을 그대로 사용하고 logger만 위에서 생성한 logger로 변경해보도록 하겠습니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
        <logger name="me.dave" level="DEBUG"/>
    </configuration>

    별도의 log 설정 file에서 logger를 지정했으니 application.properties file에 지정된 logger 관련 property(logging.level.me.dave=DEBUG)는 제거해줍니다.

     

    위의 log 설정 file에서 profile에 따라 log 정책을 변경하도록 설정할 수 있고, Environment property를 사용하여 dynamic 하게 설정할 수도 있습니다.

     

     

     

     

     


    [Logger 변경하기]

    Logback에서 Log4j2로 logger를 변경해보도록 합니다.

    우선 더 이상 Logback을 사용하지 않을 것이므로 classpath에 추가했던 Logback용 log 설정 file(logback-spring.xml)을 제거합니다.

    application.properies file에 다시 현재 test중인 package에 대해 debug level로 log를 찍도록 다음의 key, value pair를 추가해 줍니다.

    logging.level.me.dave=DEBUG
    

     

    다음과 같이 pom.xml file의 내용을 수정하여 logger에 대한 의존성을 변경합니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>me.dave</groupId>
        <artifactId>SpringExample</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-parent</artifactId>
            <version>2.2.7.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <!--① loggerback 의존성 제외 시작-->
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
                <!--① loggerback 의존성 제외 끝-->
            </dependency>
            
            <!--② log4j2 의존성 추가 시작-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
            </dependency>
            <!--② log4j2 의존성 끝-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

     

    이후 application을 실행하면 의도한 대로 실행됨을 확인할 수 있습니다.

    'Spring > Spring boot' 카테고리의 다른 글

    [10] Spring Web MVC: Introduction  (0) 2020.06.15
    [09] Test  (0) 2020.06.10
    [07] Profile  (0) 2020.06.03
    [06] 외부 설정 file (Property)  (0) 2020.06.01
    [05] Spring Application  (0) 2020.05.28

    댓글

Designed by Tistory.