2022. 1. 7. 00:21ㆍJava
배우고 이해한 내용을 정리하는 글로써 틀린 부분이 있을 수 있습니다. 잘못된 점이 있으면 댓글로 남겨주시면 감사하겠습니다.
로깅(Logging)이란 시스템의 작동 정보인 로그(Log)를 기록하는 행위를 말한다. 시스템이 작동할 때 시스템의 작동 상태의 기록과 보존, 이용자의 습성 조사 및 시스템 동작의 분석 등을 하기 위해 작동 중의 각종 정보를 기록해둘 필요가 있는데, 이 기록을 만드는 것을 로깅이라 한다. 즉, 로그 시스템의 사용에 관계된 일련의 사건을 시간의 경과에 따라 기록하는 것이다. 실행한 프로그램의 이름, 콘솔로부터의 키인, 이상 사태 발생, 정지 상태, 컴퓨터의 사용 시간, 입출력 장치의 사용 개시와 사용 종료 시간 등을 기록하는 것으로 이렇게 해서 기록된 것을 로그라고 한다. 출처: 해시넷 위키
간단히 말하자면 로깅은 프로그램의 상태정보를 문자로 찍어서 개발자가 개발 및 유지보수를 용이하게 하는 행위이다. 자바에서 로깅을 하기 위해서는 로그를 찍는 프레임워크가 필요하다. 그 종류와 개념을 알아보자
Logging Framework
1) Log4J
2) Java Logging API
3) tinylog
4) Logback
5) Apache Commons Logging (JCL)
6) SLF4J
로깅 프레임워크는 이렇게 6개로 구분할 수 있다.
1~4까지는 로깅 프레임워크 타입으로 구분되지만, JCL과 SLF4J는 Logging Wrapper로 그 구분이 좀 다르다.
Logging Wrapper는 그 자체로 사용이 불가능하고 구현체인 다른 로깅 프레임워크가 필요하다. 쉽게 얘기하자면 Logging Wrapper는 하나의 인터페이스로 다양한 로깅 프레임워크를 하나의 Logging Wrapper로 사용이 가능하다.
또한, JCL과 SLF4J 퍼사드 패턴(Facade Pattern)으로 처리된다. 퍼사드 패턴은 위키백과에 따르면 소프트웨어 공학 디자인 패턴 중 하나이며, 객체 지향 프로그래밍 분야에 자주쓰이는 개념으로 Facade는 "건물의 정면"을 의미하며, 클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체라고 정의한다. 즉, 클라이언트의 요청을 처리하기 위해서 이벤트별로 복잡한 로직들이 필요한데 이를 하나의 간략화된 인터페이스로 받아서 공통으로 처리한다는 개념이다. 퍼사드 패턴과 관련해서는 따로 정리해서 포스팅할 예정이다.
그래서 정리하자면 1) ~ 4)은 로깅 프레임워크 구현체이고 JCL과 SLF4J는 그것 자체로 로깅 프레임워크로 사용할 수 있는 것이 아니라 다른 로깅 프레임워크 구현체 API를 사용해서 접근할 수 있도록 해주는 추상화 계층이다. 따라서, Logging Wrapper로 로깅 프레임워크 구현체를 받아 로그 처리를 한다면, 로깅 이벤트가 발생할 시 해당 요청은 Logging Wrapper를 통해 요청을 받고 실제로 호출되어 로그 이벤트를 처리하는 것은 구현체인 로깅 프레임워크가 처리한다. 이를 좀더 자세히 알아보기 위해서 Logging Wrapper인 SLF4J에 대해서 알아보자
SLF4J(Simple Logging Facade For Java)
SLF4J는 Facade라는 이름에서 알 수 있듯이 여러 로깅 구현체를 추상화한 인터페이스이다. 인터페이스만을 제공하며, 여러 구현체를 사용할 수 있다. SLF4J의 경우 구현체를 컴파일 타임에 정한다. 다른 Logging Wrapper인 JCL의 경우엔 SLF4J와 달리 런타임에 구현체를 정한다는 차이점이 있다. 또한 위에서도 설명했지만 SLF4J는 추상 로깅 프레임워크이므로 단독으로는 사용할 수 없으며 구현체로 다른 로깅 프레임워크가 필요하다.
SLF4J는 기본적으로 세 가지 모듈을 바탕을 동작한다. (API / Binding / Bridging)
1) SLF4J API
- 로깅 프레임워크의 인터페이스로 퍼사드 패턴 형식을 취한다.
- slf4j-api-{version}.jar
- org.slf4j.Logger
- org.slf4j.LoggerFactory
2) SLF4J Binding(.jar)
- SLF4J 인터페이스와 로깅 프레임워크 구현체를 바인딩하는 어댑터 역할을 한다.
- 사용하길 원하는 로깅 프레임워크에 대한 SLF4J 바인딩을 추가해야 한다. (반드시 한개만 사용)
- logback: logback-classic (logback-classic은 logback의 구현체인 logback-core를 포함하고 있다.)
- log4j: slf4j-log4j12
3) SLF4J Bridging Modules
- 다른 로깅 API의 logger 호출을 SLF4J 인터페이스롤 연결하여 결과적으로 SLF4J가 바인딩하는 로깅 라이브러리를 사용하도록 하는 역할을 한다.
- 주의할 점으로 Binding과 Bridge가 같은 종류의 logger일 경우에는 무한 루프가 발생할 수 있다.
+) Logging Framework
- 실제 Log를 기록할 Logger이자 구현체
- logback: logback-core
- log4j: log4j-core
정리
SLF4J의 동작을 정리하자면, 로깅 이벤트 발생시 Bridge 모듈로 연결해둔 로깅 프레임워크에 대한 호출일 경우 Bridge로 연결된 SLF4J API를 호출하다. SLF4J는 인터페이스일 뿐이므로 구현체로 바인딩한 프레임워크에서 로직을 처리한다. 만약 Bridge와 Binding이 동일한 로깅 프레임워크일 경우 무한루프가 발생할 수 있으므로 사용에 주의해야한다.
References
* https://gmlwjd9405.github.io/2019/01/04/logging-with-slf4j.html
* https://yeon-kr.tistory.com/156
'Java' 카테고리의 다른 글
[자바] JDK & JRE & JVM (0) | 2022.01.11 |
---|---|
[자바] Logback 구동 방식 및 classpath 설정 (0) | 2022.01.08 |
[자바] static과 static final (0) | 2021.12.17 |
[자바] 메모리 관리 - 스택 & 힙 (+가비지컬렉션) (0) | 2021.12.08 |