2024-09-20 17:22 장애로그 목록 작업

This commit is contained in:
myname 2024-09-20 17:22:52 +09:00
parent 045f48b4e5
commit 057f5655b7
5 changed files with 750 additions and 0 deletions

View File

@ -0,0 +1,17 @@
package seed.manager.errorlogs.service;
import java.util.List;
import seed.map.T_ERROR_LOGS;
public interface ManagerErrorLogsService {
//ManagerErrorLogsController
public T_ERROR_LOGS getErrorLogsForm(Integer errorLogsIdx);
//ManagerErrorLogsController
public Long getErrorLogsListCnt(String column, String search);
//ManagerErrorLogsController
public List<T_ERROR_LOGS> getErrorLogsList(int page, int row, String orderColumn, String order, String column, String search, String[] qryColumns);
}

View File

@ -0,0 +1,36 @@
package seed.manager.errorlogs.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.AbstractServiceImpl;
import seed.dao.ErrorLogsDAO;
import seed.map.T_ERROR_LOGS;
@Service
public class ManagerErrorLogsServiceImpl extends AbstractServiceImpl implements ManagerErrorLogsService{
@Autowired
private ErrorLogsDAO errorLogsDAO;
//ManagerErrorLogsController
public T_ERROR_LOGS getErrorLogsForm(Integer errorLogsIdx){
return errorLogsDAO.getErrorLogsForm(errorLogsIdx);
}
//ManagerErrorLogsController
public Long getErrorLogsListCnt(String column, String search){
return errorLogsDAO.getErrorLogsListCnt(column, search);
}
//ManagerErrorLogsController
public List<T_ERROR_LOGS> getErrorLogsList(int page, int row, String orderColumn, String order, String column, String search, String[] qryColumns){
return errorLogsDAO.getErrorLogsList(((page-1) * row), row, orderColumn, order, column, search, qryColumns);
}
}

View File

