Logging
- 정보를 제공하는 일련의 기록인 log를 생성하도록 시스템을 작성하는 활동
- 프린트 줄넣기는 간단한, 보통일시적인 로그를 생성한다.
- 시스템 설계자들은 시스템의 복잡성때문에 로그를 이해하고 사용해야한다.
- 로그가 제공하는 정보의 양은, 이상적으로는 프로그램이 실행되는 중에도, 설정가능해야 한다.
1) logging의 이점
- 로그는 재현하기힘든 버그에 대한 유용한 정보를 제공할 수 있다.
- 로그는 성능에 관한 통계와 정보를 제공할 수 있다.
- 설정이 가능할 때 , 로그는 예기치 못한 특정 문제들을 디버그 하기 위해 그 문제들을 처리하도록 코드를 수정하여 다시 redeploy 하지 않아도, 일반적인 정보를 갈무리할 수 있게 한다.
- System.out.print()
- 출력되는 로그의 양, 수준을 조절할 수 없고, 로그를 파일에 저장할 수 없으며 성능면에서도 굉장히 낮다.
2) 로깅 라이브러리
- Java.util.logging
- JDK 1.4 이후부터 생긴 표준 로그 라이브러리
- 별도의 라이브러리를 추가할 필요가 없다.
- 기능이 타 라이브러리보다는 부족.
- Apache Commons logging
- Log4j
- Apache 재단에서 생성.
- 가장 널리 사용됨.
- Logback
- log4j를 만든이가 좀더 발달시켜 만든 로깅라이브러리.
- log4j의 단점을 보완함
3) SLF4J
- logging관련 라이브러리는 다양한데, 이러한 라이브러리를 하나의 통일된 방식으로 사용할 수 있는 방법을 제공.
- Logging Facade이다. 로깅에 대한 추상레이어를 제공하고 , interface의 모음이다.
- 어떤 라이브러리를 사용하던지 통일된 방법으로 사용할 수 있게 해줌.
- 라이브러리가 변경되어도 메인코드는 변경될 필요가 없다는 장점.
4) Logging
- Appender
- ConsoleAppender : 콘솔에 로그를 어떤 포맷으로 출력할지 설정
- FileAppender : 파일에 로그를 어떤 포맷으로 출력할지 설정.
- RollingFileAppender : 로그를 시간단위로 파일을 분리하여 출력하기위해 설정.
- %-5level : 로그레벨을 5의 고정폭 값으로 출력
- %logger{36} : logger의 이름을 축약해서 출력. 최대 36자리수로 출력
- 로그 출력 메소드
- 문자열결합을 위해 + 연산자를 사용하지 않고 {} , 가변인자 형태로 사용한다.
Log Level
-
- TRACE
- 본문중 디버깅에 필요한 정보를 출력할 때. SW의 유지보수를 용이하게 만들기 위한 목적. (특정 메서드의 한 파트를 tracing하려 할때)
-
- DEBUG
- 본문중 디버깅에 필요한 정보를 출력할 때. SW의 유지보수를 용이하게 만들기 위한 목적. (Trace보다는 중요성있는 정보. ex) 메서드의 시작과 끝)
-
- INFO
- 특정한 이벤트 포인트의 시작과 종료
-
- WARN
- 비정상적인 상황을 만나 복원하여 정상 진행될수있을 때. (Such as switching from a primary to backup server, retrying an operation, missing secondary data, etc.)
-
- ERROR
- 시스템이 유지는 되지만 분명한 문제가 발생했을 때, 부분적으로 오작동했을 가능성이 있을 때 (서비스나 application이 아닌 연산 오류)
- FATAL :치명적인 상황을 맞이하여 시스템이 더이상 유지될 수 없을때 (서비스나 application의 치명적 오류)
참고
[1] when to use different log levels : https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
[2] slf4j log4j level : https://www.slf4j.org/api/org/apache/log4j/Level.html
[2] log, slf4j : https://www.edwith.org/boostcourse-web/lecture/16814/