Ich muss eine Datei listen, wenn der Inhalt hinzugefügt wird, werde ich die neue Zeile lesen und den Inhalt der neuen Zeile bearbeiten. Die Länge der Datei wird niemals verringert (in Wirklichkeit ist es die Tomcat-Protokolldatei).RandomAccessFile Problem
Ich verwende die folgenden Codes:
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();
}
}
Nun, mein Problem ist, dass, wenn eine Linie, die in die Akten der neuen Zeile geschrieben wird nicht abgeschlossen ist, eine tote Schleife auftreten.
Zum Beispiel, wenn der Kater in die Datei eine neue Zeile zu schreiben versuchen:
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"
Und wenn nur ein Teil der Zeile geschrieben (zum Beispiel: < 10.33.2.45 - - [08/Dez/2010: 08: 44: 43 +0800] "GET /poi.txt HTTP/1.1" 200 672>), jetzt, da es nicht mit dem Muster übereinstimmen kann, das ich definiert habe, das heißt, tomcat schließt das Schreiben nicht ab arbeite, also werde ich versuchen, den filepointer zurückzusetzen und 2 Sekunden schlafen und dann wieder lesen.
Während der Ruhezeit, der letzte Teil der Zeile geschrieben vielleicht noch (in der Tat schreibe ich sie eher als Tomcat für Test), meiner Meinung nach randomaccessfile liest eine neue Zeile, die das Muster übereinstimmen kann, aber es scheint nicht.
Jeder kann die Codes überprüfen lassen?
HINWEIS: das Format der Protokolldatei „combined“ wie folgt aus:
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"
verwenden Sie versuchen, eine Prämie anbieten können. Auch, bitte tun Sie das nicht. – Will
Post die Beispiel-Log-Datei mit mehr als 1 Zeile in den Protokollen und auch ich bin nicht klar, was genau das Problem ist –