파일을 listern해야합니다. 내용이 추가되면 새 줄을 읽고 새 줄의 내용을 처리합니다. 파일의 길이는 결코 줄어들지 않습니다 (실제로는 tomcat 로그 파일입니다).RandomAccessFile 문제
나는 다음과 같은 코드를 사용 :
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import org.apache.log4j.Logger;
import com.zjswkj.analyser.ddao.LogEntryDao;
import com.zjswkj.analyser.model.LogEntry;
import com.zjswkj.analyser.parser.LogParser;
public class ListenTest {
private RandomAccessFile raf;
private long lastPosition;
private String logEntryPattern = "^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\S+) \"([^\"]+)\" \"([^\"]+)\"";
private static Logger log = Logger.getLogger(ListenTest.class);
public void startListenLogOfCurrentDay() {
try {
if (raf == null)
raf = new RandomAccessFile(
"/tmp/logs/localhost_access_log.2010-12-20.txt",
"r");
String line;
while (true) {
raf.seek(lastPosition);
while ((line = raf.readLine()) != null) {
if (!line.matches(logEntryPattern)) {
// not a complete line,roll back
lastPosition = raf.getFilePointer() - line.getBytes().length;
log.debug("roll back:" + line.getBytes().length + " bytes");
if (line.equals(""))
continue;
log.warn("broken line:[" + line + "]");
Thread.sleep(2000);
} else {
// save it
LogEntry le = LogParser.parseLog(line);
LogEntryDao.saveLogEntry(le);
lastPosition = raf.getFilePointer();
}
}
}
} catch (FileNotFoundException e) {
log.error("can not find log file of today");
} catch (IOException e) {
log.error("IO Exception:" + e.getMessage());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ListenTest().startListenLogOfCurrentDay();
}
}
지금, 내 문제를 파일의 새로운 라인에 기록되는 라인이 완료되지 않을 경우, 죽은 루프 것, 그 나오다. 예를 들어
, 바람둥이 파일에 새 라인을 작성하려고하는 경우 :
10.33.2.45 - - [08/Dec/2010:08:44:43 +0800] "GET /poi.txt HTTP/1.1" 200 672 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
그리고 라인의 한 부분 (예를 들어, 작성 : < 10.33.2.45 - - [08/Dec/2010 : 08 : 44 : 43 +0800] "GET /poi.txt HTTP/1.1"200 672>) 이제 정의 된 패턴과 일치 할 수 없으므로, 작동하므로 파일 포인터를 롤백하고 2 초 동안 기다렸다가 다시 읽으려고합니다.
잠자기 시간 동안, 라인의 마지막 부분이 아직 쓰여질 수 있습니다. (필자는 테스트를 위해 바람둥이 라기보다는 사실 쓰고 있습니다.) 제 생각에, randomaccessfile은 패턴과 일치 할 수있는 새로운 라인을 읽습니다. 아니.
코드를 확인할 수있는 사람은 누구입니까?
참고 : 로그 파일의 형식은 다음과 같이 "결합"된다
10.33.2.45 - - [08/Dec/2010:08:44:43 +0800] "GET /poi.txt HTTP/1.1" 200 672 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
내 대답을 확인 RAF에서의 BufferedReader를 사용합니다. 또한, pls하지 않습니다. – Will
로그에 둘 이상의 행이있는 샘플 로그 파일을 게시하고 또한 정확히 무엇이 문제인지 알 수 없음 –