mjon_git/src/main/java/itn/com/cmm/aspect/LoggerAspect.java
2023-06-12 11:15:02 +09:00

107 lines
4.3 KiB
Java

package itn.com.cmm.aspect;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.json.simple.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;
import com.google.common.collect.Lists;
import itn.com.cmm.util.IpUtil;
@Component
public class LoggerAspect {
private static final Logger log = LoggerFactory.getLogger(LoggerAspect.class);
public Object methodLogger(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
try {
StringBuffer logBuffer = new StringBuffer();
List<Object> logList = Lists.newArrayList();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // request 정보를 가져온다.
String controllerName = proceedingJoinPoint.getSignature().getDeclaringType().getSimpleName();
String methodName = proceedingJoinPoint.getSignature().getName();
logBuffer.append("\n┌ [●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● 요청정보 ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●]\n");
logBuffer.append("│ [Method] URL : [{}] {}\n");
logList.add(request.getMethod());
logList.add(request.getRequestURI());
logBuffer.append("│ Request IP : {}\n");
logList.add(IpUtil.getClientIP(request));
logBuffer.append("│ Request Browser : {}\n");
logList.add(IpUtil.getBrowser(request));
logBuffer.append("│ Controller : [{}] - [{}] \n");
logList.add(controllerName);
logList.add(methodName);
logBuffer.append("│ 요청Param : {}\n");
logList.add(getParams(request));
long start = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
long end = System.currentTimeMillis();
logBuffer.append("│ Time : [{}] sec\n");
logList.add( (double)(end - start)/1000d );
if( result instanceof ModelAndView ) {
logBuffer.append("│ Result : {}\n");
logList.add(result);
}else if( result instanceof String ) {
logBuffer.append("│ View : {}\n");
logList.add(result);
} else {
logBuffer.append("│ Result : {}\n");
logList.add(result);
}
proceedingJoinPoint.getArgs();
logBuffer.append("└ [●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●]");
if(result!=null && result.toString().indexOf("web/com")<0) { // heder, footer, navi 로그는 찍지 않음.
log.info(logBuffer.toString(), logList.toArray());
}
return result;
} catch (Throwable throwable) {
throwable.printStackTrace();
throw throwable;
}
}
/**
* request 에 담긴 정보를 JSONObject 형태로 반환한다.
*
* @param request
* @return
*/
@SuppressWarnings("unchecked")
private static JSONObject getParams(HttpServletRequest request) {
JSONObject jsonObject = new JSONObject();
Enumeration<String> params = request.getParameterNames();
while (params.hasMoreElements()) {
String param = params.nextElement();
String replaceParam = param.replaceAll("\\.", "-");
jsonObject.put(replaceParam, request.getParameter(param));
}
return jsonObject;
}
}