Nun also doch wieder ein winziger Beitrag zur Java-Welt von mir. Da ich an Projekten arbeite, die mit Hilfe von Apache Log4j Logdateien erstellen, wurde kürzlich die Frage geäußert, wie man denn verhindern kann, dass das System irgendwann mit gigabytegroßen Logs volllaufen wird. Die bisherige „Alles-in-eine-Datei“-Implementierung sollte also ersetzt werden durch eine Lösung mit täglichem Wegspeichern der Logs vom Vortag und nach Möglichkeit direkt als ZIP-Datei, um Platz zu sparen (Plain Text lässt sich bekanntlich unheimlich gut packen). Hinzu kommt dann noch, dass nur die Logdateien der letzten x Tage vorgehalten werden sollten. Ältere Logs müssen automatisch gelöscht werden.

Nun ist Log4j ein sehr mächtiges Tool, das einem wirklich viel Arbeit abnimmt. Der RollingFileAppender z.B. erlaubt es dem Entwickler ganz einfach, Logdateien wegzuspeichern, wenn sie eine bestimmte Dateigröße erreicht haben, und die nächste Logdatei zu beginnen. Wunderbarerweise gibt es zusätzlich sogar die Möglichkeit, mit maxBackupIndex vorzugeben, wieviele Logdateien gleichzeitig gespeichert bleiben sollen. Fast perfekt, aber leider nicht auf periodisches, also z.B. tägliches Wegspeichern anwendbar. Zu meinem Glück gibt es genau für diese Anforderung den DailyRollingFileAppender, so als wäre er direkt für mich gemacht worden. Und jetzt kommt der Brüller: Der DailyRollingFileAppender hat blöderweise wieder keinen maxBackupIndex, er erlaubt also nicht das Vorhalten einer vorgegebenen Anzahl an Logdateien. Super Sache. Wie bekomme ich jetzt DEN FileAppender, der beides kann? Ich bräuchte eine Kombination aus beidem.

Unter http://wiki.apache.org/logging-log4j/DailyRollingFileAppender fand ich die Rettung in Form einer fertigen Klasse: Der DailyMaxRollingFileAppender – tägliches Wegspeichern mit Angabe des maxBackupIndex. Damit wären also zwei von drei Anforderungen erfüllt. Die ZIP-Funktionalität fehlte noch. Meine Mission war es also, einen kleinen FileAppender zu schreiben, der den DailyMaxRollingFileAppender erweitert. Geboren war der DailyMaxRollingZipFileAppender (DAS ist mal ein Klassenname!):

Dieser FileAppender benennt zum Tageswechsel das Logfile mit Angabe des Datums um, verpackt es sofort als handliche ZIP-Datei, und löscht bei Bedarf das älteste Logfile (sofern maxBackupIndex erreicht). Ist ja eigentlich schon fast schade, dass Log4j sowas nicht von Haus aus kann. Falls jemand zufällig mit Log4j zu tun hat und damit was anfangen könnte: Bedient euch.

In related news: Hurra, endlich ein Syntax-Highlighter-Plugin für SuccessDenied. Als Programmierer kann man doch beinahe keinen Blog führen ohne ein solches Plugin.