Java - Как читать только определенные части входного потока - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть требование, где мне нужно проанализировать входной файл и прочитать только определенные части файла.У меня есть файл журнала, который имеет разные уровни, такие как предупреждение информации и ошибка.Теперь мне нужно прочитать только те части, которые содержат полную трассировку стека ошибок.Как я могу добиться этого с помощью Java.

Пример:

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

В приведенном выше журнале мне нужно извлечь (прочитать) все строки, начиная с ОШИБКИ, до завершения трассировки стека.Пожалуйста, поделитесь своими идеями по этому вопросу.Спасибо.

Ответы [ 5 ]

2 голосов
/ 13 апреля 2011
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();
  }
1 голос
/ 23 апреля 2011

Бензопила имеет эту встроенную функцию, если вы используете LogFilePatternReceiver. Вы можете определить filterExpression, и будут обрабатываться только события, соответствующие этому filterexression.

Пример выражения фильтра, который будет включать только трассировки стека:

Исключение существует

Вы должны указать формат файла журнала. См. JavaDoc для получения дополнительной информации:

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

1 голос
/ 13 апреля 2011

Если ваша цель состоит в том, чтобы отслеживать журналы вашего приложения на наличие ошибок, то лучшим решением может стать такой инструмент, как Бензопила .

0 голосов
/ 13 апреля 2011
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 голосов
/ 13 апреля 2011
  • Открыть файл
  • Чтение до тех пор, пока вы не нажмете строку с ОШИБКОЙ
  • Чтение и обработка строк, пока не достигнете пустой строки после трассировки стека.

промыть, повторить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...