Event Handling Logging

MarioW1986

Bekanntes Mitglied
Guten Morgen zusammen, ssry wegen dem wenig aussagekraftigen Titels^^ ich wusste nicht wie ich mein Problem in einem Titel fassen sollte ohne dass er lang wird.

Also mein Problem ist nur ein Schönheitsfehler aber auf die Dauer etwas nervig.
Ich rufe in der Main folgenden Code auf:

Java:
public static void main(String[] args)
    {       
            //String para = args[0].toString();
            String para = "G:";
            
            
            Software fenster = new Software(para){

                @Override
                public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub

                }};
            
            
            
                FileHandler fh = null;
                try 
                {
                    fh = new FileHandler(para + "\\" + "P8008-Software_LOG.html", true);
                } 
                catch (SecurityException | IOException e1) 
                {
                    sourceLineNumber = 0;
                    sourceLineNumber = e1.getStackTrace()[3].getLineNumber();
                    sourceMethodName = e1.getStackTrace()[3].getMethodName();
                    sourceClassName = e1.getStackTrace()[3].getClassName();
                    logger.logp(Level.SEVERE, sourceClassName, sourceMethodName, "", e1);
                }
                Formatter formatter = new HTMLTableFormatter();
                fh.setFormatter(formatter);
                logger.addHandler(fh);
            
    }

in meiner HTMLTableFormatter Classe liegt eine HTML Tabelle drinne die ich dort erstelle. (Code folgt nach meiner Beschreibung) in dieser HTML Tabelle trage ich dann alle meine Fehler ein, die während der Programmausführung anfallen. Das funktioniert auch wunderbar. Leider wird Pro Programmstart eine neue Tabelle an die Alte drangehängt selbst wenn keine Fehler auftraten. Heißt es wird der TabellenHeader angelegt und sonst nichts. Das wird dan nauf die Dauer leider etwas unübersichtlich. Daher würde ich das gerne so machen, dass wenn keine Fehler aufgetreten sind nur ein String ausgegeben wird. Sowas wie beim Ausführen des Programm ist kein Fehler aufgetreten und da vllt no hdas Datum reinpacken wann es ausgeführt wurde. Das bekomm ich aber selbst hin. Was ich nicht hinbekomme ist, das zu prüfen ob ein Fehler angefallen ist.

Noch als Info, wenn irgendwo ein Fehler auftritt, dann spring ich in nen Catch Block und mache folgendes:

Java:
....
} catch (IOException ex) {
            	sourceLineNumber = 0;
            	sourceLineNumber = ex.getStackTrace()[3].getLineNumber();
        	sourceMethodName = ex.getStackTrace()[3].getMethodName();
                sourceClassName = ex.getStackTrace()[3].getClassName();
                logger.logp(Level.SEVERE, sourceClassName, sourceMethodName, "Beim hinzufügen der Daten hat es ein Problem gegeben", ex);
                break;   
            }
....

So und wie oben angekündigt noch der Code für meinen Formatter:
Java:
public class HTMLTableFormatter extends Formatter {
    Software software;
    
    private static final DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
    private static final DateFormat tf = new SimpleDateFormat("HH:mm:ss");

    public HTMLTableFormatter() {

    }

