Guten Abend,
ich habe mir eine kleine simple Logfile Klasse geschrieben, die 3 Verschiedene Typen unterscheiden kann: Warnung, Error, Message. Desweitern soll sich die Datei um Mitternacht wechseln.
Ich wollte einfach mal nachfragen was ich daran noch verbessern kann, oder ob jemand noch Fehler entdeckt.
Ich habe 2 Klassen:
LogEntry:
LogFile:
Eine Beispielausgabe wäre dann z.B. die Log_10.03.2010.log:
Diese Datei soll später wieder in einer Liste aufbereitet werden mit Bild, Zeitpunkt, und Nachricht.
Was könnte ich noch verbessern?
mfg. Dagobert
ich habe mir eine kleine simple Logfile Klasse geschrieben, die 3 Verschiedene Typen unterscheiden kann: Warnung, Error, Message. Desweitern soll sich die Datei um Mitternacht wechseln.
Ich wollte einfach mal nachfragen was ich daran noch verbessern kann, oder ob jemand noch Fehler entdeckt.
Ich habe 2 Klassen:
LogEntry:
Java:
package Logfile;
import java.util.Calendar;
public class LogEntry {
public static int TYP_ERROR = 0;
public static int TYP_WARNING = 1;
public static int TYP_MESSAGE = 2;
private Calendar date;
private int typ;
private String text;
public LogEntry(int typ, Calendar datum, String text){
this.setTyp(typ);
this.setDatum(datum);
this.setText(text);
}
public LogEntry(int typ, String text){
this.setTyp(typ);
this.setDatum(Calendar.getInstance());
this.setText(text);
}
public void setDatum(Calendar datum){
this.date = datum;
}
public Calendar getDatum(){
return this.date;
}
public void setTyp(int typ){
this.typ = typ;
}
public int getTyp(){
return this.typ;
}
public String getTypToString(){
switch(typ){
case 0: return "TYP_ERROR";
case 1: return "TYP_WARNING";
case 2: return "TYP_MESSAGE";
default: return null;
}
}
public void setText(String text){
this.text = text;
}
public String getText(){
return this.text;
}
}
LogFile:
Java:
package Logfile;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import javax.swing.Timer;
import Datum.Datumsfunktion;
/**
* * Speichert Logeinträge in einer Datei, die jeweils um Mitternacht wechselt
* @author Dagobert
* @since 20.02.2010
* @version 1.0
*/
public class LogFile implements ActionListener {
private String path; // Pfad wo die Log-Dateien abgelegt werden
private Calendar date; // Datum für die Log-Datei
private SimpleDateFormat timeFormater = new SimpleDateFormat("HH:mm:ss", Locale.GERMAN);
private SimpleDateFormat dateFormater = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN);
private ArrayList<LogEntry> entries; // Speicher für die Einträge
private PropertyChangeSupport changes; // abonnenten für änderungen
private BufferedWriter bw;
private Timer changeTimer; // Timer zum wechseln der Datei um mitternacht
public LogFile(String pfad) {
entries = new ArrayList<LogEntry>();
changes = new PropertyChangeSupport(this);
changeTimer = new Timer(1000, this);
date = Calendar.getInstance();
setPfad(pfad);
createNewFile();
restartLogfileChange();
}
/**
* Erstellt ein Erroreintrag in der Logdatei
* @param error Nachricht des Eintrages
*/
public void error(String error) {
changes.firePropertyChange("logentry", getAnzahl(), getAnzahl() + 1);
LogEntry e = new LogEntry(LogEntry.TYP_ERROR, error);
entries.add(e);
writeLastLogentry();
}
/**
* Erstellt eine Warnungseintrag in der Logdatei
* @param warning, Nachricht des eintrages
*/
public void warning(String warning) {
changes.firePropertyChange("logentry", getAnzahl(), getAnzahl() + 1);
LogEntry e = new LogEntry(LogEntry.TYP_WARNING, warning);
entries.add(e);
writeLastLogentry();
}
/**
* Erstellt eine Nachricht in der Logdatei
* @param message Nachricht der Logdatei
*/
public void message(String message) {
changes.firePropertyChange("logentry", getAnzahl(), getAnzahl() + 1);
LogEntry e = new LogEntry(LogEntry.TYP_MESSAGE, message);
entries.add(e);
writeLastLogentry();
}
/**
* Setzt den Pfad der Logdateien
* @param pfad pfad der Logdatei
*/
public void setPfad(String pfad) {
this.path = pfad;
}
/**
*
* @return Pfad der Logdatei
*/
public String getPfad() {
return this.path;
}
/**
*
* @return Anzahl der Logeinträge im Logfile
*/
public int getAnzahl() {
return entries.size();
}
/**
*
* @return Datum des Logfiles
*/
public Calendar getDate(){
return this.date;
}
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
private void createNewFile() {
File f = new File(path + "Log_" + Datumsfunktion.getCurrentDate() + ".log");
boolean exists = f.exists();
try {
FileWriter fw = new FileWriter(f, true);
bw = new BufferedWriter(fw);
if (!exists) {
bw.write(Datumsfunktion.getCurrentDate());
bw.newLine();
bw.flush();
} else {
loadFile(f);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void loadFile(File f) {
try {
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
date = Datumsfunktion.stringToDate(br.readLine().split(" ")[1], "dd.MM.yyyy");
String line = br.readLine();
while (line != null) {
entries.add(parseToEntry(line));
line = br.readLine();
}
br.readLine();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private LogEntry parseToEntry(String stringEntry) {
String[] dataString = stringEntry.split(";");
Calendar date = Datumsfunktion.stringToDate(dataString[0], "dd.MM.yyyy HH:mm:ss");
String typString = dataString[1].split(" ")[2];
int typ;
if (typString.equals("TYP_ERROR")) {
typ = LogEntry.TYP_ERROR;
} else if (typString.equals("TYP_WARNING")) {
typ = LogEntry.TYP_WARNING;
} else {
typ = LogEntry.TYP_MESSAGE;
}
String message = dataString[2].substring(1);
LogEntry e = new LogEntry(typ, date, message);
return e;
}
private void writeLastLogentry() {
if (bw != null) {
try {
LogEntry e = entries.get(entries.size() - 1);
String s = dateFormater.format(e.getDatum().getTime()) + " " + timeFormater.format(e.getDatum().getTime()) + "; Typ: " + e.getTypToString() + " ->; " + e.getText();
bw.write(s);
bw.newLine();
bw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void restartLogfileChange() {
Calendar current, next;
current = Calendar.getInstance();
next = Calendar.getInstance();
next.set(current.get(Calendar.YEAR), current.get(Calendar.MONTH), current.get(Calendar.DAY_OF_MONTH) + 1 ,0, 0, 0);
changeTimer.setInitialDelay((int) (next.getTimeInMillis() - current.getTimeInMillis()));
changeTimer.restart();
}
private void closeLogfile(){
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent evt) {
try {
restartLogfileChange();
message("! ! ! Logfile ende ! ! !");
bw.close();
createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Eine Beispielausgabe wäre dann z.B. die Log_10.03.2010.log:
Code:
10.03.2010
10.03.2010 18:49:34; Typ: TYP_ERROR ->; Es konnte keine Verbindung mit der Datenbank GELDTRANSPORTER hergestellt werden
Diese Datei soll später wieder in einer Liste aufbereitet werden mit Bild, Zeitpunkt, und Nachricht.
Was könnte ich noch verbessern?
mfg. Dagobert