2013-01-25 3 views
0

로그 파일을 계속 파싱하고 있고 회전이 감지되면이를 처리하는 가장 좋은 방법은 무엇입니까?로그 파일이 회전 된 경우 어떻게해야합니까?

  1. 업데이트 때문에이 처음부터 파일을 회전 읽을 수 있습니다 내 내부 해시 맵은 ( 회전 된 파일의 끝)
  2. 새로운 파일 포인터를 반영 아니면 0으로 해시 맵을 업데이트해야합니다

내 관심사는 상황 번호가 비정상 인 경우입니다. 위에서 언급 한 2, 나는 간접적으로 처음부터 큰 파일을 구문 분석하고 호스트에 상당한 부하를 넣을 수 있습니다. 그러나 아니요. 1 로그 파일을 구문 분석 할 때 중요한 메시지가 누락 될 수 있습니다.

이것은 내가 작성한 코드입니다.

당신이 게시 코드에서
currentFilePointer = util.FileManagement.getLastFilePointerFromFile(file.getName()); 
lastFilePointer = Long.parseLong(lastReadFiles_.get(file.getName()).toString()); 

if (currentFilePointer < lastFilePointer) // file has grown 
{ 
    processLineByLine(file.getName(), currentFilePointer, lastFilePointer); 
} else if (currentFilePointer > lastFilePointer) // file has been rotated 
{ 
    lastReadFiles_.put(file.getName(), currentFilePointer); // Option 1 
} 

답변

0

, 내가 어떤 해시 맵 ... 하드가 더있는 솔루션을 말해 볼 수 없습니다 :

는 여기가 "꼬리"파일을 사용하는 코드의 조각은,이다 이는 또한 (별도의 스레드에서 실행되는) 회전을 지원합니다

@Override 
public void start() { 
    File file = ... 
    long filePointer = 0; 
    try { 
     while (running) { 
      Thread.sleep(updateInterval); 
      long len = file.length(); 
      if (len < filePointer) { 
       // File was rotated 
       filePointer = 0; 
      } else if (len > filePointer) { 
       // File must have had something added to it! 
       RandomAccessFile raf = new RandomAccessFile(file, "r"); 
       raf.seek(filePointer); 

       // Here you can read the next lines using for example a BufferedReader 

       filePointer = raf.getFilePointer(); 
       raf.close(); 
      } 
     } 
    } catch (Exception e) { 
     // ... 
    } 
} 
0

나는 당신의 문제는 일반적으로 로그 파일을 관리하는 방법이라고 생각합니다. 이러한 작업은 bash와 같은 스크립트 언어 나 python과 같은 일반적인 스크립트 언어를 사용하여 수행 할 수 있습니다. Java 사용에 대한 광범위한 자습서는 managing Logs for the Java Subsystems입니다.

관련 문제