package cn.jcenterhome.web.action.admin; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import cn.jcenterhome.util.Common; import cn.jcenterhome.util.FileHelper; import cn.jcenterhome.util.JavaCenterHome; import cn.jcenterhome.util.Serializer; import cn.jcenterhome.web.action.BaseAction; public class LogAction extends BaseAction { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ Map<String, Object> sGlobal = (Map<String, Object>) request.getAttribute("sGlobal"); Map<String, Object> sConfig = (Map<String, Object>) request.getAttribute("sConfig"); Map<Integer, String> sNames = (Map<Integer, String>) request.getAttribute("sNames"); Map<String, Object> space = (Map<String, Object>) request.getAttribute("space"); String logRoot=JavaCenterHome.jchRoot+"/data/log/"; File[] files=Common.readDir(logRoot,"log"); if(files==null){ return mapping.findForward("log"); } String[] logFiles=new String[files.length]; int i=0; for (File file : files) { logFiles[i]=file.getName(); i++; } for (int k = 0; k < logFiles.length; k++) { for (int j = k + 1; j < logFiles.length; j++) { if (logFiles[j].compareToIgnoreCase(logFiles[k])<0){ String temp = logFiles[k]; logFiles[k] = logFiles[j]; logFiles[j] = temp; } } } String op=request.getParameter("op"); if("view".equals(op)){ Map log=new HashMap(); String file=request.getParameter("file"); file=Common.empty(file) ? "" : file.trim(); if(!Common.empty(file) && Common.in_array(logFiles, file)){ int line=Common.intval(request.getParameter("line")); File logFile=new File(logRoot+file); FileInputStream fis=null; BufferedReader bufReader =null; try { fis=new FileInputStream(logFile); bufReader = new BufferedReader(new InputStreamReader(fis,JavaCenterHome.JCH_CHARSET)); String lineStr=null; int offset = 0; List<Map<String,Object>> list=null; Map<String,Object> value=null; while((lineStr=bufReader.readLine())!=null){ if((offset++)==line){ log=parseLog(lineStr, true); log.put("line", line); list=dataBaseService.executeQuery("SELECT * FROM "+JavaCenterHome.getTableName("space")+" WHERE uid = '"+log.get("uid")+"'"); if(list.size()>0){ value=list.get(0); Common.realname_set(sGlobal, sConfig, sNames, (Integer)value.get("uid"), (String)value.get("username"), "", 0); Common.realname_get(sGlobal, sConfig, sNames, space); } break; } } } catch (Exception e) { e.printStackTrace(); }finally{ try { if(fis!=null){ fis.close(); } if(bufReader!=null){ bufReader.close(); } } catch (IOException e) { } } } request.setAttribute("log", log); }else{ int perpage=50; int uid=Common.intval(request.getParameter("uid")); String keySearch=Common.stripSearchKey(request.getParameter("keysearch")); String ip=request.getParameter("ip"); ip=Common.empty(ip) ? "" : ip.trim(); String file=request.getParameter("file"); file=file==null ? "" : file.trim(); String starttime=request.getParameter("starttime"); starttime=starttime==null ? "" : starttime.trim(); String endtime=request.getParameter("endtime"); endtime=endtime==null ? "" : endtime.trim(); String mpurl="admincp.jsp?ac=log&file="+file+"&uid="+uid+"&ip="+ip+"&starttime="+starttime+"&endtime="+endtime+"&keysearch="+keySearch; Map<String,String[]> paramMap=request.getParameterMap(); paramMap.put("uid", new String[]{uid+""}); paramMap.put("keysearch", new String[]{keySearch}); paramMap.put("ip", new String[]{ip}); String tmpPath=JavaCenterHome.jchRoot+"/data/temp/"; File tmpRoot=new File(tmpPath); if(!tmpRoot.isDirectory()){ tmpRoot.mkdirs(); } int page=Common.intval(request.getParameter("page")); page=page<1 ? 1 : page; int start = (page-1)*perpage; int maxPage = (Integer) sConfig.get("maxpage"); String result = Common.ckStart(start, perpage, maxPage); if (result != null) { return showMessage(request, response, result); } boolean fromCache=true; List uids=new ArrayList(); List list=new ArrayList(); int count=0; Map logInfo=new HashMap(); String tmpFilePath=tmpPath+"logsearch_"+Common.md5(mpurl).substring(8, 16)+".tmp"; File tmpFile=new File(tmpFilePath); if(!tmpFile.isFile()){ fromCache = false; File logFile=new File(logRoot+file); List lines=new ArrayList(); RandomAccessFile ras=null; if(!Common.empty(file)){ try { ras=new RandomAccessFile(logFile,"r"); String line=null; int cursor= 0; int offset= 0; boolean valid = true; int n=0; long o=0; String temp=null; while((line=ras.readLine())!=null){ logInfo=parseLog(line, false); logInfo.put("line", cursor); uids.add(logInfo.get("uid")); valid=true; temp=new String(line.getBytes("ISO-8859-1"),JavaCenterHome.JCH_CHARSET); if((uid>0 && uid!=(Integer)logInfo.get("uid")) || (!Common.empty(starttime) && starttime.compareTo((String)logInfo.get("dateline"))>0) || (!Common.empty(endtime) && endtime.compareTo((String)logInfo.get("dateline"))<0) || (!Common.empty(ip) && !ip.equals(logInfo.get("ip"))) || (!Common.empty(keySearch) && temp.indexOf(keySearch)<0)){ valid=false; } if(valid){ n=(line+"\n").length(); o=ras.getFilePointer()-n; lines.add(cursor+"-"+o+"-"+n); if(offset >= start && offset < start + perpage) { list.add(logInfo); } offset++; } cursor++; } } catch (Exception e) { e.printStackTrace(); }finally{ if(ras!=null){ try {ras.close();} catch (IOException e1) {} } ras=null; } } count=lines.size(); if(count>0){ FileHelper.writeFile(tmpFilePath, Common.implode(lines, ";")); } } if(fromCache){ List<String> data=Arrays.asList(sreadFile(tmpFilePath).split(";")); count=data.size(); int toIndex=perpage+start; toIndex=toIndex>count ? count : toIndex; List<String> lines=data.subList(start, toIndex); if(lines!=null && lines.size()>0){ File logFile=new File(logRoot+file); RandomAccessFile ras=null; if(!Common.empty(file)){ try { ras=new RandomAccessFile(logFile,"r"); byte[] b=new byte[1024]; for (String line : lines) { String[] tmp=line.split("-"); int l=Common.intval(tmp[0]); long o=Common.intval(tmp[1]); int n=Common.intval(tmp[2]); ras.seek(o); if(n>0){ line=ras.readLine().substring(0, n-1); }else{ line=""; } logInfo=parseLog(line, false); logInfo.put("line", l); uids.add(logInfo.get("uid")); list.add(logInfo); } } catch (Exception e) { e.printStackTrace(); }finally{ if(ras!=null){ try {ras.close();} catch (IOException e1) {} } ras=null; } } } } if(uids.size()>0){ List<Map<String, Object>> spaceList=dataBaseService.executeQuery("SELECT * FROM "+JavaCenterHome.getTableName("space")+" WHERE uid IN ("+Common.sImplode(uids)+')'); for (Map<String, Object> value : spaceList) { Common.realname_set(sGlobal, sConfig, sNames, (Integer)value.get("uid"), (String)value.get("username"), "", 0); } Common.realname_get(sGlobal, sConfig, sNames, space); } String multi = Common.multi(request, count, perpage, page,maxPage ,mpurl, null, null); request.setAttribute("multi", multi); request.setAttribute("logfiles", logFiles); request.setAttribute("list", list); } return mapping.findForward("log"); } private Map parseLog(String line,boolean detail){ Map logInfo=new HashMap(); if(line==null || line.equals("")){ return logInfo; } String[] lineList=line.split("\t"); int lineLength=lineList.length; if(lineList==null || lineLength<4){ return logInfo; } String dateline=lineList[0]; String ip=lineList[1]; String uid=lineList[2]; String link=lineList[3]; String extra=null; if(lineLength>=5){ extra=lineList[4]; }else{ extra=""; } logInfo.put("ip", ip); logInfo.put("uid", Common.intval(uid)); logInfo.put("link", link); logInfo.put("dateline", dateline); if(detail){ if(Common.matches(extra, "GET\\{(.*?);\\}")){ Map get=new HashMap(); String[] parts=extra.replaceAll("GET\\{(.*?);\\}", "$1").split(";"); String list1=null; for (String value : parts) { if(value.indexOf("=")>0){ String[] list=value.split("="); if(list.length<=1){ list1=""; }else{ list1=list[1]; } get.put(list[0], list1); } } logInfo.put("get", "<pre>"+print_r(get, 1, true)+"</pre>"); extra = ""; } if(Common.matches(extra, "POST\\{(.*);\\}")){ Map post=new HashMap(); String temp=extra.replaceAll("POST\\{(.*);\\}", "$1"); temp=temp.replaceAll(";(\\w+(\\[(.+?)\\])?)=", "////$1="); String[] parts=temp.split("////"); String list1=null; Map tempMap=null; if(parts!=null){ for (String value : parts) { if(value.indexOf("=")>0){ String[] list=value.split("="); if(list.length>1){ list1=list[1]; }else{ list1=""; } if(Common.matches(list1, "^a:\\d+:\\{")){ tempMap=Serializer.unserialize(list1, true); post.put(list[0], tempMap); }else{ post.put(list[0], list1); } } } } logInfo.put("post", "<pre>"+print_r(post, 1, true)+"</pre>"); extra = ""; } logInfo.put("extra", extra.trim()); } return logInfo; } private String print_r(Map expression,int level,boolean ispre){ if(expression==null || expression.size()==0){ return ""; } StringBuffer info=new StringBuffer(); Set keys=expression.keySet(); String nbsp=""; String tab=""; String sign=null; sign=ispre ? " ": "        "; for (int i = 0; i < level; i++) { nbsp=nbsp+sign; } tab=nbsp; tab=level==1 ? "" : tab; info.append("Map {<br/>"); int i=0; int keySize=keys.size(); for (Object key : keys) { i++; info.append("<br/>"+nbsp); if(expression.get(key) instanceof Map){ info.append(key+" = "+print_r((Map)expression.get(key),level+1,ispre)); }else{ info.append(key+" = "+expression.get(key)+(keySize==i ? "" : ",")); } } info.append("<br/>"); info.append(tab+"}"); return info.toString(); } private String sreadFile(String fileName){ if(fileName==null){ return ""; } StringBuffer info=new StringBuffer(); File file=new File(fileName); try { FileReader fr=new FileReader(file); BufferedReader bufReader=new BufferedReader(fr); while (bufReader.ready()) { info.append(bufReader.readLine()+"\n"); } } catch (Exception e) { e.printStackTrace(); return ""; } return info.toString(); } }