2011-04-13 5 views
0

입력 파일을 구문 분석하고 파일의 특정 부분 만 읽어야하는 요구 사항이 있습니다. 정보 경고 및 오류와 같은 다른 수준의 로그 파일이 있습니다. 이제 전체 오류 스택 추적을 포함하는 부분 만 읽어야합니다. 어떻게 내가 자바를 사용하여 이것을 달성 할 수 있습니다.Java - 입력 스트림의 특정 부분 만 읽는 방법

예 : 내가 스택 추적이 끝날 때까지 ERROR부터 모든 라인을 추출 (읽기) 할 필요가 위의 로그에서

INFO | 2011-04-13 17:59:22,810 | Calling Feedback from 127.0.0.1 
INFO | 2011-04-13 17:59:24,920 | Successfully called Feedback from 127.0.0.1 
INFO | 2011-04-13 17:59:31,561 | FeedBackList 

ERROR | 2011-04-13 19:00:41,640 | 
java.util.concurrent.TimeoutException 
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228) 
    at java.util.concurrent.FutureTask.get(FutureTask.java:91) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
    at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:111) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at $Proxy309.getConsumerProfileData(Unknown Source) 
    at com.scea.usps.model.service.impl.AccountSettingsServiceImpl.getUserProfile(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
    at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:111) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at $Proxy284.getUserProfile(Unknown Source) 
    at com.scea.usps.model.common.PsninfoUtility.getTop3Generes(Unknown Source) 
    at com.scea.usps.model.common.PsninfoUtility.updatePsnInfoDetail(Unknown Source) 
    at com.scea.platform.framework.api.PsnInfoThread.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:619) 

INFO | 2011-04-13 17:59:22,810 | Calling Feedback from 127.0.0.1 
INFO | 2011-04-13 17:59:24,920 | Successfully called Feedback from 127.0.0.1 
INFO | 2011-04-13 17:59:31,561 | FeedBackList 

. 이것에 대한 아이디어를 공유하십시오. 감사.

+0

당신이 "파일의 특정 부분을 읽기"말할 때 당신은 당신이 파일에서 해당 구문을 분석 할 필요가 의미합니까? 내가 원하는 것은 적절한 데이터를 파싱하는 알고리즘이나 좀 더 복잡한 알고리즘을 찾고 있다는 것입니다. 또한 모든 "ERRORS"에 스택 추적이 있습니까? ERROR/INFO와 개행의 유일한 시작 항목입니까? 이것이 단지 "기본적인 질문"일 뿐이라면 아래의 Brian의 대답이 가장 적합합니다. – Mike

+0

왜 로그 파일 파서가 Java 여야합니까? – MarkOfHall

+0

Chainsaw, http://logging.apache.org/chainsaw/index.html에서이 기능을 처리 할 수 ​​있는지 확신 할 수 없지만 자체 애플리케이션을 만들기 전에 시도해 볼 가치가 있습니다. – Kennet

답변

0
  • 읽기는 스택 추적 후 빈 줄을 칠 때까지 오류
  • 읽기 및 공정 라인으로 라인을 칠 때까지 파일 열기.

린스, 반복. 당신의 목표는 오류에 대한 응용 프로그램의 로그를 볼 경우

+0

@mike 예 거대한 로그 파일에서 필요한 부분을 구문 분석하는 알고리즘을 찾고 있습니다. 예, 모든 오류는 스택 추적을 갖습니다. – Hitatichi

0
try { 
     BufferedReader in 
      = new BufferedReader(new FileReader("logfile.log")); 
     String line = in.readLine(); 
     while (!line.startsWith("ERROR")) { 
     line = in.readLine(); 
     if(line==null){ 
      //throw exception here, ERROR not found in entire log file 
     } 
     } 
     //HERE line will be your error line 
     while (line!=null) { 
     line = in.readLine(); 
     //do something with line 
     } 
     //here you have reached the end of the file 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
+0

propmpt 답장을 보내 주셔서 감사합니다. 그러나 ERROR 행 다음의 행은 어떻게됩니까? 이 선들도 오류 선과 함께 인쇄해야합니다. 저를 올바른 방향으로 인도하십시오. 감사. – Hitatichi

2
BufferedReader in = new BufferedReader(new FileReader("logfile.log")); 
    String line = in.readLine(); 
    StringBuffer buf = null; 
    while (line != null) { 
    if(line.startsWith("ERROR")){ 
     buf = new StringBuffer(); 
     buf.append(line).append("\n"); 
     while(line != null && !line.trim().equals("")){ 
      line = in.readLine(); 
      buf.append(line).append("\n"); 
     } 
     //Now buf has your error an do whatever you want to do with it 
     //then delete 
     buf = null; 
    } 
    line = in.readLine(); 
    } 
+0

답장을 보내 주셔서 감사합니다. 오류 스택 추적의 첫 번째 줄뿐만 아니라 인쇄 할 필요가 있지만 또한 오류 스택 추적 나머지 줄을 인쇄해야합니다. – Hitatichi

+0

@Hitatichi : 내 솔루션은 "ERROR ..."와 빈 줄 사이의 모든 줄을 StringBuffer에 저장하므로 원하는 스택 추적도 저장됩니다. – Dave

1

LogFilePatternReceiver를 사용하는 경우 연쇄 장치가 내장되어 있습니다. filterExpression을 정의 할 수 있으며 해당 filterexpression과 일치하는 이벤트 만 처리됩니다. 스택 트레이스 만 포함됩니다

의 예 필터 표현식은 다음과 같습니다

예외는 당신은 로그 파일의 형식을 제공해야합니까

존재한다. 더 많은 정보를위한 JavaDoc를 참조하십시오

http://logging.apache.org/log4j/companions/receivers/apidocs/org/apache/log4j/varia/LogFilePatternReceiver.html

관련 문제