IT/Spring

(Spring) SLF4J와 Logback을 이용한 로그 남기기[2015.04.07]

바바옄 2015. 4. 7. 20:15
반응형

p.155~p162 SLF4J와 Logback을 이용한 로그 남기기

Java 진영에 있는 로깅툴

1. commons-logging

- spring이 이걸로 로그를 찍도록 만들어  - 아파치가 만듬

2. log4j

- 현재 실무에서 가장 많이 쓰이나 logback이 그 자리를 위협하고 있다. 한물 감..

3. java util logging

- 강사님도 못봤음.

4. logback

- 우리가 배울 것 .. 더 빠르고 리소스도 덜 먹음..

 

왜 logback이 사용되고 있는 추세인가?

- system.out.println 한줄 남기는데 io 리소스를 너무 많이 먹어서 시스템이 느려짐

-> log4j는 메모리 관리를 따로해서 io쪽에서 메모리를 많이 안먹고 빠르다.

-> log4j를 막 쓰다 보니.. system.out.println 만큼 리소스를 먹게 된다..

-> 이를 보안하기 위해 logback이 개발 됨.. 현재 폭팔적인 인기!!

 

SLF4J  - 인터페이스

위에 것들은 구현체로 하니, 설정을 복잡하지만 사용하기는 더 편리해졌음.. 오픈소스들이 많이 사용하고 있음... 

이렇게 발생하는 로그들을 빅데이터에 다 집어 넣고.. 분석해야 되는데... 분석하는 기술이 아직까지는 없음.

 

system.out.println은 절대 쓰지 않는다. cuz. 리소스를 너무 많이 잡아 먹는다.

앞으로 log를 사용.

 

SLF4J와 LogBack 설정

 

* commons-logging 추가

1.pom.xml

2. Dependency Hierarchy -> commons-logging 우클릭 -> exclude maven artifact

3. ok

4. pom.xml에 추가 됬는지 확인

 

* slf4j-api : 1.7.12 , jcl-over-slf4j: 1.7.12 , logback-classic 1.1.3 추가 

1. pom.xml

2. Dependency -> add

3. slf4j-api : 1.7.12 , jcl-over-slf4j: 1.7.12 , logback-classic 1.1.3 추가 후 ok -> saves

4. pom.xml에 추가 됬는지 확인

 

console / file 에 로그 남기기

src/main/resources -> logback.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- console로 log 남기기 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                ▶ %-5level %d{HH:mm:ss.SSS} [%thread] %logger[%method:%line] - %msg%n
            </pattern>
        </encoder>
    </appender>
    <appender name="consoleForLoginInterceptor" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                ▷ %-5level %d{HH:mm:ss} %logger[%method:%line] - %msg%n
            </pattern>
        </encoder>
    </appender>
 
 
<!-- file로 log 남기기 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                ▶ %-5level %d{HH:mm:ss.SSS} [%thread] %logger[%method:%line] - %msg%n
            </pattern>
        </encoder>
    </appender>
    
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>d:\testFile.log</file>
        <encoder>
            <pattern>
                ▶ %-5level %d{HH:mm:ss.SSS} [%thread] %logger[%method:%line] - %msg%n
                <!-- [%method:%line] : 어떤 메소드에 어떤 라인에서 찍혔는지 %msg%n : 찍고 싶은 로그-->
            </pattern>
        </encoder>
    </appender>
    
    <!-- class만 따로 지정해서 이 클래스만 로그를 따로 관리할 수 있다. LoginInterceptor class 파일만 따로 로그 관리 -->
    <appender name="fileForLoginInterceptor" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>d:\testRollingFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        
            <!-- d:\ testRollingFile 2015-04-07-15.log 파일 생성 -->
            <fileNamePattern>d:\testRollingFile.%d{yyyy-MM-dd-HH}.log</fileNamePattern>
        
            <!-- 30시간 지난건 지우겠다. -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>
                ▷ %-5level %d{HH:mm:ss} %logger[%method:%line] - %msg%n
            </pattern>
        </encoder>
    </appender>
        
    <!-- 이 아래에 있는 애들 다 log로 찍겠다. -->
    <logger name="com.ktds.mcjang.intercept.LoginInterceptor" level="info">
        <appender-ref ref="fileForLoginInterceptor"/>
    </logger>
    
    <!-- 이 아래에 있는 애들 다 log로 찍겠다. -->
    <logger name="org.springframework" level="info" />
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>
        
</configuration>
cs

Log 출력 파일

src/main/java -> intercept -> Measuringinterceptor.java

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.ktds.mcjang.intercept;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
 
public class Measuringinterceptor extends HandlerInterceptorAdapter{
 
 
    // private transient Logger logger = LoggerFactory.getLogger(Measuringinterceptor.class); 
    // transient 이거 절대 쓰지마.. null 포인터 유발한다.
 
    // Logger은 꼭 private static이 붙어야 한다. getLogger(클래스명.clss) 적어라.
    private static Logger logger = LoggerFactory.getLogger(Measuringinterceptor.class);
    
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        
        // 현재 시간을 가져온다
        long currentTime = System.currentTimeMillis();
        
        //  컨트롤러 -> DS : 응답을 받아주기 위헤
        //  현재 시간을 모델에 넣는다.
        request.setAttribute("bTime", currentTime);
        
        return true;
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        
        //View를 리턴하기 직전 실햄 됨
        
        //현재 시간을 구한다.
        long currentTime = System.currentTimeMillis();
        
        // 요청이 시작된 시간을 가져온다
        long beginTime = (long)request.getAttribute("bTime");
        
        // 현재 시간에서 요청이 시작된 시간을 뺀다.
        // --> 총 처리 시간을 구한다.
        
        long processedTime = currentTime - beginTime;
        
        /*
        // 대부분 실무에서는 debug, info만을 사용 
        logger.trace("Trace 입니다.");
        // 보안상 중요한 자료 - 로그인 과정에서 이사람이 보내준 id와 pwd의 로그
        logger.debug("Debug 입니다.");
        // 다른 사람들이 굳이 봐도 쓸모 없는 것들 - 로그인 성공인지 실패인지, 언제했는지
        logger.info("Info 입니다.");
        logger.warn("Warn 입니다.");
        logger.error("Error 입니다.");
        */
        
        logger.info("요청된 URL : " +request.getRequestURI());
        logger.info("총 처리 시간은 "+processedTime);
        super.afterCompletion(request, response, handler, ex);
    }
}
 
cs
반응형

'IT > Spring' 카테고리의 다른 글

Enum(이늄)  (0) 2015.04.27
동영상, 자막 컨트롤, 큐브 구현  (0) 2015.04.27
(Spring) bean confin 설정 분리하기[2015.04.07]  (0) 2015.04.07
(Spring) Interceptor [2015.04.07]  (0) 2015.04.07
(Spring) 예외처리 [2015.04.07]  (0) 2015.04.07