아키텍처와 함께

블로그 이미지
by gregorio
  • Total hit
  • Today hit
  • Yesterday hit

프로젝트에서 각각 서버에 있는 로그 파일을 조회하고자 한다.

로그 파일 조회화면은 특정 서버에 있고, 특정 서버에서 각각의 서버에 있는 로그 파일을 조회해야 한다.


이때 발생하는 이슈가 Cross Domain 이다.

이를 해결하기 위해 JSONP를 적용하기로 하였다.  서버에 넘기는 파라미터가 많지 않기 때문에 JSONP를 사용해도 이슈가 발생하지 않을것이다.


JQury ajax 호출 시 JSONP를 적용하기 위해 파라미터로 jsonpCallback을 정의하여야 한다.

jsonCallback에 Value를  logCallBack을 주고 Callback 함수를 작성한다.


■ Ajax JSONP 호출 함수

$("#btnSearch").click(function(e) {

    e.preventDefault();

$('#logText').val("");

var targetURL = $("#system option:selected").val();

var logSize = $('#logSize').val();


if (logSize > 1000) {

alert("Log size should be less than 1000");

return false;

}

var sendData = {"logType" : $('#logType').val(), "logSize" : $('#logSize').val()};

//var sendData = "logType=" + $('#logType').val() + "&logSize=" + $('#logSize').val();

    $.ajax({

        type: "POST",

        url: targetURL,

        crossDomain : true,

        data : sendData,

        jsonpCallback : "logCallBack",

        dataType : "jsonp",  //Cross domain

        contentType: "application/json"

    });

});


logCallBack은 서버에 get 방식으로 파라미터로 넘겨지고, 서버에서 결과를 생성할 때 

logCallBack으로 감싸서 내려 보내야 한다.



■logCallBack  함수는 다음과 같다.


  function logCallBack(result) {

debugger;

var lastIdx = result.string.lastIndexOf("}") - 2;

var firstIdx = result.string.indexOf(":") + 2;

var logText = result.string.substring(firstIdx, lastIdx);

alert(logText);


$("#logText").val(logText);

}


logCallBack함수의 result는 String 형식으로 전달되기 때문에 파싱이 필요하다.

서버에서는 보내때 logCallBack 안에 넣기 때문에 Json으로 받을 수 없었다.


서버에서 전달되는 Response는 logCallBack("JSON Data") 형식으로 생성되기 때문이다.


그래서 응답을 받아서 필요한 내용만 잘라서 사용하기로 하였다.



■서버의 로직은 다음과 같다.


@RequestMapping(value = "/log/viewer.do")

public ModelAndView logViewer(String logType, String logSize, String callback) throws Exception {

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

/** Log file location **/

// String logType = params.get("logType") != null ? String.valueOf(params.get("logType")) : "";

String logLocation = null;

if (NullUtil.isNull(logType)) {

logLocation = "log.app.location";

}

else {

logLocation = "log." + logType + ".location";

}

String logFile = PropertyUtil.getString(logLocation);

int logLength =  0;

if (!NullUtil.isNull(logSize)) {

logLength = Integer.parseInt(logSize);

}

else {

logLength =  PropertyUtil.getInt("log.read.line");

}


if (LOGGER.isDebugEnabled()) {

LOGGER.debug("Read log file :: {}", logFile);

}


ModelAndView mav = new ModelAndView("ajaxMultiDataView");

String result = null;

/** Check log file exists **/

File file = new File(logFile);

if (!file.exists()) {

resultMap.put("log", "Log file not found :: " + logFile);

StringBuilder sb = new StringBuilder();

result = sb.append(callback).append("(").append(map2Json(resultMap)).append(")").toString();

return mav.addObject(result);

}

if (!file.canRead()) {

resultMap.put("log", "Log file can't read :: " + logFile);

StringBuilder sb = new StringBuilder();

result = sb.append(callback).append("(").append(map2Json(resultMap)).append(")").toString();

return mav.addObject(result);

}


BufferedReader in = null;

StringBuilder logContent = new StringBuilder();

int idx = 0;

try {

in = new BufferedReader (new InputStreamReader (new ReverseReader(file)));

boolean isLoop = true;

while(isLoop) {

String contents = in.readLine();

logContent.append(contents).append("\n");

if (idx++ >= logLength) {

isLoop = false;

}

}

}

catch(Exception logex) {

logex.printStackTrace();

}

finally {

if (in != null) {

in.close();

}

}

if (logContent.length() <= 0) {

resultMap.put("log", "No Contents");

StringBuilder sb = new StringBuilder();

result = sb.append(callback).append("(").append(map2Json(resultMap)).append(")").toString();

return mav.addObject(result);


}

else {

resultMap.put("log", logContent.toString());

StringBuilder sb = new StringBuilder();

result = sb.append(callback).append("(").append(map2Json(resultMap)).append(")").toString();


}

LOGGER.info("result :: {}", result);

mav.addObject(result);

return mav;

 

서버에서 parameter로 callback을 받으면 클라이언트에서 보낸 logCallBack이 넘어오고 이를 이용하여 클라이언트에 전달할 때 callback으로 감싸서 내려 보내 준다.



테스트 결과는 다음과 같다.


 "logCallBack({"log":"17:02:08.864 [localhost-startStop-1] INFO  org.springframework.web.servlet.DispatcherServlet.initServletBean(503) | FrameworkServlet 'DispatcherServlet': initialization completed in 1043 ms\n17:02:08.775 [localhost-startStop-1] INFO  org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(220) | Mapped \"{[/sample/dataset.do],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}\" onto public java.util.Map<java.lang.String, java.lang.Object> sehati.ibm.sample.controller.MessageController.testDataset(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,java.lang.String,java.lang.String) throws java.lang.Exception\n17:02:08.775 [localhost-startStop-1] INFO  org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(220) | Mapped \"{[/sample/message.do],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}\" onto public java.util.Map<java.lang.String, java.lang.Object> sehati.ibm.sample.controller.MessageController.testMessage(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception\n"})


'Spring Framrwork' 카테고리의 다른 글

spring framework interceptor  (0) 2018.03.02
Google Map javascript API 사용법  (0) 2018.02.07
C3 Bar Chart  (0) 2018.02.05
Spring Batch 모니터링 SQL  (0) 2018.02.03
MybatisBatchWriter 오류 해결방법  (0) 2018.02.03
AND

ARTICLE CATEGORY

분류 전체보기 (56)
Spring Framrwork (33)
Linux (1)
APM (1)
Java (8)
python (0)
ant (1)
chart (1)
OS (1)
tomcat (1)
apache (1)
database (0)

RECENT ARTICLE

RECENT COMMENT

CALENDAR

«   2024/10   »
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

ARCHIVE

LINK