시스템로그조회는 시스템 사용시 발생하는 각종 로그를 검색, 조회하는 기능을 제공한다.
① 시스템로그등록 : 시스템로그정보를 등록한다. - AOP 기능을 이용 ② 시스템로그조회 : 시스템로그정보의 상세내용을 조회한다. ③ 시스템로그목록 : 시스템로그정보의 목록을 검색, 조회한다. ④ 시스템로그삭제 : 시스템로그정보를 삭제한다. - 실행환경의 Scheduling 기능을 이용 ⑤ 시스템로그요약 : 시스템로그정보를 요약하여 Summary를 생성한다. - 실행환경의 Scheduling 기능을 이용
유형 | 대상소스명 | 비고 |
---|---|---|
Controller | egovframework.com.sym.log.web.EgovLogManageController.java | 시스템로그 관리를 위한 컨트롤러 클래스 |
Service | egovframework.com.sym.log.service.EgovLogManageService.java | 시스템로그 관리를 위한 서비스 인터페이스 |
ServiceImpl | egovframework.com.sym.log.service.impl.EgovLogManageServiceImpl.java | 시스템로그 관리를 위한 서비스 구현 클래스 |
DAO | egovframework.com.sym.log.service.impl.LogManageDAO.java | 시스템로그 관리를 위한 데이터처리 클래스 |
VO | egovframework.com.sym.log.service.SysLogVO.java | 시스템로그 관리를 위한 VO 클래스 |
Aspect | egovframework.com.sym.log.service.EgovLogManageAspect.java | 시스템로그 등록을 위한 Aspect 클래스 |
Scheduler | egovframework.com.sym.log.service.EgovLogManageScheduling.java | 시스템로그 삭제, 요약을 위한 Scheduling 클래스 |
JSP | /WEB-INF/jsp/egovframework/cmm/sym/log/EgovSysLogList.jsp | 시스템로그 목록을 위한 jsp페이지 |
JSP | /WEB-INF/jsp/egovframework/cmm/sym/log/EgovSysLogInqire.jsp | 시스템로그 조회를 위한 jsp페이지 |
테이블명 | 테이블명(영문) | 비고 |
---|---|---|
시스템로그 | COMTNSYSLOG | 시스템로그 정보를 관리 |
시스템로그요약 | COMTSSYSLOGSUMMARY | 시스템로그 요약정보를 관리 |
<bean name="egovSysLogIdGnrService" class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrService" destroy-method="destroy"> <property name="dataSource" ref="dataSource" /> <property name="strategy" ref="sysLogStrategy" /> <property name="blockSize" value="1"/> <property name="table" value="COMTECOPSEQ"/> <property name="tableName" value="SYSLOG_ID"/> </bean> <bean name="sysLogStrategy" class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl"> <property name="prefix" value="SYSLOG_" /> <property name="cipers" value="13" /> <property name="fillChar" value="0" /> </bean>
INSERT INTO COMTECOPSEQ VALUES('SYSLOG_ID','0');
<bean id="logManage" class="egovframework.com.sym.log.service.EgovLogManageAspect" /> <aop:config> <aop:aspect id="logManageAspect" ref="logManage"> <!-- insert로 시작되는 service Method --> <aop:around pointcut="execution(public * egovframework.com..impl.*Impl.insert*(..))" method="logInsert" /> <!-- update로 시작되는 service Method --> <aop:around pointcut="execution(public * egovframework.com..impl.*Impl.update*(..))" method="logUpdate" /> <!-- delete로 시작되는 service Method --> <aop:around pointcut="execution(public * egovframework.com..impl.*Impl.delete*(..))" method="logDelete" /> <!-- select로 시작되는 service Method --> <aop:around pointcut="execution(public * egovframework.com..impl.*Impl.select*(..))" method="logSelect" /> </aop:aspect> </aop:config>
시스템로그 등록 기능구현을 위하여 AOP를 설정한다.
package egovframework.com.sym.log.service; import javax.annotation.Resource; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.util.StopWatch; import egovframework.com.sec.ram.security.userdetails.util.EgovUserDetailsHelper; import egovframework.com.uat.uia.service.LoginVO; public class EgovLogManageAspect { @Resource(name="EgovLogManageService") private EgovLogManageService logManageService; /** * 시스템 로그정보를 생성한다. * sevice Class의 insert로 시작되는 Method * * @param ProceedingJoinPoint * @return Object * @throws Exception */ public Object logInsert(ProceedingJoinPoint joinPoint) throws Throwable { StopWatch stopWatch = new StopWatch(); try { stopWatch.start(); Object retValue = joinPoint.proceed(); return retValue; } catch (Throwable e) { throw e; } finally { stopWatch.stop(); SysLog sysLog = new SysLog(); String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); String processSeCode = "C"; String processTime = Long.toString(stopWatch.getTotalTimeMillis()); String uniqId = ""; String ip = ""; /* Authenticated */ Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); if(isAuthenticated.booleanValue()) { LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); uniqId = user.getUniqId(); ip = user.getIp(); } sysLog.setSrvcNm(className); sysLog.setMethodNm(methodName); sysLog.setProcessSeCode(processSeCode); sysLog.setProcessTime(processTime); sysLog.setRqesterId(uniqId); sysLog.setRqesterIp(ip); logManageService.logInsertSysLog(sysLog); } } /** * 시스템 로그정보를 생성한다. * sevice Class의 update로 시작되는 Method * * @param ProceedingJoinPoint * @return Object * @throws Exception */ public Object logUpdate(ProceedingJoinPoint joinPoint) throws Throwable { StopWatch stopWatch = new StopWatch(); try { stopWatch.start(); Object retValue = joinPoint.proceed(); return retValue; } catch (Throwable e) { throw e; } finally { stopWatch.stop(); SysLog sysLog = new SysLog(); String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); String processSeCode = "U"; String processTime = Long.toString(stopWatch.getTotalTimeMillis()); String uniqId = ""; String ip = ""; /* Authenticated */ Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); if(isAuthenticated.booleanValue()) { LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); uniqId = user.getUniqId(); ip = user.getIp(); } sysLog.setSrvcNm(className); sysLog.setMethodNm(methodName); sysLog.setProcessSeCode(processSeCode); sysLog.setProcessTime(processTime); sysLog.setRqesterId(uniqId); sysLog.setRqesterIp(ip); logManageService.logInsertSysLog(sysLog); } } /** * 시스템 로그정보를 생성한다. * sevice Class의 delete로 시작되는 Method * * @param ProceedingJoinPoint * @return Object * @throws Exception */ public Object logDelete(ProceedingJoinPoint joinPoint) throws Throwable { StopWatch stopWatch = new StopWatch(); try { stopWatch.start(); Object retValue = joinPoint.proceed(); return retValue; } catch (Throwable e) { throw e; } finally { stopWatch.stop(); SysLog sysLog = new SysLog(); String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); String processSeCode = "D"; String processTime = Long.toString(stopWatch.getTotalTimeMillis()); String uniqId = ""; String ip = ""; /* Authenticated */ Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); if(isAuthenticated.booleanValue()) { LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); uniqId = user.getUniqId(); ip = user.getIp(); } sysLog.setSrvcNm(className); sysLog.setMethodNm(methodName); sysLog.setProcessSeCode(processSeCode); sysLog.setProcessTime(processTime); sysLog.setRqesterId(uniqId); sysLog.setRqesterIp(ip); logManageService.logInsertSysLog(sysLog); } } /** * 시스템 로그정보를 생성한다. * sevice Class의 select로 시작되는 Method * * @param ProceedingJoinPoint * @return Object * @throws Exception */ public Object logSelect(ProceedingJoinPoint joinPoint) throws Throwable { StopWatch stopWatch = new StopWatch(); try { stopWatch.start(); Object retValue = joinPoint.proceed(); return retValue; } catch (Throwable e) { throw e; } finally { stopWatch.stop(); SysLog sysLog = new SysLog(); String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); String processSeCode = "R"; String processTime = Long.toString(stopWatch.getTotalTimeMillis()); String uniqId = ""; String ip = ""; /* Authenticated */ Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); if(isAuthenticated.booleanValue()) { LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); uniqId = user.getUniqId(); ip = user.getIp(); } sysLog.setSrvcNm(className); sysLog.setMethodNm(methodName); sysLog.setProcessSeCode(processSeCode); sysLog.setProcessTime(processTime); sysLog.setRqesterId(uniqId); sysLog.setRqesterIp(ip); logManageService.logInsertSysLog(sysLog); } } }
<!-- 시스템 로그 요약 --> <bean id="sysLogging" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="egovLogManageScheduling" /> <property name="targetMethod" value="sysLogSummary" /> <property name="concurrent" value="false" /> </bean> <!-- 시스템 로그 요약 트리거--> <bean id="sysLogTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="sysLogging" /> <!-- 시작하고 1분후에 실행한다. (milisecond) --> <property name="startDelay" value="60000" /> <!-- 매 1시간마다 실행한다. (milisecond) --> <property name="repeatInterval" value="3600000" /> </bean> <!-- 스케쥴러 등록--> <bean id="logSummaryScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="sysLogTrigger" /> <ref bean="webLogTrigger" /> <ref bean="trsmrcvLogTrigger" /> <ref bean="userLogTrigger" /> </list> </property> </bean>
시스템로그 삭제, 요약 기능구현을 위하여 Scheduling을 설정한다.
@Service("egovLogManageScheduling") public class EgovLogManageScheduling { @Resource(name="EgovLogManageService") private EgovLogManageService logManageService; /** * 시스템 로그정보를 요약한다. * 전날의 로그를 요약하여 입력하고, 일주일전의 로그를 삭제한다. * * @param * @return * @throws Exception */ public void sysLogSummary() throws Exception { logManageService.logInsertSysLogSummary(); }
Action | URL | Controller method | QueryID |
---|---|---|---|
목록조회 | /cmm/sym/log/SelectSysLogList.do | selectSysLogInf | “LogManageDAO.selectSysLogInf” |
“LogManageDAO.selectSysLogInfCnt” |
시스템로그 목록은 페이지 당 10건씩 조회되며 페이징은 10페이지씩 이루어진다. 검색조건은 발생일자와 처리구분에 대해서 수행된다.
시스템로그 상세조회 기능을 수행하기 위해서는 상세보기 버튼을 클릭한다.
Action | URL | Controller method | QueryID |
---|---|---|---|
상세조회 | /cmm/sym/log/InqireSysLog.do | selectSysLog | “LogManageDAO.selectSysLog” |
시스템로그 상세조회는 팝업창으로 구성되며, 닫기 버튼을 클릭하면 창을 닫는다.