티스토리 뷰

#MongoDB에도 Log가 들어갈 수 있게 만드는 방법


1. Pom.xml 에 추가


  <!-- MongoDB dependencies -->

    <dependency>

       <groupId>org.mongodb</groupId>

       <artifactId>mongo-java-driver</artifactId>

       <version>3.2.2</version>

    </dependency>

    <!-- Spring WebMVCdependencies -->

    <dependency>

       <groupId>org.springframework.data</groupId>

       <artifactId>spring-data-mongodb</artifactId>

       <version>1.9.1.RELEASE</version>

    </dependency>



2. 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

26

27

28

29

<?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="false"

           socket-timeout="1500"

       />

   

   </mongo:mongo-client>

   <bean id="mongoTemplate"

           class="org.springframework.data.mongodb.core.MongoTemplate">

       <constructor-arg name="mongo" ref="mongo"/>

       <constructor-arg name="databaseName" value="log" />    

   </bean>

</beans>

Colored by Color Scripter

cs


3. 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

42

43

package com.ktds.smahn;

import org.slf4j.Logger;

public abstract class CustomLogger {

   private 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);

   }

   

   public abstract void writeTrace(String msg);

   public abstract void writeDebug(String msg);

   public abstract void writeInfo(String msg);

   public abstract void writeWarn(String msg);

   public abstract void writeError(String msg);

   

}

Colored by Color Scripter

cs


4. 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

package com.ktds.smahn;

import org.slf4j.Logger;

import org.springframework.data.mongodb.core.MongoTemplate;

public class MongoLogger extends CustomLogger {

   private MongoTemplate mongoTemplate;

   

   private MongoLogger(Logger logger) {

       super(logger);

   }

   

   public MongoLogger(Logger logger, MongoTemplate mongoTemplate) {

       super(logger);

   }

   

   public MongoLogger(Logger logger, String mongoTemplateBeanName) {

       super(logger);

   }

   @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) {

       

   }

   

}

Colored by Color Scripter

cs



5. CustomLogger.java 수정

  • Protected 로 바꾸어준다. ( Protected : 상속 관계에서만 쓸 수 있다. CustomLogger를 상속받는 MongoLogger에서 쓸 수 있다. )


6. MongoLogger.java 추가


  1. 생성자 수정


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public MongoLogger(Logger logger, String mongoTemplateBeanName) {

       super(logger);

       setMongoTemplate(mongoTemplateBeanName);

   }

   /* MongoContext안에 있는 mongoTemplateBean을 가지고 오기 */

   private void setMongoTemplate(String mongoTemplateBeanName) {

       

       // Session이 필요하다. 그러면 request가 필요하다. Spring에 깔려있는 request를 가져와서

       HttpServletRequest request =

               ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

       // 세션을 만든다.

       HttpSession session = request.getSession();

       // ServletContext 객체 가져오기

       ServletContext context = session.getServletContext();

       

       WebApplicationContext webContext = WebApplicationContextUtils.getWebApplicationContext(context);

       

       this.mongoTemplate = (MongoTemplate) webContext.getBean(mongoTemplateBeanName);

   }

Colored by Color Scripter

cs


  1. 로그 단계별로 구현


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

   @Override

   protected void writeTrace(String msg) {

       // 1. Level : TRACE, DEBUG, INFO, WARN, ERROR

       // 2. 시간 : 언제 찍혔나..

       // 3. 요청자  : 누가 찍었나..

       // 4. 로그 메시지 : 무엇을 찍었나..

       

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "TRACE");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");

   }

   @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");

       

   }

   @Override

   protected void writeInfo(String msg) {

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "INFO");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");        

   }

   @Override

   protected void writeWarn(String msg) {

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "WARN");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");            

   }

   @Override

   protected void writeError(String msg) {

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "ERROR");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");            

   }

Colored by Color Scripter

cs





7. ArticleController 클래스에서 선언해준다.


어디선가 만들어진 로그백을 받아와야하므로, 컨트롤러에서 로거를 생성해준다.


private Logger logger = LoggerFactory.getLogger(ArticleController.class);

private CustomLogger cLogger;



컨트롤러는 DAO(MongoTemplate)를 가져올 수가 없다. 그렇기 때문에 아래에 “mongoTemplate”에 써준것 처럼 bean id를 직접 준다. 그러면 setMongoTemplate이 실행되어 beanContext에서 mongoTemplate을 가지고 올 것이다.



이렇게 구현해준다.


8. 그리고 이제 한번 실행해보자.


콘솔에도 찍히고,




몽고디비에도 잘 찍힌다.





그런데 이렇게 하면 요청이 있어야만 Log를 불러올 수 있다. 아래와 같이 바꾸면 요청이 없어도 로그를 실행할 수 있다.


9. MongoLogger.java 수정







10. ArticleController 수정





'프레임워크 > Spring' 카테고리의 다른 글

[Mongo DB] Oracle 과 연동하기  (0) 2016.06.03
추상클래스와 인터페이스  (0) 2016.06.03
[Mongo DB] Find  (0) 2016.05.31
[Secure Coding 실습] SQL Injection  (0) 2016.05.30
[Secure Coding 실습] Encoding  (0) 2016.05.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함