티스토리 뷰
#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>
|
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);
} |
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) {
}
}
|
5. CustomLogger.java 수정
Protected 로 바꾸어준다. ( Protected : 상속 관계에서만 쓸 수 있다. CustomLogger를 상속받는 MongoLogger에서 쓸 수 있다. )
6. MongoLogger.java 추가
생성자 수정
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); } |
로그 단계별로 구현
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"); } |
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
- sql
- facebook 연동
- mybatis
- 글쓰기 버튼
- 제이쿼리
- 자바프로그래밍
- Linear Layout
- aop
- jQuery
- 게시판 만들기
- JSP
- mongo db
- er다이어그램
- 쿼리
- 뒤로가기 버튼
- 클래스
- intent
- ERD
- 포스팅하기
- Erwin
- 메뉴바에 버튼 생성하기
- MVC
- 메소드
- 뉴스피드 가져오기
- query
- spring
- Relative Layout
- 예외처리
- activity
- 배열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |