Hallo allerseits,
Ich schreibe gerade eine eigene Logging-Klasse, dabei versuche ich gerade eine log-Datei (Textdatei) auf die gewünschte Anzahl von Zeilen zu kürzen. Eine funktionierende Lösung habe ich wie es aussieht schon gefunden, allerdings ist diese Lösung auch enorm langsam.
Im Grunde genommen mache ich das im Moment so: vom log-file wird die Zeilenanzahl ermittelt, wenn die höher ist als die gewünschte Zeilenanzahl wird das log-file getrimmt. Dazu werden alle Zeilen wieder in eine Liste gelesen, diese dann entsprechend gekürzt, dann das alte log-file gelöscht und neu geschrieben.
Wie gesagt läuft mir das irgendwie viel zu langsam. Ich hätte mir auch schon überlegt, den Inhalt der Liste ständig im Speicher zu halten aber das erscheint mir dann doch noch verschwenderischer.
Hat vielleicht irgendwer einen besseren Ansatz? Oder gibt es Verbesserungen am Code selbst? Wo verschenke ich vielleicht viel Laufzeit?
Danke im Voraus...
Ich schreibe gerade eine eigene Logging-Klasse, dabei versuche ich gerade eine log-Datei (Textdatei) auf die gewünschte Anzahl von Zeilen zu kürzen. Eine funktionierende Lösung habe ich wie es aussieht schon gefunden, allerdings ist diese Lösung auch enorm langsam.
Im Grunde genommen mache ich das im Moment so: vom log-file wird die Zeilenanzahl ermittelt, wenn die höher ist als die gewünschte Zeilenanzahl wird das log-file getrimmt. Dazu werden alle Zeilen wieder in eine Liste gelesen, diese dann entsprechend gekürzt, dann das alte log-file gelöscht und neu geschrieben.
Wie gesagt läuft mir das irgendwie viel zu langsam. Ich hätte mir auch schon überlegt, den Inhalt der Liste ständig im Speicher zu halten aber das erscheint mir dann doch noch verschwenderischer.
Hat vielleicht irgendwer einen besseren Ansatz? Oder gibt es Verbesserungen am Code selbst? Wo verschenke ich vielleicht viel Laufzeit?
Danke im Voraus...
Java:
private void trimLogFileToMaximumLines(File textFile, int maximumLines, boolean trimAtBegin) {
int actualLogFileLineCount = countLinesInTextFile(logFile);
if(actualLogFileLineCount > maximumLines) {
ArrayList<String> logFileLines = new ArrayList<String>();
try {
FileReader fr = new FileReader(logFile);
LineNumberReader ln = new LineNumberReader(fr);
try {
boolean linesLeft = true;
while(linesLeft) {
String line = ln.readLine();
if(line == null) {
linesLeft = false;
} else {
logFileLines.add(line);
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
logFile.delete();
while(logFileLines.size() > maximumLines) {
if(trimAtBegin) {
logFileLines.remove(0);
} else {
logFileLines.remove(logFileLines.size()-1);
}
}
for (String line : logFileLines) {
appendLogEntryToLogFile(line);
}
}
}
Java:
public int countLinesInTextFile(File logFile) {
int count = 0;
if(logFile.exists()) {
try {
FileReader fr = new FileReader(logFile);
LineNumberReader ln = new LineNumberReader(fr);
try {
while(ln.readLine() != null) {
count++;
}
ln.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return count;
}
Java:
private void appendLogEntryToLogFile(String composedLogMessage) {
boolean append = true;
FileWriter fw = null;
try {
fw = new FileWriter(logFile,append);
} catch (IOException ioe) {
ioe.printStackTrace();
}
try {
fw.write(composedLogMessage + System.getProperty("line.separator"));
} catch (IOException ioe) {
ioe.printStackTrace();
}
try {
fw.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}