본문 바로가기

Study/Setting & Tip

DAY 142. Log4j

Log4j

 

log

로그란?

: 상태가 변경되거나, 소프트웨어의 에러/동작 등 이벤트 등을 기록하는 것

 

로그 활용?

: 시스템에 문제가 발생할 때 원인 분석, 사용자 이용 행위 기록 분석 등에 사용된다.

 

 

log framework ?

- 모니터링해서 다양한 분산 처리 환경에 분산되어 있는 log를 수집한다.

- 대부분은 파일 형태로 만들어 관리한다.

- log는 애플리케이션의 동작에 대해 구체적으로 설명할 수 있어야 한다.

- log 수집 시, 기존 성능에 영향을 주지 않아야 한다. (로그인 한다고 해서 성능에 저하가 있어서는 안되는 것처럼)

- log 수집에 있어서 어느 환경에서도 유연하게 수집 할 수 있어야 한다.

이런 기능을 제공해주는 것을 log 프레임 워크라고 한다.

 

각 프로그램마다 고유의 log 프레임 워크가 있는데,

JAVA 같은 경우는 프레임 워크가 다양하다. (Log4j, SLF4J, logback, ...)

 

* SLF4J (Simple Logging Facade for Java)

: Log4j나 logback에 접근할 수 있는 API로써 같이 사용한다.

직접 Log4j를 사용하는 것이 아니라 SLF4J를 통해서 Log4j를 사용한다고 보면 된다.

Facade(건물의 외관은 볼 수 있지만, 내부는 볼 수 없는 것처럼) 패턴이 적용된 것이다.

로그인 관련 프레임 워크에 쉽게 접근할 수 있도록 앞단에 있는 인터페이스라고 생각하면 된다.

 

 

"Application에서 SLF4J 인터페이스 호출 -> SLF4J 내부에서 -> Log4j 를 사용한다."

 

- 이렇게 사용하면 Log4j를 사용하다가 logback으로 log프레임 워크를 변경해야 된다면 쉽게 바꿀 수 있다. - 실제 사용자가 쓰던 코드에는 변화가 없다.

 

 


 

1. Log4j 라이브러리 다운 받기

https://mvnrepository.com/search?q=log4j

 

Maven repository에서 log4j 검색

 

 

▲ core와 API가 함께 달려오는 Binding 버전 다운로드

 

 

https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl/2.17.1

 

버전은 가장 최신 버전인 2.17.1 버전 다운로드

 

클립보드에 복사하고 mybatis 프로젝트의 pom.xml 파일에 추가

 

(log4j version2 이 log4j 2.x~~ 로 시작하는 버전들이다. 1.x~~ 버전은 log4 version 1. 이다.)

 

	<!-- log4j, loggin 관련 라이브러리 -->
	<dependency>
	    <groupId>org.apache.logging.log4j</groupId>
	    <artifactId>log4j-slf4j-impl</artifactId>
	    <version>2.17.1</version>
	    <scope>test</scope>
	</dependency>

 

작성 후, Alt + F5 로 Maven Project 새로 업데이트하고 나서

 

 

 

Pakage Explorer에서 Maven Dependencies를 보면 이렇게 log4j 관련 jar 파일이 추가된 것을 확인할 수 있다.

 

 

 

2. xml 파일(설정 파일) 만들기

https://logging.apache.org/log4j/2.x/manual/configuration.html

 

Log4j – Configuring Log4j 2

Configuration Inserting log requests into the application code requires a fair amount of planning and effort. Observation shows that approximately 4 percent of code is dedicated to logging. Consequently, even moderately sized applications will have thousan

logging.apache.org

 

 

새롭게 XML 파일을 하나 만든다.

 

반드시 log4j2.xml  파일 이름으로 만들어야 한다.

그래야 프로젝트 실행할 때, 이 파일을 읽을 수 있다.

 

▼ 기본 구조

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="INFO">
    <Appenders>
    </Appenders>
    <Loggers>
    </Loggers>
</Configuration>

 

 

▼ 완성 xml

 

◆ <Configuration> : log4j 최상단의 설정 태그

 