@ -0,0 +1,320 @@
package seed.manager.errorlogs.web;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.Gson;
import seed.manager.errorlogs.service.ManagerErrorLogsService;
import seed.manager.member.service.ManagerMemberService;
import seed.manager.site.service.ManagerSiteManagerService;
import seed.utils.InterceptorCheck;
import seed.utils.Paging;
import seed.utils.SeedUtils;
@Controller
public class ManagerErrorLogsController {
private Logger log = Logger.getLogger(this.getClass());
@Autowired
private ManagerErrorLogsService managerErrorLogsService;
@Autowired
private ManagerMemberService managerMemberService;
@Autowired
private ManagerSiteManagerService managerSiteManagerService;
@Value("#{config['was.log.path']}")
private String wasLogPath;
public void getSeedLicense(HttpServletResponse httpServletResponse){
if(SeedUtils.setReplaceNull(InterceptorCheck.getLicenseKey()).equals("")){
try {
httpServletResponse.sendRedirect("/common/seed.do");
} catch (IOException ex) {
log.error("CHECK ERROR:",ex);
}
}
}
public void setSessionRemove(HttpSession session){
session.removeAttribute("memberIdx");
session.removeAttribute("memberId");
session.removeAttribute("memberName");
session.removeAttribute("memberDept");
session.removeAttribute("memberPosition");
session.removeAttribute("memberTel");
session.removeAttribute("memberPhone");
session.removeAttribute("memberEmail1");
session.removeAttribute("memberEmail2");
session.removeAttribute("memberGrant");
session.removeAttribute("url");
session.removeAttribute("message");
session.removeAttribute("opener");
session.removeAttribute("append");
session.removeAttribute("self");
}
public void setSessionMessageRemove(HttpSession session){
session.removeAttribute("url");
session.removeAttribute("message");
session.removeAttribute("opener");
session.removeAttribute("append");
session.removeAttribute("self");
}
public void setPaging(@ModelAttribute("paging") Paging paging){
if(paging != null){
if(paging.getPage() == null){paging.setPage(1);}
if(paging.getRow() == null){paging.setRow(10);}
if(paging.getPagec() == null){paging.setPagec(1);}
if(paging.getRowc() == null){paging.setRowc(10);}
}
}
@RequestMapping(value = "/gtm/{siteIdx}/errorLogsLive.do")
public ModelAndView getErrorLogsLive(HttpServletResponse httpServletResponse, HttpSession session, Map<String, Object> map,
@PathVariable(value="siteIdx") String siteIdx){
getSeedLicense(httpServletResponse);
setSessionMessageRemove(session);
Integer memberIdx = Integer.valueOf(SeedUtils.setReplaceNull(session.getAttribute("memberIdx"),"0"));
String memberGrant = (memberIdx == 0) ? "N" : SeedUtils.setReplaceNull(managerMemberService.getMemberMapForm(memberIdx, new String[] {"memberGrant"}).get("_memberGrant"), "N");
boolean memberAuth = managerSiteManagerService.getSiteManagerListCnt(siteIdx, memberIdx);
if(memberIdx == 0 || (!memberGrant.equals("S") && !memberAuth)){
setSessionRemove(session);
map.put("url", "/gtm/login.do");
map.put("message", "common.message.no.grant");
return new ModelAndView("/_common/jsp/message");
}
//해당 WAS폴더의 파일리스트 가져옴
ArrayList<Map<String, Object>> fileList = SeedUtils.getSeedDirFiles(wasLogPath, "F");
map.put("fileList", fileList);
return new ModelAndView("/manager/errorlogs/errorLogsLive");
}
@RequestMapping(value = "/gtm/proc/{siteIdx}/errorLogsLiveProc.do", method=RequestMethod.POST)
public ModelAndView setErrorLogsLiveProc(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, HttpSession session, Map<String, Object> map,
@PathVariable(value="siteIdx") String siteIdx,
@RequestParam(value="fileName", defaultValue="", required=false) String fileName,
@RequestParam(value="preEndPoint", defaultValue="0", required=false) Long preEndPoint){
getSeedLicense(httpServletResponse);
setSessionMessageRemove(session);
Integer memberIdx = Integer.valueOf(SeedUtils.setReplaceNull(session.getAttribute("memberIdx"),"0"));
String memberGrant = (memberIdx == 0) ? "N" : SeedUtils.setReplaceNull(managerMemberService.getMemberMapForm(memberIdx, new String[] {"memberGrant"}).get("_memberGrant"), "N");
boolean memberAuth = managerSiteManagerService.getSiteManagerListCnt(siteIdx, memberIdx);
if(memberIdx == 0 || (!memberGrant.equals("S") && !memberAuth)){
setSessionRemove(session);
map.put("url", "/gtm/login.do");
map.put("message", "common.message.no.grant");
return new ModelAndView("/_common/jsp/message");
}
StringBuilder logBuilder = new StringBuilder();
// ajax 요청에 응답하기 위한 response작업
httpServletResponse.setContentType("text/html;charset=UTF-8");
HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
Gson gson = new Gson();
String ajaxData = "";
PrintWriter writer = null;
if (!"".equals(fileName.trim())) {
fileName = wasLogPath + fileName.trim().replaceAll("\\.\\.", "");
long startPoint = 0;
long endPoint = 0;
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(fileName, "r");
endPoint = randomAccessFile.length();
startPoint = preEndPoint > 0 ? preEndPoint : endPoint < 2000 ? 0 : endPoint - 2000;
randomAccessFile.seek(startPoint);
String str;
while ((str = randomAccessFile.readLine()) != null) {
logBuilder.append(str);
logBuilder.append("\n");
endPoint = randomAccessFile.getFilePointer();
randomAccessFile.seek(endPoint);
}
} catch (FileNotFoundException fnfe) {
logBuilder.append("File does not exist.");
log.error("CHECK ERROR:",fnfe);
} catch (Exception e) {
logBuilder.append("Sorry. An error has occurred.");
log.error("CHECK ERROR:",e);
} finally {
try {randomAccessFile.close();} catch (Exception e) {
log.error("CHECK ERROR:",e);
}
}
ajaxData = gson.toJson(hashMap);
try {
hashMap.put("logBuilder", new String(logBuilder.toString().replaceAll("<", "&lt;").replaceAll(">", "&gt;").getBytes("ISO-8859-1"),"EUC-KR"));
} catch (UnsupportedEncodingException e) {
log.error("CHECK ERROR:",e);
}
hashMap.put("endPoint", endPoint);
ajaxData = gson.toJson(hashMap);
}else{
ajaxData = gson.toJson(hashMap);
}
try {
writer = httpServletResponse.getWriter();
writer.write(ajaxData);
} catch (IOException e) {
log.error("IOException ERROR");
} finally{
if(writer!=null){writer.flush();writer.close();}
}
//out.print("{\"endPoint\":\"" + endPoint + "\", \"log\":\"" + URLEncoder.encode(new String(log.toString().getBytes("ISO-8859-1"),"UTF-8"), "UTF-8").replaceAll("\\+", "%20") + "\"}");
return null;
}
@RequestMapping(value = "/gtm/{siteIdx}/errorLogsList.do")
public ModelAndView getErrorLogsList(HttpServletResponse httpServletResponse, HttpSession session, Map<String, Object> map,
@PathVariable(value="siteIdx") String siteIdx,
@ModelAttribute("paging") Paging paging,
@RequestParam(value="orderColumn", defaultValue="errorLogsIdx", required=false) String orderColumn,
@RequestParam(value="order", defaultValue="DESC", required=false) String order,
@RequestParam(value="column", defaultValue="", required=false) String column,
@RequestParam(value="search", defaultValue="", required=false) String search){
getSeedLicense(httpServletResponse);
setSessionMessageRemove(session);
setPaging(paging);
Integer memberIdx = Integer.valueOf(SeedUtils.setReplaceNull(session.getAttribute("memberIdx"),"0"));
String memberGrant = (memberIdx == 0) ? "N" : SeedUtils.setReplaceNull(managerMemberService.getMemberMapForm(memberIdx, new String[] {"memberGrant"}).get("_memberGrant"), "N");
boolean memberAuth = managerSiteManagerService.getSiteManagerListCnt(siteIdx, memberIdx);
if(memberIdx == 0 || (!memberGrant.equals("S") && !memberAuth)){
setSessionRemove(session);
map.put("url", "/gtm/login.do");
map.put("message", "common.message.no.grant");
return new ModelAndView("/_common/jsp/message");
}
String[] qryColumns = {"errorLogsIdx", "errorLogsUrl", "errorLogsType", "errorLogsRegDate"};
paging.setCount(managerErrorLogsService.getErrorLogsListCnt(column, search));
map.put("errorLogsList", managerErrorLogsService.getErrorLogsList(paging.getPage(), paging.getRow(), orderColumn, order, column, search, qryColumns));
map.put("errorLogsListCnt", paging.getCount());
map.put("page", paging.getPage());
map.put("row", paging.getRow());
map.put("pages", paging.getPages());
map.put("blocks", paging.getBlocks());
map.put("block", paging.getBlock());
map.put("fPage", paging.getfPage());
map.put("lPage", paging.getlPage());
map.put("orderColumn", orderColumn);
map.put("order", order);
map.put("column", column);
map.put("search", search);
return new ModelAndView("/manager/errorlogs/errorLogsList");
}
@RequestMapping(value = "/gtm/{siteIdx}/errorLogsView/{errorLogsIdx}.do", method=RequestMethod.GET)
public ModelAndView getErrorLogsEdit(HttpServletResponse httpServletResponse, HttpSession session, Map<String, Object> map,
@PathVariable(value="siteIdx") String siteIdx,
@PathVariable(value="errorLogsIdx") Integer errorLogsIdx,
@ModelAttribute("paging") Paging paging,
@RequestParam(value="orderColumn", defaultValue="errorLogsIdx", required=false) String orderColumn,
@RequestParam(value="order", defaultValue="DESC", required=false) String order,
@RequestParam(value="column", defaultValue="", required=false) String column,
@RequestParam(value="search", defaultValue="", required=false) String search){
getSeedLicense(httpServletResponse);
setSessionMessageRemove(session);
setPaging(paging);
Integer memberIdx = Integer.valueOf(SeedUtils.setReplaceNull(session.getAttribute("memberIdx"),"0"));
String memberGrant = (memberIdx == 0) ? "N" : SeedUtils.setReplaceNull(managerMemberService.getMemberMapForm(memberIdx, new String[] {"memberGrant"}).get("_memberGrant"), "N");
boolean memberAuth = managerSiteManagerService.getSiteManagerListCnt(siteIdx, memberIdx);
if(memberIdx == 0 || (!memberGrant.equals("S") && !memberAuth)){
setSessionRemove(session);
map.put("url", "/gtm/login.do");
map.put("message", "common.message.no.grant");
return new ModelAndView("/_common/jsp/message");
}
map.put("page", paging.getPage());
map.put("row", paging.getRow());
map.put("orderColumn", orderColumn);
map.put("order", order);
map.put("column", column);
map.put("search", search);
map.put("tErrorLogsDB", managerErrorLogsService.getErrorLogsForm(errorLogsIdx));
return new ModelAndView("/manager/errorlogs/errorLogsView");
}
}

