본문 바로가기
[ Developer ]/MongoDB

[MongoDB] 몽고디비 이용해 Log 저장

by 김현섭. 2016. 7. 6.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Spring-Data-MongoDB Logback MongoDB에 저장하기

Spring에서 Oracle과 Mongo DB를 같이 사용하기 위해서
이전에 진행했던 Spring Simple Board를 가지고 실습을 진행해본다

기존에 프로젝트에 MongoDB를 연결하기 위해서 Dependency를 추가한다


그리고 mongoContext도 복사를 해서 추가를 해주면 된다

*mongoContext.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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.8.xsd">
 
    <mongo:mongo-client host="localhost" port="27017">
        <mongo:client-options
            connections-per-host="8"
            threads-allowed-to-block-for-connection-multiplier="4"
            connect-timeout="1000"
            max-wait-time="1500"    
            socket-keep-alive="true"
            socket-timeout="1500"        
        />
    </mongo:mongo-client>
    
    <bean id="mongoTemplate"
            class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongo" />   
        <constructor-arg name="databaseName" value="log" />   
    </bean>
    
</beans>
cs


그런 후 패키지 내에 CustomLogger.java를 생성해준다


추상 클래스로 선언을 해주고 내용을 채운다

*CustomLogger.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
import org.slf4j.Logger;
 
public abstract class CustomLogger {
    
    protected Logger logger;
    
    public CustomLogger(Logger logger) {
        this.logger = logger;
    }
    
    public void trace(String msg) {
        logger.trace(msg);
        writeTrace(msg);
    }
    
    public void debug(String msg) {
        logger.debug(msg);
        writeDebug(msg);
    }
    
    public void info(String msg) {
        logger.info(msg);
        writeInfo(msg);
    }
    
    public void warn(String msg) {
        logger.warn(msg);
        writeWarn(msg);
    }
    
    public void error(String msg) {
        logger.error(msg);
        writeError(msg);
    }
    
    protected abstract void writeTrace(String msg);
    protected abstract void writeDebug(String msg);
    protected abstract void writeInfo(String msg);
    protected abstract void writeWarn(String msg);
    protected abstract void writeError(String msg);
}
cs


Logger를 protected는 상속받은 클래스에서 사용을 가능하게 함이다
그리고 CustomLogger를 생성한 위치에 MongoLogger를 생성한다

*MongoLogger.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
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
import org.slf4j.Logger;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;
 
public class MongoLogger extends CustomLogger {
    
    private MongoTemplate mongoTemplate;
    
    private MongoLogger(Logger logger) {
        super(logger);
    }
    
    public MongoLogger(Logger logger, MongoTemplate mongoTemplate) {
        super(logger);
        // MongoTemplate 사용
        this.mongoTemplate = mongoTemplate;
    }
    
    public MongoLogger(Logger logger, String mongoTemplateBeanName) {
        super(logger);
        setMongoTemplate(mongoTemplateBeanName);
    }
    
    private void setMongoTemplate(String mongoTemplateBeanName) {
        // Request 받지 않고 가져오는 방식
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        
        // mongoContext.xml을 가져오는 방법
        HttpSession session = request.getSession();
        ServletContext context = session.getServletContext();
        WebApplicationContext webContext = WebApplicationContextUtils.getWebApplicationContext(context);
        
        this.mongoTemplate = (MongoTemplate) webContext.getBean(mongoTemplateBeanName);
    }
 
    @Override
    public void writeTrace(String msg) {
        
    }
 
    @Override
    public void writeDebug(String msg) {
        
    }
 
    @Override
    public void writeInfo(String msg) {
        
    }
 
    @Override
    public void writeWarn(String msg) {
 
    }
 
    @Override
    public void writeError(String msg) {
        
    }
}
cs

CustomLogger를 상속받고 mongoTemplate을 사용하는 방식이다 MongoLogger에서 Context를 가져오기 위해 setMongoTemplate를 작성한다


이제 상속받은 메소드를 이용해서 Log를 작성한다


로그에 필요한 정보를 정리하면 위와 같다 이제 Map을 이용해서 작성에 필요한 정보들을 입력한다


필요한 정보들을 Map에 담았다 이제는 mongoTemplate을 이용해서 Insert 시키면 된다

*writeTrace Method
1
2
3
4
5
6
7
8
9
10
    @Override
    protected void writeDebug(String msg) {
        Map<String, Object> log = new HashMap<String, Object>();
        log.put("LEVEL""DEBUG");
        log.put("DATETIME"new Date());
        log.put("REQUESTER", logger.getName());
        log.put("MESSAGE", msg);
        
        mongoTemplate.insert(log, "log");
    }
cs

이제 위의 형식을 이용해서 각 5 레벨에 맞게 수정을 해준다
CustomLogger로 인해서 Logger가 찍히고 MongoLogger에 정의된 메소드를 이용해서 MongoDB에도 데이터를 넣을 수 있게 된다
위의 방식은 Sub Class is Super Class 와 같은 방식

이제 ArticleController에 가서 2가지를 만들어야 한다
  1. Logger
    • CustomLogger를 보면 Logger를 생성이 되어 있지 않으므로 생성 후 보내줘야 한다
  2. mongoTemplate

ArticleContrller에서 Logger를 먼저 선언해준다


그런 후 CustomLogger를 추가하며 logger를 넣어준다
이제 MongoLogger에 mongoTemplate를 생성해줘야 한다


MongoLogger에 logger와 Mongo Bean Name을 넣어서 생성을 해준다
이제 컨트롤러에서는 logger를 이용하는 것이 아닌 cLogger를 이용해서 로그를 작성하면 된다


위와 같이 작성하므로 써 CustomLogger에서 info를 찍어준다
이젠 mongoDB를 구동 시키고 (cmd) 페이지에 접근해 로그가 찍히나 확인을 해본다


잘 들어간 것을 볼 수 있다 
만약에 에러가 난다면 URL이 맵핑되어 있는 루트 (/프로젝트명)을 한번 거쳤다가 가면 해결이 된다