2021 07 26
2021-07-26¶
Logback vs SLF4J vs Log4J2¶
- 참고: https://www.youtube.com/watch?v=SWHYrCXIL38
- Java1.4에 기본 Logger 있긴했어 - Log Levels은 다음과 같았음 - info/severe/fine - Handlers - How to handle message? - 근데 구렸어ㅜ
- 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 같은거
스프링부트에서 로깅하기¶
- 참고: https://www.youtube.com/watch?v=lGrcZsw-hKQ
- Use Proper Logging Framework! - Configurable, Log levels, Log destination
- 스프링 부트는 로깅 라이브러리 딸려와요 써봅시다
- 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 파일에서 로그 레벨에 따라 출력 설정해줌
- XML 설정! - 스프링 부트는 클래스패쓰에 있는 특정 XML 파일이 있나 살펴봄 - logback.xml, logback-spring.xml 등 - base.xml 상속받아서 사용하자!
로깅 공식문서¶
- 참고: 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