콘텐츠로 이동

2021 07 26

2021-07-26

Logback vs SLF4J vs Log4J2

  • Open Source Library 사용하기 시작! - Log4J 두등등장 - Log Levels - debug/error/info - Appenders - File / Console / Rolling File / JDBC / SMTP - Formatting도 지원!
  • Log4J 좋다 이거야 근데 Java1.4 Logger에서 다 바꿀라니까 뇌절 지름길 - Facade 패턴 등장! - 인터페이스만 뒤지게 정의해놓고 실제 찐 콘크리트 클래스가 할일 함 - SLF4J 두둥등장 - API 같은 거야! JDBC 기억나지? 약간 고런 갬성
  • 현재 가장 유명한 라이브러리 - Logback - Log4J2
  • 그냥 안쓰고 SLF4J 쓰는이유? - Logback을 쓰던 Log4J2를 쓰던 SLF4J가 뚝딱 정리해줌
  • 추천 로깅 전략 - Use SLF4J! - 찐 로그 남기는 친구는 Logback 혹은 Log4J2 - Logback이 쪼꼼 더 인기 좋음 - Log4J2가 쪼꼼 더 기능 많아 - Lazy Loading message 같은거 - Async Loggind 같은거

스프링부트에서 로깅하기

  • 스프링 부트는 로깅 라이브러리 딸려와요 써봅시다 - spring-boot-starter-web - spring-boot-starter-logging - spring-jcl - Logback으로 찐 로그 찍음
    public Class Controller {
        Logger logger = LoggerFactory.getLogger(Controller.class);
    
        @RequestMapping("/")
        public String something() {
            logger.trace("logSthing");
            return "Hello world";
        }       
    }
    

    - 로거 팩토리에서 getLogger => 찐 로그하는 클래스가 어디인지 - SLF4J를 사용합니다

  • Log Level 설정! - property 파일에서 로그 레벨에 따라 출력 설정해줌
    logging.level.root=TRACE //이러면 찐으로 스프링 시작할때도 싹 다 트레이스레벨 우르르나와
    
    logging.level.root=INFO
    logging.level.webhosting.webhosting=TRACE
    
  • XML 설정! - 스프링 부트는 클래스패쓰에 있는 특정 XML 파일이 있나 살펴봄 - logback.xml, logback-spring.xml 등 - base.xml 상속받아서 사용하자!
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/base.xml"/>
        <logger name="org.springframework.web" level="DEBUG"/>
    </configuration>
    

로깅 공식문서

  • 참고: https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/boot-features-logging.html
  • 로그 포맷 - 기본적으로 다음과 같은 포맷
    2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
    2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
    2014-03-05 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
    2014-03-05 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    

    - 시간 / 로그레벨 / 프로세스ID / --- / 쓰레드 이름 / 발생한 클래스 이름 / 로그 메시지

  • 파일 출력 - 기본적으로 스프링 부트는 콘솔에만 로그 찍지, 파일로 저장 X - 추가적으로 파일로 저장하려면 application.properties에서 logging.file, logging.path에 저장해둬 - logging.file=my.log --> 현재 위치에서 상대경로 해서 저장 - logging.path=/var/log --> 절대 경로로 뚝딱 가능 - 로그 파일 10MB 차면 rotate - 디폴트로는 Error/Warn/Info가 찍힘 - 파일 리밋은 logging.file.max-size로 변경 가능 - 옛날 로그 찍어둔거는 logging.file.max-history로 설정 안해두면 평생 남아
  • 커스텀 로그 설정 - logging.config에서 설정 가능 - Logback: logback-spring.xml, logback.xml로 설정가능

Logback

  • 참고: https://www.baeldung.com/logback
  • Logback Architecture - Logger: 로그 메시지 형식, 로그 메시지 생성을 담당 - Appender: 로그 메시지를 최종 목표에 놓아둠, 하나 이상일 수 있음 - Layout: 메세지 아웃풋 준비
  • 실습 따라쳐보기 - classpath에 logback.xml 넣기
    <configuration>
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <root level="debug">
            <appender-ref ref="STDOUT" />
        </root>
    </configuration>
    

    - main 메서드에서 logger쳐보기

    public class Example {
    
        private static final Logger logger 
          = LoggerFactory.getLogger(Example.class);
    
        public static void main(String[] args) {
            logger.info("Example log from {}", Example.class.getSimpleName());
        }
    }
    

    - console output

    20:34:22.136 [main] INFO Example - Example log from Example