<Configuration> STATUS 속성 : LOG 설정 파일을 읽어 갈 때, 발생하는 로그들을 찍어주는 레벨

DEBUG -> 설정 파일을 실제로 읽어가면서 발생하는 로그들을 출력

INFO -> 로그들이 출력되지 않는다.

-> 개발할 때는 대부분 DEBUG 으로 해놓고 개발하면서 필요한 로그들을 확인해가면서 개발한다.

-> 실제 배포할 때는 INFO로 설정한다.

 

 

◆ <Appenders> : log 출력 위치를 지정하는 태그(콘솔, 파일, OutputStream, ...)

    ◇ <Console> :  sts 안에 console에서 출력하겠다.

          ◇ <PatternLayout> : 로그 출력 포맷 지정

    ◇ <File> : mybatis > target 최상위에 fileName 속성에 지정한대로 test.log 파일이 생성된 것을 확인할 수 있다.

 

 

◆ <Root> : 일반적인 로그 정책을 의미 

 

일반적인 로그 정책

** FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL **

 

1. FATAL : 개발자가 직접 하는게 아니라 시스템에서 심각한 문제가 발생할 경우 출력됨, 애플리케이션 동작이 불가능할 경우 알려주기 위해서 출력

2. ERROR : 일반적으로 실행하다가 혹은 요청 처리 중에 runtime error나 exception 등 을 알려주기 위해 출력

3. WARN : 경고, 에러는 아니지만 개발 시 주의해야 할 사항. 문제가 될 수도 있어서 향후 시스템 에러의 원인이 될 수 있을 때 출력

4. INFO : 일반 적인 정보(사용자의 시스템 이용 행위, 상태 값이 어떻게 바뀌는 지 등)를 출력

-> 개발하면서 보던 정보는 필요 없을 경우에 INFO로 찍고 서버에 배포

5. DEBUG : 개발하면서 INFO보다 조금 더 상세하게 확인할 수 있는 정보를 얻기 위해 출력

6. TRACE : DEBUG보다 상세한 내용 출력(에러 발생의 경로 추적 등)

7. ALL : 전부 출력

 

- 레벨을 지정하면, 본인 포함해서 자기보다 높은 레벨의 로그들은 모두 콘솔에 출력한다.

- 지정한 레벨 등급 이상의 로그만 출력되도록 할 수 있다.

- "X로그는 어느 상황에서 찍히면 좋겠다" 라고 해서 개발자가 판단해서 해당하는 레벨로 log 찍어본다.

이 설정된 것에 따라서 정보들을 출력할 수 있다.

 

 

 

 

기존 test.log 파일 지우고

이렇게 폴더 생성경로 지정을 입력하고 test 실행해보면 log 폴더가 따로 생성된 것을 볼 수 있다.

 

 

3. 내가 직접 지정한 log 출력해보기

3-1.  pom.xml에서 <scope> test </scope> 부분 지우기

 

3-2. App.java

 

간단하게 로그 찍어보기

logger 객체(<- import org.slf4j.Logger; ) 사용해서 로그를 찍을 수 있다.

 

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// 1번 방법

public class App{
  private static Logger log = LoggerFactory.getLogger(App.class);
    
    public static void main(String[] args){
    	log.info("로깅 테스트");
    }

}

// 2번 방법(Lombok 라이브러리가 추가되어있다고 가정할 경우)
// outline에 logger가 static final로 자동으로 추가된다.

@Slf4j
public class App{
  
    public static void main(String[] args){
    	log.info("로깅 테스트");
    }

}

===================================[CONSOLE]===================================

[INFO] 2022-01-10 22:07:12.33 [main] 패키지명(지정한 레벨까지만).App main - 로깅 테스트 -

 

 

 

의미

[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{3} %M -%msg - %n

 

%level : 로그 정책 레벨

%d{형식} : 날짜{날짜의 형식}

%t : 스레드의 이름

%c{단계} : 패키지{최대5개단계까지}

%M : 실행하고 있는 메소드 이름

%msg : 로그 메세지

%n : 줄바꿈(개행)


 

총 정리