init
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
package com.eactive.eai.rms.common.logging;
|
||||
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Before;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Aspect
|
||||
@Component
|
||||
public class EntityServiceLoggingAspect {
|
||||
|
||||
@Pointcut("execution (* com.eactive.eai.data.jpa.AbstractDataService+.*(..))")
|
||||
public void executionEntityServicePointcut() {
|
||||
|
||||
}
|
||||
|
||||
@Before("executionEntityServicePointcut()")
|
||||
public void entityService(JoinPoint joinPoint) {
|
||||
Logger logger = LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringType());
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("{}", joinPoint.getSignature().toShortString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,158 @@
|
||||
package com.eactive.eai.rms.common.logging;
|
||||
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.aspectj.lang.annotation.After;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.eactive.eai.rms.common.datasource.DataSourceContextHolder;
|
||||
import com.eactive.eai.rms.common.datasource.DataSourceType;
|
||||
import com.eactive.eai.rms.common.datasource.DataSourceTypeManager;
|
||||
import com.eactive.eai.rms.common.login.SessionManager;
|
||||
import com.eactive.eai.rms.common.util.StringUtils;
|
||||
|
||||
@Aspect
|
||||
@Component
|
||||
public class RequestParameterLoggingAspect {
|
||||
|
||||
@Autowired
|
||||
UserAccessLoggerDaoImpl dao;
|
||||
|
||||
final String sep = ", ";
|
||||
|
||||
@Pointcut("execution(* com.eactive.eai.rms.common.interceptor.*Interceptor.preHandle (..))")
|
||||
public void log() {
|
||||
}
|
||||
|
||||
@After(value = "com.eactive.eai.rms.common.logging.RequestParameterLoggingAspect.log()")
|
||||
public void afterLog(JoinPoint joinPoint) {
|
||||
Object[] args = joinPoint.getArgs();
|
||||
|
||||
HttpServletRequest request = null;
|
||||
Object controller = null;
|
||||
String type = null;
|
||||
String sub = "*";
|
||||
String msg = null;
|
||||
String id = null;
|
||||
StringBuffer params = new StringBuffer();
|
||||
|
||||
for (Object arg : args) {
|
||||
if (arg instanceof HttpServletRequest) {
|
||||
request = (HttpServletRequest) arg;
|
||||
id = SessionManager.getUserId(request);
|
||||
if (id == null || "".equals(id)) {
|
||||
id = request.getParameter("EmployeeNumber");
|
||||
}
|
||||
}
|
||||
|
||||
if (arg.getClass().getName().contains("Controller")) {
|
||||
controller = arg;
|
||||
type = controller.getClass().getSimpleName();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
msg = request.getParameter("cmd");
|
||||
if (msg == null) {
|
||||
msg = request.getParameter("scr_name");
|
||||
}
|
||||
|
||||
for (@SuppressWarnings("rawtypes")
|
||||
Enumeration enu = request.getParameterNames(); enu
|
||||
.hasMoreElements(); ) {
|
||||
String parameterName = (String) enu.nextElement();
|
||||
params.append("{");
|
||||
params.append(parameterName + "="
|
||||
+ request.getParameter(parameterName));
|
||||
params.append("} ,");
|
||||
}
|
||||
|
||||
DataSourceType dt = null;
|
||||
try {
|
||||
dt = DataSourceContextHolder.getDataSourceType(request);
|
||||
} catch (Exception e1) {
|
||||
e1.printStackTrace();
|
||||
dt = DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.MONITORING);
|
||||
}
|
||||
|
||||
//SKIP
|
||||
if (type != null) {
|
||||
// 대시보드, 메뉴, 승인 관련 로그는 Controller 를 너무 많이 사용하기 때문에 제외시킨다.
|
||||
if (type.startsWith("Dashboard") || type.startsWith("MenuRender")
|
||||
|| type.startsWith("Approve") || type.startsWith("NewDashboard")
|
||||
|| type.startsWith("checkSession")) { // checkSession 제외 YYJ
|
||||
return;
|
||||
}
|
||||
//HTTP 상태정보 모니터링 생략
|
||||
if ("HttpStatusController".equals(type)) {
|
||||
if ("ALL_LIST".equals(msg)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
//SOCKET 상태정보 모니터링 생략
|
||||
if ("SocketStatus2Controller".equals(type)) {
|
||||
if ("SELECT_LIST".equals(msg)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 거래처리 온라인 컨트롤러 도 로그가 빈번하기 때문에 제외시킨다.
|
||||
// 공통코드(콤보박스 값조회) 도 제외.
|
||||
if ("TransactionOnlineController".equals(type)) {
|
||||
if ("MAIN_LIST".equals(msg)
|
||||
|| "DETAIL_LIST".equals(msg)) {
|
||||
return;
|
||||
}
|
||||
} else if ("CommonCodeAndNameController".equals(type)) {
|
||||
return;
|
||||
} else if ("MainController".equals(type)) {
|
||||
String uri = request.getRequestURI();
|
||||
if (uri.indexOf(request.getContextPath() + "/preMain.do") > -1) {
|
||||
// preMain.do 로그 쌓기
|
||||
msg = "preMain.do";
|
||||
} else if (uri.indexOf(request.getContextPath() + "/rms/logout.do") > -1) {
|
||||
// /rms/logout.do 로그 쌓기
|
||||
msg = "rms/logout.do";
|
||||
} else if (StringUtils.defaultString(msg, "").equals("") || "null".equals(msg)) {
|
||||
return;
|
||||
}
|
||||
} else if ("MenuController".equals(type)) {
|
||||
if ("POSITION".equals(msg) || "MENU_AUTH".equals(msg) || "GET_MENU_ID".equals(msg)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// cmd 나 scr_name 이 없는 경우 uri 저장
|
||||
if (msg == null) {
|
||||
msg = request.getRequestURI().replace(request.getContextPath(), "");
|
||||
}
|
||||
|
||||
if (dao != null) {
|
||||
try {
|
||||
HashMap<String, String> param = new HashMap<String, String>();
|
||||
param.put("schemaId", dt == null ? "" : dt.getSchema());
|
||||
param.put("id", id);
|
||||
param.put("userIp", request.getRemoteAddr());
|
||||
param.put("type", type);
|
||||
param.put("sub", sub);
|
||||
param.put("msg", msg);
|
||||
param.put("params", params.toString());
|
||||
dao.addUserAccessLog(param); //실제로는 저장을 하고 있지 않음
|
||||
} catch (Exception e) {
|
||||
System.err.println("id[" + id + "]");
|
||||
System.err.println("type[" + type + "]");
|
||||
System.err.println("sub[" + sub + "]");
|
||||
System.err.println("params[" + params.toString() + "]");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,404 @@
|
||||
package com.eactive.eai.rms.common.logging;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.aspectj.lang.Signature;
|
||||
import org.aspectj.lang.annotation.After;
|
||||
import org.aspectj.lang.annotation.AfterReturning;
|
||||
import org.aspectj.lang.annotation.AfterThrowing;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Before;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.aspectj.lang.reflect.MethodSignature;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import com.eactive.eai.rms.common.logging.RequestReportStopWatch.TaskInfo;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Aspect("percflow(doFilter())")
|
||||
@Slf4j
|
||||
public class RequestReportAspect {
|
||||
|
||||
private static final char LINE_SEPARATOR = '\n';
|
||||
private static final String BANNER_START = "»»ᅳEᅳᅳMᅳᅳSᅳ ᅳRᅳᅳEᅳᅳQᅳᅳUᅳᅳEᅳᅳSᅳᅳTᅳ ᅳRᅳᅳEᅳᅳPᅳᅳOᅳᅳRᅳᅳTᅳ ᅳSᅳᅳTᅳᅳAᅳᅳRᅳᅳTᅳ►";
|
||||
private static final String BANNER_END = "»»ᅳEᅳᅳMᅳᅳSᅳ ᅳRᅳᅳEᅳᅳQᅳᅳUᅳᅳEᅳᅳSᅳᅳTᅳ ᅳRᅳᅳEᅳᅳPᅳᅳOᅳᅳRᅳᅳTᅳ ᅳEᅳᅳNᅳᅳDᅳ►";
|
||||
|
||||
private static final int LOG_LIMIT_COUNT = 1;
|
||||
|
||||
protected Logger requestMappingLogger;
|
||||
private StringBuilder logBuilder;
|
||||
private StringBuilder indent;
|
||||
private RequestReportStopWatch requestReportStopWatch;
|
||||
|
||||
@Pointcut("call (* javax.servlet.FilterChain.doFilter(..)) "
|
||||
+ " && within(com.eactive.eai.rms.common.filter.MonitoringFrontFilter)")
|
||||
public void doFilter() {
|
||||
|
||||
}
|
||||
|
||||
@Pointcut("execution(@org.springframework.web.bind.annotation.RequestMapping * com.eactive.eai.rms..*.*(..)) "
|
||||
+ " || execution(@org.springframework.web.bind.annotation.GetMapping * com.eactive.eai.rms..*.*(..)) "
|
||||
+ " || execution(@org.springframework.web.bind.annotation.PatchMapping * com.eactive.eai.rms..*.*(..)) "
|
||||
+ " || execution(@org.springframework.web.bind.annotation.PostMapping * com.eactive.eai.rms..*.*(..)) "
|
||||
+ " || execution(@org.springframework.web.bind.annotation.PutMapping * com.eactive.eai.rms..*.*(..)) ")
|
||||
public void controllerPointcut() {
|
||||
// pointcut
|
||||
}
|
||||
|
||||
@Pointcut("(@within(org.springframework.stereotype.Component) "
|
||||
+ "|| @within(org.springframework.stereotype.Service) "
|
||||
+ "|| @within(org.springframework.stereotype.Repository) "
|
||||
+ "|| within(com.eactive.eai.data.jpa.AbstractDataService+) "
|
||||
+ "|| within(com.eactive.eai.rms.common.base.BaseService+) "
|
||||
+ ") "
|
||||
+ "&& !within(com.eactive.eai.rms.common.interceptor..*) "
|
||||
+ "&& !within(com.eactive.eai.rms.common.logging..*) "
|
||||
+ "&& !within(com.eactive.eai.rms.common.datasource..*) "
|
||||
+ "&& !within(com.eactive.eai.rms.data.config..*) "
|
||||
+ "&& !execution(String com.eactive.eai.rms.data.entity.man.menu.MenuService.buildPositionString(..)) "
|
||||
+ "&& cflowbelow(doFilter()) "
|
||||
+ "&& ( "
|
||||
+ " execution(* com.eactive.eai.rms..*.*(..)) "
|
||||
+ "|| call(* com.eactive.eai.data.BaseRepository+.*(..))) ")
|
||||
public void cflowbelowPointcut() {
|
||||
// pointcut
|
||||
}
|
||||
|
||||
@Before("doFilter()")
|
||||
public void beforeDoFilter(JoinPoint joinPoint) {
|
||||
|
||||
if (!log.isTraceEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
logBuilder = new StringBuilder();
|
||||
logBuilder.append(LINE_SEPARATOR);
|
||||
logBuilder.append(BANNER_START).append(LINE_SEPARATOR);
|
||||
indent = new StringBuilder();
|
||||
|
||||
if (joinPoint.getArgs() != null && joinPoint.getArgs().length > 0
|
||||
&& joinPoint.getArgs()[0] instanceof HttpServletRequest) {
|
||||
requestParameterLogging((HttpServletRequest) joinPoint.getArgs()[0]);
|
||||
}
|
||||
|
||||
requestReportStopWatch = new RequestReportStopWatch(joinPoint.getSignature().toString());
|
||||
requestReportStopWatch.start();
|
||||
}
|
||||
|
||||
@Before("controllerPointcut()")
|
||||
public void beforeControllerPointcut(JoinPoint joinPoint) {
|
||||
|
||||
if (!log.isTraceEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
requestMappingLogger = LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringType());
|
||||
|
||||
String taskInfoId = indent.toString() + joinPoint.getSignature().toString();
|
||||
TaskInfo taskInfo = requestReportStopWatch.getTaskInfoMap().get(taskInfoId);
|
||||
|
||||
if (taskInfo == null || taskInfo.getStartCount() < LOG_LIMIT_COUNT) {
|
||||
logBuilder
|
||||
.append(indent)
|
||||
.append(joinPoint.getSignature().toString())
|
||||
.append(" : start time : ")
|
||||
.append(requestReportStopWatch.getTime());
|
||||
argumentLogging(joinPoint);
|
||||
logBuilder.append(LINE_SEPARATOR);
|
||||
} else if (taskInfo.getStartCount() < LOG_LIMIT_COUNT + 1) {
|
||||
logBuilder.append(indent).append("...\n");
|
||||
}
|
||||
|
||||
requestReportStopWatch.startTask(taskInfoId);
|
||||
logBuilder.append(LINE_SEPARATOR);
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void requestParameterLogging(HttpServletRequest request) {
|
||||
logBuilder.append(request.getRequestURI()).append(" start!!");
|
||||
|
||||
logBuilder.append(LINE_SEPARATOR).append("request parameters : ");
|
||||
|
||||
for (@SuppressWarnings("rawtypes")
|
||||
Enumeration enu = request.getParameterNames(); enu.hasMoreElements();) {
|
||||
String parameterName = (String) enu.nextElement();
|
||||
logBuilder.append("{");
|
||||
logBuilder.append(parameterName + "=" + request.getParameter(parameterName));
|
||||
logBuilder.append("} ,");
|
||||
}
|
||||
logBuilder.append(LINE_SEPARATOR);
|
||||
}
|
||||
|
||||
@Before("cflowbelowPointcut()")
|
||||
public void beforeCflowbelowPointcut(JoinPoint joinPoint) {
|
||||
|
||||
if (!log.isTraceEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
indent.append(' ');
|
||||
String taskInfoId = indent.toString() + joinPoint.getSignature().toString();
|
||||
TaskInfo taskInfo = requestReportStopWatch.getTaskInfoMap().get(taskInfoId);
|
||||
|
||||
if (taskInfo == null || taskInfo.getStartCount() < LOG_LIMIT_COUNT) {
|
||||
logBuilder
|
||||
.append(indent)
|
||||
.append(joinPoint.getSignature().toString())
|
||||
.append(" : start time : ")
|
||||
.append(requestReportStopWatch.getTime());
|
||||
argumentLogging(joinPoint);
|
||||
logBuilder.append(LINE_SEPARATOR);
|
||||
} else if (taskInfo.getStartCount() < LOG_LIMIT_COUNT + 1) {
|
||||
logBuilder.append(indent).append("...\n");
|
||||
}
|
||||
|
||||
requestReportStopWatch.startTask(taskInfoId);
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
@AfterThrowing(pointcut = "cflowbelowPointcut()", throwing = "t")
|
||||
public void afterThrowingCflowbelowPointcut(Throwable t, JoinPoint joinPoint) {
|
||||
|
||||
if (!log.isTraceEnabled()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
String taskInfoId = indent.toString() + joinPoint.getSignature().toString();
|
||||
TaskInfo taskInfo = requestReportStopWatch.getTaskInfoMap().get(taskInfoId);
|
||||
if (taskInfo != null && taskInfo.getStartCount() < LOG_LIMIT_COUNT + 1) {
|
||||
afterThrowing(t, joinPoint);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
@AfterReturning(pointcut = "cflowbelowPointcut()", returning = "o")
|
||||
public void afterReturningCflowbelowPointcut(Object o, JoinPoint joinPoint) {
|
||||
|
||||
if (!log.isTraceEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
String taskInfoId = indent.toString() + joinPoint.getSignature().toString();
|
||||
TaskInfo taskInfo = requestReportStopWatch.getTaskInfoMap().get(taskInfoId);
|
||||
if (taskInfo != null && taskInfo.getStartCount() < LOG_LIMIT_COUNT + 1) {
|
||||
afterReturning(o, joinPoint);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
@After("cflowbelowPointcut()")
|
||||
public void afterCflowbelowPointcut(JoinPoint joinPoint) {
|
||||
|
||||
if (!log.isTraceEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
String taskInfoId = indent.toString() + joinPoint.getSignature().toString();
|
||||
TaskInfo taskInfo = requestReportStopWatch.getTaskInfoMap().get(taskInfoId);
|
||||
|
||||
if (taskInfo != null && taskInfo.getStartCount() < LOG_LIMIT_COUNT + 1) {
|
||||
logBuilder
|
||||
.append(taskInfoId)
|
||||
.append(" : end duration : ")
|
||||
.append(requestReportStopWatch.getTime())
|
||||
.append(LINE_SEPARATOR);
|
||||
}
|
||||
|
||||
indent.delete(indent.length() - 1, indent.length());
|
||||
requestReportStopWatch.stopTask(taskInfo);
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
@After("controllerPointcut()")
|
||||
public void afterControllerPointcut(JoinPoint joinPoint) {
|
||||
|
||||
if (!log.isTraceEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
String taskInfoId = indent.toString() + joinPoint.getSignature().toString();
|
||||
TaskInfo taskInfo = requestReportStopWatch.getTaskInfoMap().get(taskInfoId);
|
||||
|
||||
if (taskInfo != null && taskInfo.getStartCount() < LOG_LIMIT_COUNT + 1) {
|
||||
logBuilder
|
||||
.append(taskInfoId)
|
||||
.append(" : end duration : ")
|
||||
.append(requestReportStopWatch.getTime())
|
||||
.append(LINE_SEPARATOR);
|
||||
}
|
||||
|
||||
requestReportStopWatch.stopTask(taskInfo);
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
@After("doFilter()")
|
||||
public void afterDoFilter(JoinPoint joinPoint) {
|
||||
|
||||
if (!log.isTraceEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
requestReportStopWatch.stop();
|
||||
|
||||
logBuilder.append(requestReportStopWatch.print());
|
||||
logBuilder.append(LINE_SEPARATOR).append(BANNER_END);
|
||||
|
||||
if (requestMappingLogger != null && requestMappingLogger.isTraceEnabled()) {
|
||||
requestMappingLogger.trace(logBuilder.toString());
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void argumentLogging(JoinPoint joinPoint) {
|
||||
Object[] args = joinPoint.getArgs();
|
||||
if ((args != null) && (args.length > 0)) {
|
||||
Signature signature = joinPoint.getSignature();
|
||||
|
||||
if (signature instanceof MethodSignature) {
|
||||
MethodSignature ms = (MethodSignature) signature;
|
||||
String[] parameterNames = ms.getParameterNames();
|
||||
logBuilder.append(" arguments (");
|
||||
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
Object arg = args[i];
|
||||
|
||||
argumentLogging(parameterNames[i], arg);
|
||||
|
||||
if (i + 1 < args.length) {
|
||||
logBuilder.append(", ");
|
||||
}
|
||||
}
|
||||
logBuilder.append(")");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void argumentLogging(String parameterName, Object arg) {
|
||||
if (arg instanceof Map) {
|
||||
Map<?, ?> map = (Map<?, ?>) arg;
|
||||
Set<?> set = map.keySet();
|
||||
logBuilder.append(parameterName).append("(").append(set.size()).append(")");
|
||||
} else if (arg instanceof Collection) {
|
||||
Collection<?> collection = (Collection<?>) arg;
|
||||
logBuilder.append(parameterName).append("(").append(collection.size()).append(")");
|
||||
} else {
|
||||
logBuilder.append(arg);
|
||||
}
|
||||
}
|
||||
|
||||
private void afterThrowing(Throwable t, JoinPoint joinPoint) {
|
||||
try {
|
||||
logBuilder
|
||||
.append(indent)
|
||||
.append(joinPoint.getSignature().toString())
|
||||
.append(" : throw ")
|
||||
.append(t.getClass().getName())
|
||||
.append(LINE_SEPARATOR);
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void afterReturning(Object o, JoinPoint joinPoint) {
|
||||
try {
|
||||
Signature signature = joinPoint.getSignature();
|
||||
|
||||
if (signature instanceof MethodSignature) {
|
||||
MethodSignature ms = (MethodSignature) signature;
|
||||
|
||||
Class<?> returnType = ms.getReturnType();
|
||||
|
||||
if (!void.class.equals(returnType)) {
|
||||
logBuilder.append(indent).append(joinPoint.getSignature().toString()).append(" returning ");
|
||||
|
||||
if (o instanceof ModelAndView) {
|
||||
modelAndViewLogging((ModelAndView) o);
|
||||
} else if (o instanceof Collection) {
|
||||
Collection<?> collection = (Collection<?>) o;
|
||||
logBuilder.append(returnType.getName()).append(" (").append(collection.size()).append(")");
|
||||
} else if (o instanceof Map) {
|
||||
Map<?, ?> map = (Map<?, ?>) o;
|
||||
Set<?> set = map.keySet();
|
||||
logBuilder
|
||||
.append(returnType.getName())
|
||||
.append(" (")
|
||||
.append(set.size())
|
||||
.append(") : ")
|
||||
.append(set);
|
||||
} else if (o instanceof Iterable) {
|
||||
logBuilder.append(returnType.getName()).append(" Iterable");
|
||||
} else {
|
||||
logBuilder.append(returnType.getName()).append(" = ").append(o);
|
||||
}
|
||||
|
||||
logBuilder.append(LINE_SEPARATOR);
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
log.trace("", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void modelAndViewLogging(ModelAndView modelAndView) {
|
||||
Map<String, Object> model = modelAndView.getModel();
|
||||
|
||||
if (modelAndView.isReference()) {
|
||||
logBuilder.append("reference to view with name '").append(modelAndView.getView()).append("'");
|
||||
} else {
|
||||
logBuilder.append("materialized View is [").append(modelAndView.getView()).append(']');
|
||||
}
|
||||
|
||||
logBuilder.append("; model is ").append("\n");
|
||||
|
||||
modelLogging(logBuilder, model);
|
||||
}
|
||||
|
||||
private void modelLogging(StringBuilder buf, Map<String, Object> model) {
|
||||
if (model != null) {
|
||||
for (Iterator<String> it = model.keySet().iterator(); it.hasNext();) {
|
||||
Object key = it.next();
|
||||
Object o = model.get(key);
|
||||
|
||||
if (o instanceof java.util.Collection) {
|
||||
Collection<?> collection = (Collection<?>) o;
|
||||
buf.append(key).append("(").append(collection.size()).append(")").append(",\n");
|
||||
} else if (o instanceof java.util.Map) {
|
||||
Map<?, ?> map = (Map<?, ?>) o;
|
||||
buf.append(key).append("(").append(map.size()).append(")").append(",\n");
|
||||
} else {
|
||||
buf.append(key).append(",\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.eactive.eai.rms.common.logging;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* 선언된 모든 클래스에서는 flowLog가 적용되지 않음.
|
||||
*
|
||||
* @author presales
|
||||
*
|
||||
*/
|
||||
@Target({ ElementType.TYPE, ElementType.METHOD })
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface RequestReportIgnore {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
package com.eactive.eai.rms.common.logging;
|
||||
|
||||
import java.text.NumberFormat;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang3.time.StopWatch;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Synchronized;
|
||||
|
||||
public class RequestReportStopWatch {
|
||||
private static final long NANO_2_MILLIS = 1000000L;
|
||||
@Getter
|
||||
private String id;
|
||||
@Getter
|
||||
private Map<String, TaskInfo> taskInfoMap = new LinkedHashMap<>();
|
||||
|
||||
private long startTimeNanos;
|
||||
private long totalTimeNanos;
|
||||
private boolean started;
|
||||
|
||||
public RequestReportStopWatch(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Object getTime() {
|
||||
return (System.nanoTime() - startTimeNanos) / NANO_2_MILLIS;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
startTimeNanos = System.nanoTime();
|
||||
started = true;
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
long lastTime = System.nanoTime() - this.startTimeNanos;
|
||||
this.totalTimeNanos += lastTime;
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
public void startTask(String taskName) {
|
||||
if (!started) {
|
||||
throw new IllegalStateException("start() 를 먼저 실행 하세요.");
|
||||
}
|
||||
|
||||
TaskInfo taskInfo = taskInfoMap.get(taskName);
|
||||
if (taskInfo == null) {
|
||||
taskInfo = new TaskInfo(taskName);
|
||||
taskInfoMap.put(taskName, taskInfo);
|
||||
taskInfo.getStopWatch().start();
|
||||
} else {
|
||||
if (taskInfo.getStopWatch().isSuspended()) {
|
||||
taskInfo.getStopWatch().resume();
|
||||
}
|
||||
}
|
||||
|
||||
taskInfo.startCount = taskInfo.startCount + 1;
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
public void stopTask(TaskInfo taskInfo) {
|
||||
taskInfo.stopCount = taskInfo.stopCount + 1;
|
||||
|
||||
if (taskInfo.startCount == taskInfo.stopCount && !taskInfo.stopWatch.isSuspended()) {
|
||||
taskInfo.stopWatch.suspend();
|
||||
}
|
||||
}
|
||||
|
||||
public String print() {
|
||||
long totalTimeMillis = totalTimeNanos / NANO_2_MILLIS;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb
|
||||
.append("RequestReportStopWatch '")
|
||||
.append(getId())
|
||||
.append("': running time = ")
|
||||
.append(totalTimeNanos)
|
||||
.append("(")
|
||||
.append(totalTimeMillis)
|
||||
.append(" ms)");
|
||||
sb.append('\n');
|
||||
sb.append("---------------------------------------------\n");
|
||||
sb.append("ms % c Task name\n");
|
||||
sb.append("---------------------------------------------\n");
|
||||
NumberFormat nf = NumberFormat.getNumberInstance();
|
||||
nf.setMinimumIntegerDigits(9);
|
||||
nf.setGroupingUsed(false);
|
||||
|
||||
NumberFormat pf = NumberFormat.getPercentInstance();
|
||||
pf.setMinimumIntegerDigits(3);
|
||||
pf.setGroupingUsed(false);
|
||||
|
||||
NumberFormat cf = NumberFormat.getNumberInstance();
|
||||
cf.setMinimumIntegerDigits(3);
|
||||
cf.setGroupingUsed(false);
|
||||
|
||||
for (TaskInfo task : taskInfoMap.values()) {
|
||||
sb.append(nf.format(task.stopWatch.getTime())).append(" ");
|
||||
sb.append(pf.format((double) task.stopWatch.getTime() / totalTimeMillis)).append(" ");
|
||||
sb.append(cf.format(task.startCount)).append(" ");
|
||||
sb.append(task.getStopWatch().getMessage()).append("\n");
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Getter
|
||||
public static class TaskInfo {
|
||||
private StopWatch stopWatch;
|
||||
private int startCount;
|
||||
private int stopCount;
|
||||
|
||||
public TaskInfo(String taskName) {
|
||||
stopWatch = new StopWatch(taskName);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
package com.eactive.eai.rms.common.logging;
|
||||
|
||||
//import javax.sql.DataSource;
|
||||
//
|
||||
//import org.apache.log4j.Logger;
|
||||
//import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||
//import org.springframework.transaction.annotation.Transactional;
|
||||
//
|
||||
//import com.eactive.eai.rms.common.datasource.DataSourceContextHolder;
|
||||
//import com.eactive.eai.rms.common.datasource.DataSourceType;
|
||||
//import com.eactive.eai.rms.common.datasource.RoutingDataSource;
|
||||
//
|
||||
//public aspect TransactionLoggingAspect percflow(transactionalMethodExecution()) {
|
||||
//
|
||||
// private static final String TRANSACTION_LOGGING = " [TRANSACTION_LOGGING";
|
||||
//
|
||||
// private pointcut executionOfAnyPublicMethodInAtTransactionalType() :
|
||||
// execution(public * ((@Transactional *)+).*(..)) && @this(Transactional);
|
||||
//
|
||||
// private pointcut executionOfTransactionalMethod() :
|
||||
// execution(* *(..)) && @annotation(Transactional);
|
||||
//
|
||||
// protected pointcut transactionalMethodExecution() :
|
||||
// (executionOfAnyPublicMethodInAtTransactionalType()
|
||||
// || executionOfTransactionalMethod())
|
||||
// ;
|
||||
//
|
||||
// private Logger transactionLogger;
|
||||
//
|
||||
// private String transactionStartLocation;
|
||||
// private DataSourceType dataSourceTypeAtTransactionStartLocation;
|
||||
// private DataSourceType currentDataSourceType;
|
||||
//
|
||||
// Object around():transactionalMethodExecution() {
|
||||
// transactionLogger = Logger.getLogger(thisJoinPointStaticPart.getSignature()
|
||||
// .getDeclaringType());
|
||||
// if (transactionLogger.isDebugEnabled()) {
|
||||
//
|
||||
// transactionStartLocation = thisJoinPointStaticPart.getSignature()
|
||||
// + " [line : "
|
||||
// + thisJoinPointStaticPart.getSourceLocation().getLine()
|
||||
// + "]";
|
||||
// dataSourceTypeAtTransactionStartLocation = DataSourceContextHolder.getDataSourceType();
|
||||
// StringBuilder sb = new StringBuilder(TRANSACTION_LOGGING).append(":START]");
|
||||
// sb.append(" start location : ")
|
||||
// .append(transactionStartLocation)
|
||||
// .append("\n");
|
||||
// sb.append('\t')
|
||||
// .append(
|
||||
// "current DataSourceType : "
|
||||
// + dataSourceTypeAtTransactionStartLocation)
|
||||
// .append('\n');
|
||||
//
|
||||
// transactionLogger.debug(sb.toString());
|
||||
// }
|
||||
//
|
||||
// Object returnValue = null;
|
||||
// try {
|
||||
// returnValue = proceed();
|
||||
// } catch (Throwable e) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// if (transactionLogger.isDebugEnabled()) {
|
||||
// StringBuilder sb = new StringBuilder();
|
||||
// sb.append(TRANSACTION_LOGGING).append(":END");
|
||||
// sb.append(" start location : ")
|
||||
// .append(transactionStartLocation)
|
||||
// .append("\n");
|
||||
// transactionLogger.debug(sb.toString());
|
||||
// }
|
||||
//
|
||||
// return returnValue;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * transaction이 시작 된 후 RoutingDataSource에 의해 실제로 DataSource를 lookup할 때의
|
||||
// * DataSource lookup key
|
||||
// * @return
|
||||
// */
|
||||
// after() returning(DataSourceType dataSourceType)
|
||||
// : cflow(transactionalMethodExecution())
|
||||
// && execution (protected Object RoutingDataSource.determineCurrentLookupKey()) {
|
||||
// currentDataSourceType = dataSourceType;
|
||||
// if (transactionLogger.isDebugEnabled()) {
|
||||
// StringBuilder sb = new StringBuilder();
|
||||
// sb.append(TRANSACTION_LOGGING).append(":LOOKUP]");
|
||||
// sb.append(" start location : ")
|
||||
// .append(transactionStartLocation)
|
||||
// .append("\n");
|
||||
// sb.append("\t")
|
||||
// .append("determine current DataSourceType : ")
|
||||
// .append(currentDataSourceType)
|
||||
// .append("\n");
|
||||
// transactionLogger.debug(sb.toString());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * transaction이 시작 된 후 RoutingDataSource에 의해
|
||||
// * 실제로 DataSource가 리턴 될 때의 DataSource
|
||||
// */
|
||||
// after() returning(DataSource dataSource)
|
||||
// : cflow(transactionalMethodExecution())
|
||||
// && execution (* AbstractRoutingDataSource.determineTargetDataSource()) {
|
||||
//
|
||||
// if (transactionLogger.isDebugEnabled()) {
|
||||
// StringBuilder sb = new StringBuilder();
|
||||
//
|
||||
// sb.append(TRANSACTION_LOGGING).append(":DATASOURCE]");
|
||||
// sb.append(" start location : ")
|
||||
// .append(transactionStartLocation)
|
||||
// .append("\n");
|
||||
// sb.append('\t').append("determine target datasource : ").append(
|
||||
// dataSource).append('\n');
|
||||
// sb.append('\t')
|
||||
// .append(
|
||||
// "current DataSourceType : "
|
||||
// + dataSourceTypeAtTransactionStartLocation)
|
||||
// .append('\n');
|
||||
// sb.append("\t")
|
||||
// .append("determine current DataSourceType : ")
|
||||
// .append(currentDataSourceType)
|
||||
// .append("\n");
|
||||
// transactionLogger.debug(sb.toString());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//}
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.eactive.eai.rms.common.logging;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.eactive.eai.rms.common.login.SessionManager;
|
||||
|
||||
public class UserAccessLogger {
|
||||
private static final Logger ACCESS_LOGGER = Logger.getLogger("ACCESS_LOGGER");
|
||||
|
||||
// TYPE
|
||||
// S:succeed, F:fail
|
||||
// I:insert, U:update, D:delete,
|
||||
// L:list, M:Memory Sync
|
||||
|
||||
public static void log(HttpServletRequest request, String type, String sub,
|
||||
String msg) {
|
||||
final String sep = ", ";
|
||||
|
||||
if (type != null) {
|
||||
// 대시보드, 메뉴, 승인 관련 로그는 Controller 를 너무 많이 사용하기 때문에 제외시킨다.
|
||||
if (type.startsWith("Dashboard") || type.startsWith("Menu")
|
||||
|| type.startsWith("Approve") || type.startsWith("NewDashboard")
|
||||
|| type.startsWith("checkSession") ) { // checkSession 제외 YYJ
|
||||
return;
|
||||
}
|
||||
|
||||
// 거래처리 온라인 컨트롤러 도 로그가 빈번하기 때문에 제외시킨다.
|
||||
// 공통코드(콤보박스 값조회) 도 제외.
|
||||
if( "TransactionOnlineManController".equals(type) ) {
|
||||
if( "cmd=MAIN_LIST".equals(msg)
|
||||
|| "cmd=DETAIL_LIST".equals(msg) ) {
|
||||
return;
|
||||
}
|
||||
} else if( "CommonCodeAndNameController".equals(type) ) {
|
||||
return;
|
||||
} else if( "MainController".equals(type) ) {
|
||||
if( "cmd=null".equals(msg)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ACCESS_LOGGER.isInfoEnabled()) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("ID=").append(SessionManager.getUserId(request)).append(sep);
|
||||
sb.append("IP=").append(request.getRemoteAddr()).append(sep);
|
||||
sb.append("TYPE=").append(type).append(sep);
|
||||
sb.append("SUB=").append(sub).append(sep);
|
||||
sb.append("MSG=").append(msg).append(sep);
|
||||
sb.append("URI=").append(request.getRequestURI());
|
||||
ACCESS_LOGGER.info(sb.toString());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.eactive.eai.rms.common.logging;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import com.eactive.eai.rms.common.base.SqlMapClientForMonitoringTemplateDao;
|
||||
|
||||
@Repository("userAccessLoggerDao")
|
||||
public class UserAccessLoggerDaoImpl extends SqlMapClientForMonitoringTemplateDao {
|
||||
|
||||
public void addUserAccessLog(HashMap<String, String> log) throws Exception {
|
||||
//template.insert("UserAccessLogger.addUserAccessLog", log);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user