    public synchronized String format(LogRecord record) {
        StringBuffer buf = new StringBuffer(1000);
        if (record.getLevel().intValue() >= Level.WARNING.intValue()) 
        {   
        	
            buf.append("  <tr><td>").append(tf.format(new Date(record.getMillis()))).append("</td>");
            buf.append("<td align=\"center\">").append(record.getLevel()).append("</td>");
	            
            if(Software.getSourceClassName() != null)
	            {
	            	buf.append("<td>").append(Software.getSourceClassName().substring(Software.getSourceClassName().indexOf(".")+1, Software.getSourceClassName().indexOf("$"))).append("</td>");
	            }
	            else
	            {
	            	buf.append("<td>").append(record.getSourceClassName()).append("</td>");
	            }
	            
            if(Software.getSourceMethodName() != null)
            	{
            		buf.append("<td>").append(Software.getSourceMethodName()).append("</td>");
            	}
	            else
	            {
	            	buf.append("<td>").append(record.getSourceMethodName()).append("</td>");
	            }
            
            if(Software.getSourceLineNumber() != 0)
	            {
            		buf.append("<td align=\"center\">").append(Software.getSourceLineNumber()).append("</td>");
	            }
	            else
	            {
	            	buf.append("<td align=\"center\">").append("Keine").append("</td>");
	            }
            	
            
            buf.append("<td>").append(record.getMessage()).append("</td>");
            
            if(record.getThrown() == null)
            {
            	buf.append("<td>").append("Keine Fehlermeldung!").append("</td></tr>\n");
            }
            else
            {
            	buf.append("<td>").append(record.getThrown()).append("</td></tr>\n");
            }
        }
        return buf.toString();
    }
    
  

    @Override
    public String getHead(Handler h) {
        return ("<html><head><b><u><font color=\"#FF0000\">P8008-Auswertungssoftware Logging Report vom " + df.format(new Date().getTime()) + "</font></b></u></head><body><pre><table border>\n  "
        + "<tr><th align=\"center\">Uhrzeit</th>"
        + "<th align=\"center\">Level</th>"
        + "<th align=\"center\">Klasse</th>"
        + "<th align=\"center\">Methode</th>"
        + "<th align=\"center\">Codezeile</th>"
        + "<th align=\"center\">Hinweis</th>"
        + "<th align=\"center\">Fehlermeldung</th></tr>\n");  
    }
    
    @Override
     public String getTail(Handler h) {
        return "</table></pre></body><br><br></html>\n";
      }
}


Ich hoffe ich konnte mein "Problem" verständlich schildern und Ihr könnt mir einmal mehr weiterhelfen :)
Danke
gruß Mario
 

MarioW1986

Bekanntes Mitglied
heißt das jetzt das ich das Wort Problem nicht benutzen soll^^ oder das das Programm so wie ich es habe richtig ist?^^

Weil deine Antwort bringt mich sonst nicht wirklich weiter^^ Dachte nur, dass man das vllt auch irgendwie anders / eleganter lösen könnte.
 
Zuletzt bearbeitet:

NiXPhoE

Gesperrter Benutzer
Elegant ist ohne Fehler. Das Program verstehe ich nicht, vieleicht weiß jemand anderes Rat. Ich hab hier im Forum den Tip bekommen daß man am besten alles ausprogrammiert ohne Fehler.
 
M

maki

Gast
Elegant ist ohne Fehler. Das Program verstehe ich nicht, vieleicht weiß jemand anderes Rat. Ich hab hier im Forum den Tip bekommen daß man am besten alles ausprogrammiert ohne Fehler.
Sorry, aber das ist Mumpitz.

Fehler können eben auftreten wenn man externe Ressoucen wie Dateien etc. nutzt, dann muss man darauf reagieren können.

@TS
Grundsatz:
Exceptions früh werfen und "spät" behandeln.

Mit "spät" ist gemeint, dass man die Exception dort behandelt, wo man genug Informationen hat um damit umgehen zu können. D.h. wenn man zu "tief" ist um die Exception sinnvoll behandeln zu können, wirft man sie weiter.

Wenn du Exception nur logst und nicht weiterwirft, kann weiter "oben" eben nicht mehr darauf reagiert werden.
 

MarioW1986

Bekanntes Mitglied
Moin zusammen, ich werfe die Exceptions schon bis in die oberen Instanz in der meine Main auch steht. Die anfallenden Fehler werden in der oberen Klasse im Konstruktor abgearbeitet. Die vorschläge hier bringen mich absolut nicht weiter. Also versuch ichs einfach alleine weiter.
 

Ähnliche Java Themen

Neue Themen


Oben