View File

@ -0,0 +1,143 @@
<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="ko">
<head>
<title><s:message code="manager.errorLogs.errorLogsList.title"/></title>
</head>
<body>
<div class="page-title-wrap clear">
<div class="page-title-inner">
<h3 class="page-title"><s:message code="manager.errorLogs.nav.errorLogsList"/></h3>
<div class="tooltipBox type01">
<button type="button" class="page-tip">페이지안내</button>
<div class="tooltipText">
<p></p>
</div>
</div>
</div>
<div class="sch-content-wrap clear">
<form:form name="frmSearch" id="frmSearch" action="/gtm/${siteIdx}/errorLogsList.do" method="post">
<input type="hidden" name="page" value="1" />
<input type="hidden" name="row" value="<c:out escapeXml='true' value='${row}' />" />
<input type="hidden" name="orderColumn" value="<c:out escapeXml='true' value='${orderColumn}' />" />
<input type="hidden" name="order" value="<c:out escapeXml='true' value='${order}' />" />
<fieldset>
<legend>검색 폼</legend>
<select name="column" id="column" title="<s:message code="common.select.option.value"/>" class="sch-select">
<option value="A" <c:if test="${column == 'A'}">selected="selected"</c:if>><s:message code="common.select.option.value.all"/></option>
<option value="errorLogsUrl" <c:if test="${column == 'errorLogsUrl'}">selected="selected"</c:if>><s:message code="manager.errorLogs.errorLogsList.errorLogsUrl"/></option>
<option value="errorLogsType" <c:if test="${column == 'errorLogsType'}">selected="selected"</c:if>><s:message code="manager.errorLogs.errorLogsList.errorLogsType"/></option>
</select>
<input type="search" name="search" id="search" value="<c:out escapeXml='true' value='${search}' />" title="<s:message code="common.search.value"/>" class="sch-text">
<button type="submit" class="btn-page-sch"><s:message code="common.button.search"/></button>
</fieldset>
</form:form>
</div>
</div>
<div class="more-btn-box">
<button type="button" id="moreTableItem" class="more-table-item">칼럼 더보기</button>
</div>
<div class="form-wrap">
<div class="table-layout br-none">
<table>
<caption><s:message code="manager.errorLogs.errorLogsList.table.caption"/></caption>
<colgroup>
<col class="item-tablet-hidden checkbox_small">
<col class="title">
<col class="item-mobile-hidden">
<col>
</colgroup>
<thead>
<tr>
<th scope="col" class="item-tablet-hidden"><s:message code="common.num"/></th>
<th scope="col"><s:message code="manager.errorLogs.errorLogsList.errorLogsUrl"/>&nbsp;&nbsp;<span><a href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=errorLogsUrl&amp;order=ASC&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />"><img src="<s:message code="common.column.up"/>" width="7" height="10" alt="<s:message code="common.move.up"/>" /></a></span>&nbsp;&nbsp;<span><a href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=errorLogsUrl&amp;order=DESC&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />"><img src="<s:message code="common.column.down"/>" width="7" height="10" alt="<s:message code="common.move.down"/>" /></a></span></th>
<th scope="col" class="item-mobile-hidden"><s:message code="manager.errorLogs.errorLogsList.errorLogsType"/>&nbsp;&nbsp;<span><a href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=errorLogsType&amp;order=ASC&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />"><img src="<s:message code="common.column.up"/>" width="7" height="10" alt="<s:message code="common.move.up"/>" /></a></span>&nbsp;&nbsp;<span><a href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=errorLogsType&amp;order=DESC&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />"><img src="<s:message code="common.column.down"/>" width="7" height="10" alt="<s:message code="common.move.down"/>" /></a></span></th>
<th scope="col"><s:message code="common.regDate"/>&nbsp;&nbsp;<span><a href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=errorLogsRegDate&amp;order=ASC&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />"><img src="<s:message code="common.column.up"/>" width="7" height="10" alt="<s:message code="common.move.up"/>" /></a></span>&nbsp;&nbsp;<span><a href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=errorLogsRegDate&amp;order=DESC&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />"><img src="<s:message code="common.column.down"/>" width="7" height="10" alt="<s:message code="common.move.down"/>" /></a></span></th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${!empty errorLogsList}">
<c:forEach items="${errorLogsList}" var="errorLogsList" varStatus="status">
<tr>
<td class="item-tablet-hidden"><c:out escapeXml='true' value='${errorLogsListCnt - (page-1)*row - status.index}' /></td>
<td class="al"><a class="hover-link" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsView/<c:out escapeXml='true' value='${errorLogsList._errorLogsIdx}' />.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />"><span><c:out escapeXml='true' value='${errorLogsList._errorLogsUrl}' /></span></a></td>
<td class="item-mobile-hidden"><a class="hover-link" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsView/<c:out escapeXml='true' value='${errorLogsList._errorLogsIdx}' />.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />"><span><c:out escapeXml='true' value='${errorLogsList._errorLogsType}' /></span></a></td>
<td><c:out escapeXml='true' value='${fn:substring(errorLogsList._errorLogsRegDate, 0, 19)}' /></td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td class="no-data-colspan"><s:message code="common.message.no.data"/></td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
</div>
<div class="pagination-container">
<div class="pagination-inner clear">
<div class="pagination-control prev clear">
<a class="first-btn" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=1&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />" title="<s:message code="common.page.first"/>" ><s:message code="common.page.first"/></a>
<c:choose>
<c:when test="${block > 1}">
<a class="prev-btn" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${fPage-1}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />" title="<s:message code="common.page.prev"/>" ><s:message code="common.page.prev"/></a>
</c:when>
<c:otherwise>
<a class="prev-btn" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />" title="<s:message code="common.page.prev"/>" ><s:message code="common.page.prev"/></a>
</c:otherwise>
</c:choose>
</div>
<ul class="pagination clear">
<c:forEach begin="0" end="${lPage-fPage}" var="index" >
<c:choose>
<c:when test="${index+fPage==page}">
<li><a class="on" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />" title="<s:message code="common.page.now"/>" ><c:out escapeXml='true' value='${page}' /></a></li>
</c:when>
<c:otherwise>
<li><a href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${index+fPage}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />" title="<c:out escapeXml='true' value='${index+fPage}' /> <s:message code="common.page.page"/>" ><c:out escapeXml='true' value='${index+fPage}' /></a></li>
</c:otherwise>
</c:choose>
</c:forEach>
</ul>
<div class="pagination-control next clear">
<c:choose>
<c:when test="${block < blocks}">
<a class="next-btn" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${lPage+1}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />" title="<s:message code="common.page.next"/>" ><s:message code="common.page.next"/></a>
</c:when>
<c:otherwise>
<a class="next-btn" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${page}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />" title="<s:message code="common.page.next"/>" ><s:message code="common.page.next"/></a>
</c:otherwise>
</c:choose>
<a class="last-btn" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsList.do?page=<c:out escapeXml='true' value='${pages}' />&amp;row=<c:out escapeXml='true' value='${row}' />&amp;orderColumn=<c:out escapeXml='true' value='${orderColumn}' />&amp;order=<c:out escapeXml='true' value='${order}' />&amp;column=<c:out escapeXml='true' value='${column}' />&amp;search=<c:out escapeXml='true' value='${search}' />" title="<s:message code="common.page.last"/>" ><s:message code="common.page.last"/></a>
</div>
</div>
</div>
<div class="btn-area">
<a class="btn-normal lightgray" id="logsLivePop" href="/gtm/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsLive.do"><s:message code="manager.errorLogs.nav.errorLogsLive"/></a>
</div>
<script>
$("#logsLivePop").click(function(){
var url = $(this).attr("href");
window.open(url,"popLogsLive","width=700, height=760, resizable=yes, location=no, toolbar=no, menubar=no, status=no, scrollbars=yes");
return false;
});
</script>
</body>
</html>

