This commit is contained in:
Rinjae
2025-09-05 17:16:26 +09:00
commit c54ef1903f
4947 changed files with 817291 additions and 0 deletions
@@ -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);
}
}