功能:
1,能够将服务器上的指定的文件通过浏览器倒序显示处理,如果文件是系统日志,则可以用来查日志信息。
2,可以倒序显示指定的行数,默认100行,通过参数count=500可以修改显示行数。
3,只按行显示行数,默认最大10000行,支持大文件或超大文件,就算文件有1G。
4,可以与操作事件配合,执行一个动作,刷一下就能查看最新的。
5,结合浏览器本身的查找功能,可以方便查找想要的信息。
其他功能:
1,filter支持关键字查询,如:filter=findData,则只显示含有findData的日志信息。
2,支持stopKey,如:stopKey=findData,则只要找到含有findData的信息,就停止继续查询。
3,文件同时也可以配置成其他日志文件,如:nginx日志,或其他日志,效果一样。
使用方式:
将以下代码,存成jsp,如:logs.jsp,并修改代码中的filePath为实际的日志文件。
然后通过浏览器访问,如:http://localhost:8080/logs.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" import="java.net.*,java.io.*,java.util.*"%> <%! int MAX_TOTAL_ROW_READ=10000; List<String> readLineFile(File file, int maxCount, Map<String, String> filterMap, String charset) throws Exception { long time=System.currentTimeMillis(); List<String> lineList = new ArrayList(); if(charset==null ||"".equals(charset)){ charset = "UTF-8"; } int count = 0; int totalCount=0; RandomAccessFile rf = null; try { rf = new RandomAccessFile(file, "r"); long len = rf.length(); long start = rf.getFilePointer(); long nextend = start + len - 1; String line; rf.seek(nextend); int c = -1; String filter=filterMap.get("filter"); String stop_key=filterMap.get("stop_key"); String hide_key=filterMap.get("hide_key"); if(stop_key!=null && (stop_key.equals("") ||stop_key.equals("null"))){ stop_key=null; } if(hide_key!=null && (hide_key.equals("") ||hide_key.equals("null"))){ hide_key=null; } String[] hides=null; if(hide_key!=null){ hides=hide_key.split(","); } boolean isHide=false; while (nextend > start) { c = rf.read(); if (c == '\n' || c == '\r') { totalCount++; if(totalCount>MAX_TOTAL_ROW_READ){ break; } if (count > maxCount) { break; } line = rf.readLine(); if (line != null) { line = new String(line.getBytes("ISO-8859-1"), charset); //stop if(stop_key!=null && line.indexOf(stop_key)>=0){ break; } //hide if(hides!=null){ isHide=false; for(String hide:hides){ if(hide.equals("hide_empty") && "".equals(line)){ isHide=true; break; } else if(line.indexOf(hide)>=0){ isHide=true; break; } } if(isHide){ continue; } } //filter if(filter==null|| line.indexOf(filter)>=0){ count++; lineList.add(line); } } nextend--; } nextend--; rf.seek(nextend); if (nextend == 0) {// output first line on seek file head line = rf.readLine(); line = new String(line.getBytes("ISO-8859-1"), charset); lineList.add(line); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (rf != null) rf.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("totalCount="+totalCount+" foundCount="+count+" time="+(System.currentTimeMillis()-time)); return lineList; } %> <% String filePath="d:/log4j/logs.log"; int max_line_count=100; String counts=request.getParameter("count");//stop on find count String filter=request.getParameter("filter");//find by filter value String stopKey=request.getParameter("stopKey");//find stop on find stopKey String hideKey=request.getParameter("hideKey");//hide find hideKey long time=System.currentTimeMillis(); try{ int cout=Integer.parseInt(counts); max_line_count=cout; }catch(Exception e){ } try{ File file = new File(filePath); if(!file.exists()){ String info=filePath+" not found!"; out.print(info); System.out.println(info); } else{ Map<String, String> filterMap=new HashMap(); filterMap.put("filter", filter); filterMap.put("stop_key", stopKey); filterMap.put("hide_key", hideKey); List<String> lineList=readLineFile(file, max_line_count, filterMap, null); for(String line:lineList){ out.print(line+"<br/>\n"); } } } catch(Exception e){ out.println(e.getMessage()); } %>
原文地址:http://blog.csdn.net/jview/article/details/46378515