View File

@ -0,0 +1,234 @@
<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="ko">
<head>
<title><s:message code="manager.errorLogs.errorLogsLive.title"/></title>
<link rel="stylesheet" href="/css/space.css">
<link rel="stylesheet" href="/css/seed.layout.css">
<script src="/js/lib/base64.js"></script>
<script src="/js/seed.app.js"></script>
<script src="/js/lib/jquery.bxslider.min.js"></script>
<style type="text/css">
#console {
bottom: 0;
width: 100%;
height: 600px;
overflow-y: auto;
background-color: #2f3541;
color:white;
font-size: 15px;
word-wrap:break-word;
padding:10px;
}
.fileName{
margin:5px 0 5px 0;
}
.log-cursor{
display:block;
width:1px;
height:14px;
margin:2px 0;
background:#fff;
visibility: hidden;
}
.log-title{
position:relative;
display:block;
margin:5px 0;
font-size:14px;
margin:15px 0 5px 0;
}
.row-wrap .row:first-child{
margin-top:0;
}
.row-wrap .row{
margin-top:3px;
line-height:1.2;
word-wrap: break-word;
}
</style>
</head>
<body>
<div class="seed-popup-wrap">
<div class="page-title-wrap clear">
<div class="page-title-inner" style="margin-bottom:0">
<h3 class="page-title"><s:message code="manager.errorLogs.nav.errorLogsLive"/></h3>
<div class="tooltipBox type01">
<button type="button" class="page-tip">페이지안내</button>
<div class="tooltipText">
<p></p>
</div>
</div>
</div>
<div style="clear: both;">
<select name="fileName" id="fileName" class="fileName" title="<s:message code="common.select.option.value"/>.">
<option value=""><s:message code="common.select.option.value"/></option>
<c:forEach items="${fileList}" var="fileList" varStatus="status">
<option value="<c:out escapeXml='true' value='${fileList.fileName}' />"><c:out escapeXml='true' value='${fileList.fileName}' /></option>
</c:forEach>
</select>
</div>
<!--
| grep <input class="inpstyle type1" id="grep" type="text" />
| grep -v <input class="inpstyle type1" id="grepV" type="text" />
-->
<div id="console"></div>
<div class="btn-area mb5">
<button type="button" class="btn-normal violet" id="startTail">START</button>
<button type="button" class="btn-normal lightgray" id="stopTail" style="display:none">STOP</button>
</div>
</div>
</div>
<script>
var endPoint = 0;
var tailFlag = false;
var fileName;
var consoleLog;
var visibility = false;
var isCursorActive = false;
var cursorShowTime = null;
/*
var grep;
var grepV;
var pattern;
var patternV;
*/
var match;
consoleLog = $('#console');
function startTail() {
if($('#fileName').val() == ""){
alert("<s:message code="common.select.option.value"/>");
$('#fileName').focus();
return false;
}
fileName = $('#fileName').val();
/*
grep = $.trim($('#grep').val());
grepV = $.trim($('#grepV').val());
pattern = new RegExp('.*'+grep+'.*\\n', 'g');
patternV = new RegExp('.*'+grepV+'.*\\n', 'g');
*/
function requestLog() {
if (tailFlag) {
$.ajax({
type : 'POST',
dataType : 'json',
url : '/gtm/proc/<c:out escapeXml='true' value='${siteIdx}' />/errorLogsLiveProc.do', // #### Caution: The name of the source file
data : {
'fileName' : fileName,
'preEndPoint' : endPoint
},
success : function(data) {
endPoint = data.endPoint == false ? 0 : data.endPoint;
logdata = decodeURIComponent(data.logBuilder);
if( logdata || !isCursorActive ){
if( $('.log-cursor').length ){
$('.log-cursor').remove();
}
consoleLog
// log text
.html(
consoleLog.html() + (function(){
logdata = logdata.replace(/(?:\r\n|\r|\n)/g, ',').split(',');
return $('#fileName').val() === $('.log-title').last().text()
? '<div class="row">' + logdata.join('</div><div class="row">') + '</div>' : [
'<strong class="log-title">'+ $('#fileName').val() +'</strong>',
'<div class="row-wrap">',
'<div class="row">' + logdata.join('</div><div class="row">') + '</div>',
'</div>'
].join('');
}())
)
// cursor
.append(
$('<span></span>').addClass('log-cursor')
)
.scrollTop(
consoleLog.prop('scrollHeight')
)
;
}
setTimeout(requestLog, 1000);
if( !isCursorActive ){
startLogCursor( 1 );
}
},
error : function(e) {
console.log(e.responseText);
}
});
}
}
requestLog();
}
function startLogCursor( timer ){
isCursorActive = true;
clearTimeout( cursorShowTime );
cursorShowTime = setTimeout(function(){
$('.log-cursor').css('visibility', !visibility ? 'visible' : 'hidden' );
visibility = !visibility;
startLogCursor( 600 );
}, timer);
}
function stopLogCursor() {
isCursorActive = false;
visibility = false;
$('.log-cursor').css('visibility', 'hidden' );
clearTimeout( cursorShowTime );
}
$('#startTail').on('click', function() {
if( !tailFlag ){
tailFlag = true;
startTail();
$(this).hide();
$('#stopTail').show();
}
});
$('#stopTail').on('click', function() {
tailFlag = false;
stopLogCursor();
$(this).hide();
$('#startTail').show();
});
$('#fileName').change(function() {
tailFlag = false;
stopLogCursor();
endPoint = 0;
$('#startTail').show();
$('#stopTail').hide();
});
</script>
</body>
</html>