[Spring] log4j 로그를 효율적으로 사용

Log4j


- 자바에서 로그를 효율적으로 남기기 위한 라이브러리
- 디버그, 로깅등의 용도로 사용된다.

 

Log4j의 구조


Logger 
로그 메세지를 작성, Appender에게 전달한다.
Appender
로그를 출력하는 위치 결정(콘솔, 파일, DB 등)
Layout
Appender로 로그 생성전에 메세지를 어떤 형식으로 기록할지 설정한다.


※ 주의 
main과 test 안에 resources폴더 내부에 log4j.xml로 위의 설정을 변경할 수 있다.
java소스가 test와 main인지 구별해서 설정해야 한다.

 

Log4j 레벨

로그 레벨 설명
OFF 로그를 끈다.
FATAL 치명적 에러
ERROR 에러
WARN 주의
INFO 일반 정보
DEBUG 디버깅 정보
TRACE 더 자세한 디버깅 정보
ALL 모든 로그를 보여줌

아래서부터 오름차순으로 레벨을 가지며 출력 레벨 설정에 따라 설정레벨 이상의 로그가 출력된다.
예를 들어 레벨 설정을 WARN이라고 설정 하면 WARN, ERROR, FATAL만 출력 된다.

 

Log4j설정


pom.xml에서 라이브러리 추가 (기본적으로 존재하고 버전을 바꾸는게 아니면 안해도 된다.)

1
2
3
4
5
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.13.3</version>
</dependency>
cs

 

log4j.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
    <!-- Appenders -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p: %c - %m%n" />
        </layout>
    </appender>
    
    <!-- Application Loggers -->
    <logger name="com.tody.lovely" >
        <level value="info" />
    </logger>
    
    <!-- 3rdparty Loggers -->
    <logger name="org.springframework.core">
        <level value="info" />
    </logger>
    
    <logger name="org.springframework.beans">
        <level value="info" />
    </logger>
    
    <logger name="org.springframework.context">
        <level value="info" />
    </logger>
 
    <logger name="org.springframework.web">
        <level value="info" />
    </logger>
 
    <!-- Root Logger -->
    <root>
        <priority value="warn" />
        <appender-ref ref="console" />
    </root>
    
</log4j:configuration>
cs

log4j.xml의 기본값

 

Appender 설정


(콘솔)

1
2
3
4
5
6
7
    <!-- Appenders -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p: %c - %m%n" />
        </layout>
    </appender>
cs

<appender>
name : appender 이름 (나중에 logger에서 사용)
class : 출력할 형식에 대한 값 

<param>
여러가지 param을 설정할 수 있다. 설정에 대한 변수명 이다.
name : 변수명
value : 값

<layout>
로그를 출력할 형태를 설정할 수 있다. PatternLayout을 많이 사용한다.
내부의 <param>태그를 이용하여 패턴을 원하는 형식으로 바꿀 수 있다.


Appender 설정 (파일)
로그는 기본적으로 콘솔로 찍히지만 로그 내용을 파일로 저장할 수 있다.

1
2
3
4
5
6
    <appender name="rock_log" class="org.apache.log4j.FileAppender">
        <param name="file" value="./note/log/rock.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p: %c - %m%n" />
        </layout>
    </appender>
cs

<param>
name="file" : 저장할 파일의 경로를 작성할 때 param태그에 name속성을 file로 해야 한다.
value="path(경로)" : 저장할 파일의 경로

 

Logger 설정

1
2
3
4
    <logger name="com.mycompany.model">
        <level value="all" />
        <appender-ref ref="rock_log"/>
    </logger>
cs

<logger>
로그의 레벨과 설정한 appender를 적용할 영역을 지정한다.

<level>
로그 레벨을 설정한다.

<appender-ref>
위에서 작성한 Appender를 참조한다.

<appender>에서 작성한 내용(출력방법, 레이아웃, 패턴 설정 등)을 가지고 <logger>에서 그 설정된 내용을 가져다 사용한 다.

※ 만약 여기서 설정되지 않는 영역에서 Log4j를 사용할 경우 아래의 <root>설정을 따른다. 

1
2
3
4
    <root>
        <priority value="info" />
        <appender-ref ref="console" />
    </root>
cs

 

 

실행 테스트

위의 xml 설정대로 마무리를 했다면 자바코드에서 확인할 수 있다.

import org.apache.log4j.Logger;
import org.junit.Test;

public class LogTest {
	// Logger 인스턴스 생성
	Logger log = Logger.getLogger(this.getClass());
	Logger log1 = Logger.getLogger("로그 찍힐 이름");
	
	@Test
	public void test() {
    	// log.level(message)
		log.info(this.getClass());
		log1.info(log1.getName());
	}
}

 

1. Logger.getLogger()에는 자신클래스, 혹은 원하는 문자열로 매개변수를 넣어서 생성한다.
2. log.level(message)를 넣어주면 log4j.xml에서 설정해 놓은 방식대로 로그가 출력된다.

결과

INFO : com.mycompany.service.LogTest - class com.mycompany.service.LogTest
INFO : 로그 찍힐 이름 - 로그 찍힐 이름

 

 

 

댓글

Designed by JB FACTORY