목차

시스템로그조회

개요

시스템로그조회는 시스템 사용시 발생하는 각종 로그를 검색, 조회하는 기능을 제공한다.

설명

  ① 시스템로그등록 : 시스템로그정보를 등록한다. - AOP 기능을 이용 
  ② 시스템로그조회 : 시스템로그정보의 상세내용을 조회한다.
  ③ 시스템로그목록 : 시스템로그정보의 목록을 검색, 조회한다.
  ④ 시스템로그삭제 : 시스템로그정보를 삭제한다. - 실행환경의 Scheduling 기능을 이용
  ⑤ 시스템로그요약 : 시스템로그정보를 요약하여 Summary를 생성한다. - 실행환경의 Scheduling 기능을 이용 

관련 리소스

클래스

유형대상소스명비고
Controlleregovframework.com.sym.log.web.EgovLogManageController.java시스템로그 관리를 위한 컨트롤러 클래스
Serviceegovframework.com.sym.log.service.EgovLogManageService.java시스템로그 관리를 위한 서비스 인터페이스
ServiceImplegovframework.com.sym.log.service.impl.EgovLogManageServiceImpl.java시스템로그 관리를 위한 서비스 구현 클래스
DAOegovframework.com.sym.log.service.impl.LogManageDAO.java시스템로그 관리를 위한 데이터처리 클래스
VOegovframework.com.sym.log.service.SysLogVO.java시스템로그 관리를 위한 VO 클래스
Aspectegovframework.com.sym.log.service.EgovLogManageAspect.java시스템로그 등록을 위한 Aspect 클래스
Scheduleregovframework.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시스템로그 요약정보를 관리

ID Generation

context-idgen.xml
  <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');
 

AOP

context-syslogaop.xml
  <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);
 
    }
 
  }
 
}
 

Scheduling

context-scheduling.xml
  <!-- 시스템 로그 요약  -->
  <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();
  }
 

관련화면 및 수행메뉴얼

시스템로그 목록조회

ActionURLController methodQueryID
목록조회/cmm/sym/log/SelectSysLogList.doselectSysLogInf“LogManageDAO.selectSysLogInf”
“LogManageDAO.selectSysLogInfCnt”

시스템로그 목록은 페이지 당 10건씩 조회되며 페이징은 10페이지씩 이루어진다. 검색조건은 발생일자와 처리구분에 대해서 수행된다.

시스템로그 상세조회 기능을 수행하기 위해서는 상세보기 버튼을 클릭한다.


시스템로그 상세조회

ActionURLController methodQueryID
상세조회/cmm/sym/log/InqireSysLog.doselectSysLog“LogManageDAO.selectSysLog”

시스템로그 상세조회는 팝업창으로 구성되며, 닫기 버튼을 클릭하면 창을 닫는다.


참고자료