====== 로그관리 ====== ===== 개요 ===== **로그관리**는 시스템 사용시 발생하는 각종 로그를 검색, 조회하는 기능을 제공한다. ===== 설명 ===== **로그조회**는 시스템로그의 **등록, 조회, 목록, 삭제, 요약**의 기능을 수반한다. ① 로그등록 : 로그정보를 등록한다. - AOP 기능을 이용 ② 로그조회 : 로그정보의 상세내용을 조회한다. ③ 로그목록 : 로그정보의 목록을 검색, 조회한다. ④ 로그삭제 : 로그정보를 삭제한다. - 실행환경의 Scheduling 기능을 이용 ⑤ 로그요약 : 로그정보를 요약하여 Summary를 생성한다. - 실행환경의 Scheduling 기능을 이용 ==== 패키지 참조 관계 ==== 로그관리 패키지는 요소기술의 공통(cmm) 패키지에 대해서만 직접적인 함수적 참조 관계를 가진다. 하지만, 컴포넌트 배포 시 오류 없이 실행되기 위하여 패키지 간의 참조관계에 따라 달력 패키지와 함께 배포 파일을 구성한다. * 패키지 간 참조 관계 : [[egovframework:com:v2:init_pkg_dependency#시스템관리|시스템관리 Package Dependency]] ==== 관련소스 ==== ^유형^대상소스명^비고^ |Controller|egovframework.com.sym.log.lgm.web.EgovSysLogController.java|로그관리를 위한 컨트롤러 클래스| |Service|egovframework.com.sym.log.lgm.service.EgovSysLogService.java|로그관리를 위한 서비스 인터페이스| |ServiceImpl|egovframework.com.sym.log.lgm.service.impl.EgovSysLogServiceImpl.java|로그 관리를 위한 서비스 구현 클래스| |Model|egovframework.com.sym.log.lgm.service.SysLog.java|로그관리를 위한 Model 클래스| |DAO|egovframework.com.sym.log.lgm.service.impl.LogManageDAO.java|로그관리를 위한 데이터처리 클래스| |Aspect|egovframework.com.sym.log.lgm.service.EgovLogManageAspect.java|로그 등록을 위한 Aspect 클래스| |Scheduler|egovframework.com.sym.log.lgm.service.EgovLogManageScheduling.java|로그 삭제, 요약을 위한 Scheduling 클래스| |JSP|/WEB-INF/jsp/egovframework/com/sym/log/lgm/EgovSysLogList.jsp|로그 목록을 위한 jsp페이지| |JSP|/WEB-INF/jsp/egovframework/com/sym/log/lgm/EgovSysLogInqire.jsp|로그 조회를 위한 jsp페이지| |QUERY XML|resources/egovframework/sqlmap/com/sym/log/lgm/EgovSysLog_SQL_Mysql.xml|로그관리 MySQL용 QUERY XML| |QUERY XML|resources/egovframework/sqlmap/com/sym/log/lgm/EgovSysLog_SQL_Oracle.xml|로그관리 Oracle용 QUERY XML| |QUERY XML|resources/egovframework/sqlmap/com/sym/log/lgm/EgovSysLog_SQL_Tibero.xml|로그관리 Tibero용 QUERY XML| |QUERY XML|resources/egovframework/sqlmap/com/sym/log/lgm/EgovSysLog_SQL_Altibase.xml|로그관리 Altibase용 QUERY XML| |Idgen XML|resources/egovframework/spring/context-idgen.xml|로그관리 Id생성 Idgen XML| ==== 클래스 다이어그램 ==== {{:egovframework:com:v2:sym:로그관리_클래스다이어그램.jpg?740|}} ==== ID Generation ==== === ID Generation 관련 DDL 및 DML === * ID Generation Service를 활용하기 위해서 Sequence 저장테이블인 COMTECOPSEQ에 **SYSLOG_ID** 항목을 추가한다. table_name varchar(16) NOT NULL, next_id DECIMAL(30) NOT NULL, PRIMARY KEY (table_name)); INSERT INTO COMTECOPSEQ VALUES('SYSLOG_ID','0'); === ID Generation 환경설정(context-idgen.xml) === ==== 테이블 ==== ^테이블명^테이블명(영문)^비고^ |시스템로그|COMTNSYSLOG|시스템로그 정보를 관리한다.| |시스템로그요약|COMTSSYSLOGSUMMARY|시스템로그 요약정보를 관리한다.| ==== AOP ==== === context-syslogaop.xml === 시스템로그 등록 기능구현을 위하여 [[egovframework:rte:fdl:aop|AOP]]를 설정한다. * 시스템로그 등록 기능구현을 위하여 EgovLogManageAspect 클래스를 생성한다. package egovframework.com.sym.log.lgm.service; import javax.annotation.Resource; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.util.StopWatch; import egovframework.com.cmm.LoginVO; import egovframework.com.cmm.util.EgovUserDetailsHelper; public class EgovSysLogAspect { @Resource(name="EgovSysLogService") private EgovSysLogService sysLogService; /** * 시스템 로그정보를 생성한다. * 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); sysLogService.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); sysLogService.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); sysLogService.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); sysLogService.logInsertSysLog(sysLog); } } } ==== Scheduling ==== === context-scheduling-sym-log-lgm.xml (src/main/resources/egovframework/spring/com/context-scheduling-sym-log-lgm.xml) === 시스템로그 삭제, 요약 기능구현을 위하여 [[egovframework:rte:fdl:scheduling|Scheduling]]을 설정한다. * 시스템로그 삭제, 요약 기능구현을 위하여 EgovLogManageScheduling 클래스를 생성한다. @Service("egovSysLogScheduling") public class EgovSysLogScheduling { @Resource(name="EgovSysLogService") private EgovSysLogService sysLogService; /** * 시스템 로그정보를 요약한다. * 전날의 로그를 요약하여 입력하고, 일주일전의 로그를 삭제한다. * * @param * @return * @throws Exception */ public void sysLogSummary() throws Exception { sysLogService.logInsertSysLogSummary(); } } ===== 관련기능 ===== 로그관리는 **로그 목록조회**, **로그 상세조회** 기능으로 구분된다. ==== 로그 목록조회 ==== === 비즈니스 규칙 === 시스템로그 목록은 페이지 당 10건씩 조회되며 페이징은 10페이지씩 이루어진다. 검색조건은 발생일자와 처리구분에 대해서 수행된다.\\ 시스템로그 상세조회 기능을 수행하기 위해서는 **상세보기** 버튼을 클릭한다. === 관련코드 === N/A === 관련화면 및 수행매뉴얼 === ^Action^URL^Controller method^QueryID^ |목록조회|/sym/log/lgm/SelectSysLogList.do|selectSysLogInf|"SysLogDAO.selectSysLogInf",| | | | |"SysLogDAO.selectSysLogInfCnt"| {{:egovframework:com::sym:log:EgovSysLogList.jpg|}} 조회: 조회하기 위해서는 발생일자/처리구분 조건을 입력한 후 조회 버튼을 클릭한다.\\ 목록클릭: **로그관리 상세조회** 화면으로 이동한다. ==== 시스템로그 상세조회 ==== === 비즈니스 규칙 === 시스템로그 상세조회는 팝업창으로 구성되며, **닫기** 버튼을 클릭하면 창을 닫는다. === 관련코드 === N/A === 관련화면 및 수행매뉴얼 === ^Action^URL^Controller method^QueryID^ |상세조회|/sym/log/lgm/InqireSysLog.do|selectSysLog|"SysLogDAO.selectSysLog"| {{:egovframework:com::sym:log:EgovSysLogInqire.jpg|}} ===== 참고자료 ===== * 실행환경 참조 : [[egovframework:rte:fdl:aop|AOP]] * 실행환경 참조 : [[egovframework:rte:fdl:scheduling|Scheduling]] * 실행환경 참조 : [[egovframework:rte:fdl:id_generation|ID Generation]]