로깅
· 컴퓨팅에서 로그파일은 운영 체제나 다른 소프트웨어가 실행 중에 발생하는 이벤트나 각기 다른 사용자의 통신 소프트웨어 간의 메시지를 기록한 파일이다. 로그를 기록하는 행위는 로깅이라고 한다.
=> 흔히 개발할 때 간단하게 파악하기 위해 System.out.println을 통해 결과값을 찍어 보곤 하는데 이것도 로깅이라고 할 수 있다. 로그가 없다면.. 각종 버그나 에러를 어떻게 잡았을지 끔찍하다..
· 로깅을 통해
- 버그에 대해 유용한 정보를 제공할 수 있다.
- 성능에 관한 통계와 정보를 제공할 수 있다.
- 설정이 가능할 때, 로그는 예기치 못한 특정 문제들을 디버그하기 위해, 그 문제들을 처리하도록 코드를 수정하여
다시 적용하지(redeploy) 않아도, 일반적인 정보를 갈무리할 수 있게 한다.
Logger가 System.out.println과 다른점
· 상황별로 Level을 지정하여 Level 별 메세지 선택이 가능하다.
· 응용 프로그램의 실행에 대한 흐름과 에러 확인이 가능
· 프레임워크를 이용해서 간단하고 쉬운 사용환경 조성 가능
· 모듈 별로 유연하게 메세지 출력 가능
· 자유롭게 출력 위치를 변경하고 다양한 출력 형식을 지원한다.
LOG Level
FATAL 매우 심각한 에러, 프로그램이 종료되는 경우가 많다. 종료되면 로그가 남지 않을 수 있어 사용하지 않는게 좋다고 함
ERROR 에러가 발생했지만, 프로그램이 종료되지 않는 경우.
------------------------------------------------------------------ => 의도하지 않는 Exception
WARN 에러가 될 수 있는 잠재적 가능성이 있는 경우. 알람이 오도록 설정하여 에러가 나기 전 조치를 취하거나, 에러가 나면 그 전의 상황을 알 수 있다.
INFO 애플리케이션의 상태를 간결하게 보여주는 경우 => 명확한 의도를 갖는 로그
DEBUG INFO 레벨 보다 더 자세한 정보가 필요한 경우. 권한이 없어 디버깅이 불가능한 경우에 유용
TRACE DEBUG 레벨 보다 더 자세한 정보가 필요한 경우. 개발환경에서 버그를 해결하기 위해 사용한다. 최종 프로덕션이나 커밋에 포함되면 안된다.
SLF4J(Simple Logging Facade for Java)
The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time. (https://www.slf4j.org/index.html)
=> SLF4J는 다양한 로깅 프레임워크에 대해 외관 또는 추상화 역할을 해서 사용자가 배포 시 원하는 로깅 프레임워크를 연결할 수 있도록 합니다.
즉, logback이나 log4j와 같은 로깅 프레임워크에 대해 인터페이스 역할을 하는 라이브러리.
SLF4J 동작 과정

1) Bridge
· 다른 로깅 API로의 Logger 호출을 SLF4J 인터페이스로 연결하여 SLF4J API가 대신 처리할 수 있도록 하는 일종의 어댑터 역할을 하는 라이브러리
· Bridge는 여러개 사용 가능하다. But Bridge와 Binder에 같은 종류의 프레임워크를 사용하면 안됨.
2) API
· 로깅 인터페이스로 사용자가 이 인터페이스를 통해 코드 작성
3) Binding
· Logger로 연결해주는 역할
· Binding은 한가지만 추가되어야 함.
자바 프로젝트에 SLF4J 적용
스프링이나 웹 Project로 만든것이 아니라 자바 프로젝트에 SLF4J 적용을 해봤습니다.
1) 라이브러리 다운로드
· slf4j-api-1.7.36.jar
· slf4j-log4j12-1.7.31jar
· log4j-1.2.15.jar
총 이 세가지 라이브러리를 다운로드 받아서 프로젝트에 추가했습니다.
· slf4j-api-1.7.36.jar
처음 이 jar만 추가하면

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder" 에러가 발생하는데 api가 인터페이스기 때문에 해당 인터페이스를 구현한 구현체가 없어서 나오는 에러
· slf4j-log4j12-1.7.31jar
이 jar를 추가하면 위의 오류는 없어지고 아래와 같은 오류가 나타납니다.

컴파일 시 log4j 관련 클래스가 참조 되었지만 실행하니 해당 클래스를 찾지 못하기 때문에 발생하는 에러 따라서 아래 실제 log4j 관련 클래스 jar 추가
· log4j-1.2.15.jar
해당 jar를 추가하면 위의 오류는 사라지고 아래 그림과 같은 에러가 발생합니다.

이 에러는 log4j 관련 설정 파일을 읽어오지 못해서 발생하는 에러로 파악했습니다. 그래서 해결 방법들이 WEB-INF 아래 log4j 관련 설정 .xml 파일을 넣거나 CLASSPATH에 log4j 설정 관련 .properties 파일을 넣으면 된다고 했지만 저는 순수 자바 프로젝트를 생성해서 적용을 해보고 싶어 다른 방법을 통해 해결했습니다.
BasicConfigurator.configure();
라는 코드를 추가해서 실행했고 정상적으로 logger가 찍히는 모습을 확인했습니다. 해당 메소드는 아래와 같이 구현되어 있었습니다.

기본적인 설정을 정의해놓은 클래스로 보입니다. 따라서 따로 log4j.xml이라 log4j.properties 파일을 추가하지 않았는데 해당 메서드를 통해 기본 설정을 불러와서 정상적으로 동작하는 것으로 파악됩니다.
느낀점
부족한 점이 많은데 log에 관련해서 작성해 보았고 제가 적용한 방법은 SLF4J라는 Logger 인터페이스를 Log4j라는 logger를 사용하여 구현할 수 있도록 작성해 보았습니다. SLF4J 동작 과정에 각 모듈에 대해 설명이 많이 부족한데 공부해서 풍족한 내용이 될 수 있도록 수정하도록 노력하겠습니다. 또한 얼마 전에 log4j 관련 보안 취약점이 발견된 사건이 있다는데 찾아서 공부할 수 있으면 좋겠습니다.
참고
https://livenow14.tistory.com/63
https://gmlwjd9405.github.io/2019/01/04/logging-with-slf4j.html
'Backend' 카테고리의 다른 글
| Gradle에 대해서 (0) | 2022.02.28 |
|---|---|
| 자바 프로젝트에 Gradle 빌드 툴 적용 (0) | 2022.02.28 |
| 스프링 입문 - 스프링 빈과 의존관계 (0) | 2021.08.24 |
| 스프링 입문 - 코드로 배우는 스프링부트 강의 3일차 (0) | 2021.08.12 |
| 스프링 입문 - 코드로 배우는 스프링부트 강의 2일차 (0) | 2021.08.11 |