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 |