有時查看日志,常常會發現由框架底層打印的錯誤日志。要修改這個錯誤的時候,如果不是對框架特別熟悉,就需要按照可能產生這個錯誤日志的流程一步一步找,一時半會不一定能找到。比如本人最近對smartfoxserver搭建的服務器做壓測的時候,發現最大等待線程數超過20就會打印錯誤日志,然后就一直在smartfoxserver接受請求的反編譯代碼里找該錯誤輸出,花了很長時間一直沒找到。然后我在想能否用inputstream來查詢字符串,試驗代碼如下:
import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.io.InputStreamReader; import java.util.Enumeration; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; public class Find { public static final String path = "D:/workspace/test/"; //jar包父目錄 public static final String keywords = "aaa"; //關鍵字 public static void main(String[] args){ File file = new File(path); final Pattern p = Pattern.compile(".+\\.jar$"); File[] files = file.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if(p.matcher(pathname.getPath()).matches()){ return true; }else{ return false; } } }); search(files); } private static void search(File[] files){ try{ for(File f : files){ if(f.isDirectory()){ search(f.listFiles()); }else{ ZipFile jar = new ZipFile(f); Enumeration enumration = jar.entries(); while(enumration.hasMoreElements()){ ZipEntry zipEntry = (ZipEntry)enumration.nextElement(); InputStreamReader isr = new InputStreamReader(jar.getInputStream(zipEntry)); BufferedReader br = new BufferedReader(isr); String line = br.readLine(); int line_num = 1; while(null != line){ // System.out.println(line); if(line.contains(keywords)){ System.out.println(f.getPath() + "," +zipEntry.getName() + "," + "line number = " + line_num); } line = br.readLine(); line_num++; } } } } }catch(ZipException z_e){ z_e.printStackTrace(); }catch(IOException io_e){ io_e.printStackTrace(); } } }
用於測試的jar包:D:\workspace\test\test.jar 代碼如下
Test.java:
public class Test { public static void main(String[] args){ System.out.print("aaa"); } }
測試結果如下:
D:\workspace\test\test.jar,com/test/Test.class,line number = 3
以上代碼沒有反編譯相關的,所以目前只對查詢字符串或者變量名有效,對方法名不一定能查出來 有時間可以研究下反編譯解析
