시스템로그조회

개요

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

설명

  • 시스템로그조회는 시스템로그의 등록, 조회, 목록, 삭제, 요약의 기능을 수반한다.
  ① 시스템로그등록 : 시스템로그정보를 등록한다. - 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>
  • ID Generation Service를 활용하기 위해서 Sequence 저장테이블인 COMTECOPSEQ에 SYSLOG_ID 항목을 추가한다.
  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를 설정한다.

  • 시스템로그 등록 기능구현을 위하여 EgovLogManageAspect 클래스를 생성한다.
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을 설정한다.

  • 시스템로그 삭제, 요약 기능구현을 위하여 EgovLogManageScheduling 클래스를 생성한다.
@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”

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


참고자료

 
egovframework/시스템로그조회.txt · 마지막 수정: 2023/12/21 05:21 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki