LineNumberReader - bessere Lösung möglich? - Log4J

Status
Nicht offen für weitere Antworten.

S2PID

Mitglied
Hallo,
ich möchte in meiner Software alle Exceptions die auftreten abfangen, abspeichern und in einem seperaten Fenster anzeigen.
Meine Idee war nun jedes mal wenn eine Exception irgendwo auftritt das ganze in einem txt file abzuspeichern (mit Zeitstempel)
Nun hab ich mir ein Internes Fenster angelegt mit einer JList. Ebenso einen Thread der diese Liste aktuell halten soll
Der Thread ruft nun alle 100ms diese Methode auf um meine Liste mit den Fehlermeldungen aktuell zu halten.
Kann man das grundsätlich besser lösen? weil ich finde wenn der Thread nun alle 100ms (gut ich kann gerne noch auf (500-1000ms hochgehen) das komplette File von vorne bis hinten durchläuft und schaut ob es was neues gibt doch etwas performancelastig, oder täusche ich mich da? Kann man vielleicht direkt an eine Zeile springen und von da das lesen beginnen? Ich weiß ja theoretisch das er die Zeilen welche schon im Fenster(JList) angezeigt werden auch in meinem File nicht mehr lesen muss.

Code:
	private DefaultListModel exceptionListModel = new DefaultListModel();

	public void exceptionsauslesen(){
		File readfile = new File("log\\exceptions.txt");
		String line;
		int anzexceptionslist = exceptionListModel.getSize();
		try
		{
			if (!readfile.exists())
			{
				readfile.createNewFile();
			}
			LineNumberReader exceptionsreader = new LineNumberReader(new BufferedReader(new FileReader(readfile)));
			while((line = exceptionsreader.readLine()) != null){
				if(exceptionsreader.getLineNumber() > anzexceptionslist){
					exceptionListModel.addElement(line);
				}			
			}
		}
		catch (Exception e)
		{
			System.err.println("Fehler: " + e.getMessage());
		}
	}

Edit: ich hab mal den Threadtitel mit - log4j versehen. Da das eigentliche Problem zu einem ganz anderen wurde.
 

Wildcard

Top Contributor
Warum überhaupt erst die Datei?
Wenn du Exceptions in einer GUI darstellen möchtest, solltest du sie in einen OutputStream oder so schreiben, den du dann in eine JTextArea, JList, oder was auch immer münden lässt. Dafür musst du nichts in eine Datei schreiben und auch nicht pollen.
Schau dir vielleicht auch mal ein Logging Framework wie Log4J, oder das bereits enthaltene java.util.logging an. Sowas bastelt man sich heute nicht mehr selbst.
 

S2PID

Mitglied
Vielen Dank für den Tipp.

Natürlich macht das so viel mehr Sinn :) Also ich habe mich nun seit heute Nachmittag mit Log4J auseinander gesetzt.
Es läuft auch schon soweit das alles in eine .log Datei ausgegeben wird.

Weiter oben erwähnte ich nicht, das die Fehlermeldungen alle in meinem Hauptprogramm in einem InternalFrame angezeigt werden sollen. Also das InternalFrame hab ich schon erstellt und mit einer JList versorgt.

Nun sollen dort alle Meldungen auch erscheinen, das versteh ich noch nicht so ganz wie das ablaufen soll. Theoretisch ändert sich doch gar nichts daran das ich das logfile wie weiter oben beschrieben auch auslesen muss oder ?
Falls es anders (besser) geht, würde ich mich sehr über ein Beispiel freuen.
 

Wildcard

Top Contributor
Du kannst die Log4J Ausgabe doch auch in einen Outputstream schicken.
Das kann dann einen eigene Implementierung von OutputStream sein, die zeilenweise Zeug in die JList stopft.
 

S2PID

Mitglied
Also ich hab das nun mal versucht hinzubasteln

komm aber irgendwie nicht ganz klar mit der log4j ausgabe.


nachdem meine gui initialisiert wurde leite ich den stream um. und setz nen listener drauf:
Code:
				System.setOut(new PrintStream(stream));
				System.setErr(new PrintStream(stream));
				/** WriteListener an den Stream haengen */
				stream.addWriteListener(new WriteListener()
				{
					/** Event Handler reagiert auf WriteEvent */
					public void TextWasWritten(WriteEvent event)
					{
						/** Buffer erzeugen und Meldung anhaengen */
						StringBuffer buffer = new StringBuffer();
						// buffer.append(new String(stream.toByteArray()));
						buffer.append(new String(stream.toString()));
						/** Buffer ausgeben und Stream zuruecksetzen */
						// textArea.append(buffer.toString());
						exceptionChild.exceptionListModel.addElement(buffer.toString());
						stream.reset();
					}
				});


hier der listener:
Code:
package de.analyzer.daten;

import java.io.ByteArrayOutputStream;
import java.util.Vector;


/**
* Eigener Ausgabestrom, der so erweitert wurde,
* dass Listener bei ihm registriert werden koennen.
* Werden Daten in den Stream geschrieben, loest
* dieser ein WriteEvent aus und informiert alle
* registrierten Listener ueber das Ereignis.
*
* @author NetPanther
*/
public class OutputStream extends ByteArrayOutputStream
{
  /** Vector fuer registrierte Listener */
  Vector<WriteListener> listeners;
 
 
  /**
   * Neuen Listener registrieren.
   *  
   * @param listener zu registierender Listener
   */
  public void addWriteListener(WriteListener listener)
  {
     if (listeners == null)
     {
        listeners = new Vector<WriteListener>();
     }
     listeners.add(listener);
  }
 
  /**
   * Registrierten Listener wieder abmelden.
   *
   * @param listener abzumeldender Listener
   */
  public void removeWriteListener(WriteListener listener)
  {
     if (listeners != null)
     {
        listeners.remove(listener);
     }  
  }
 
  /**
   * WriteEvent abfeuern und alle registrierten
   * Listener ueber das Ereignis informieren.
   *
   * @param object Objekt
   */
  private void fireWriteEvent(Object object)
  {
     WriteEvent event = new WriteEvent(object);
     
     for (WriteListener listener: listeners)
     {
        listener.TextWasWritten(event);
     }
  }
 
  /**
   * Funktion ueberschreiben, die aufgerufen
   * wird, wenn Daten in den Stream geschrieben
   * werden sollen. In diesem Fall moechten wir
   * naemlich das WriteEvent abfeuern und alle
   * registrierten Listener informieren.
   *
   * @param array Byte-Array mit Daten, die
   * in den Stream geschrieben werden sollen
   * @param offset Offset, von dem aus Daten
   * geschrieben werden sollen
   * @param length Laenge der zu schreibenden
   * Daten
   */
  public void write(byte[] array, int offset, int length)
  {
     super.write(array, offset, length);
     
     /** WriteEvent abfeuern */
     fireWriteEvent(this);
  }
}

Code:
package de.analyzer.daten;

import java.util.EventObject;

public class WriteEvent extends EventObject
{
	  /**
	   * Konstruktor schleift Parameter an
	   * den parent-Konstruktor durch.
	   *
	   * @param source Objekt
	   */
	  public WriteEvent(Object source)
	  {
	     super(source);
	  }
}

Code:
package de.analyzer.daten;

public interface WriteListener
{
	  /**
	   * Event Handler, der darauf reagiert,
	   * wenn ein WriteEvent ausgeloest wurde.
	   */
	  public void TextWasWritten(WriteEvent event);
}

Das funktioniert auch soweit prima, wenn ich irgendwo in meiner software testausgaben auf die konsole machen lasse. z.b. über System.out.print("") erscheinen die wunderbar in meiner JList.

Problem sind nun die log4j ausgaben, die erscheinen NUR in der Konsole nicht in meinem stream
Ich weiß einfach nicht warum. Das nächste das nicht funktioniert ist das setzen des Levels der Log4j ausgabe.

hier mein log4j.xml file:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n"/>
		</layout>
	</appender>
	<root>
		<priority value="debug"></priority>
		<appender-ref ref="stdout"/>
	</root>
</log4j:configuration>
das ganze liegt zusammen mit einem log4j.dtd file in meinem /src ordner

im programm selbst setz ich den logger mit:
Code:
private static org.apache.log4j.Logger	logger			= Logger.getLogger(Analyzer.class);

und nachdem dann alles initialisiert wurde ruf ich zum testen:
Code:
		logger.info("Hinweis");
		logger.debug("Debug-Meldung");
		logger.warn("Warnung");
		logger.error("Fehler");
		logger.fatal("fataler Fehler");

auf, die konsolen ausgabe ist dann:

Code:
13:51:27,062  INFO Analyzer:77 - Hinweis
13:51:27,064 DEBUG Analyzer:78 - Debug-Meldung
13:51:27,064  WARN Analyzer:79 - Warnung
13:51:27,065 ERROR Analyzer:80 - Fehler
13:51:27,066 FATAL Analyzer:81 - fataler Fehler
Normalerweise dürfte gar nichts mehr in der Konsole sein. Ich verstehs nicht :(
 

S2PID

Mitglied
ich hab noch einges ausprobiert. Funktionieren tut es zwar noch nicht, aber ich denke ich kann den Fehler weiter einschränken

Wenn ich mit dem Loggin von Sun arbeite, also in meiner mainklasse

Code:
import java.util.logging.Level;
import java.util.logging.Logger;

importiere anstatt log4j

und dann
Code:
static Logger logger = Logger.getLogger("Analyzer");
den logger so deklariere haut das hin mit testausgaben, die erscheinen dann nicht mehr in der Konsole sondern brav in meiner JList.
Lustigerweise habe ich zum testen in einer anderen Klasse log4j eingebunden, und das funktioniert nun auch. das logmeldungen von dort in der Jlist erscheinen.

Binde ich allerdings in meiner main wieder log4j ein, ist alles beim alten und nichts erscheint in meiner JList sondern wieder alles auf der Konsole :(

Ich hätte schon gerne Log4j verwendet, aber wenn das nicht hinhaut (ich nehm an ich bin einfach nur zu blöd das einzustellen :p ) dann verwende ich den logger von Sun. Also Hilfe wäre mir lieb :)
 

S2PID

Mitglied
Okay, bitte gebt mir ne große massive Wand wo ich meinen Kopf davor schlagen kann.
Und dafür grad nen Haufen Zeit verblödelt :(

... danke! :)
 

S2PID

Mitglied
Also erscheint nun alles da wo es hingehört.

ABER nicht so wie es soll, anscheinent ignoriert log4j mein xml und/oder properties file
Wenn ich in meinem xml/properties file paar Sachen, wie z.b. das Level einstelle juckt ihn das gar nicht :(

Laut Anleitung die ich durchgearbeitet habe sollte das xml/properties file im /src Order liegen, und das tut es auch. Und dann sollte jeder logger mit den einstellungen da arbeiten, das tuts aber nicht :(

Code:
	private static org.apache.log4j.Logger	logger;
private static OutputStream				stream			= new OutputStream();

        ......

	public static void main(String[] args)
	{
		System.setOut(new PrintStream(stream));
		System.setErr(new PrintStream(stream));

		SwingUtilities.invokeLater(new Runnable()
		{
			public void run()
			{

				Analyzer inst = new Analyzer();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}

	public Analyzer()
	{
		super();
		logger = Logger.getLogger(Analyzer.class);
		initGUI();
		
		/* einige Testausgaben erzeugen */
		logger.trace("Trace");
		logger.debug("Debug");
		logger.info("Info");
		logger.warn("Warn");
		logger.error("Error");
		logger.fatal("Fatal");


                .....


meine log4j.properties
Code:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L -- %m%n
log4j.rootLogger=warn, stdout

ausgegeben wird aber alles ab Debug
Selbiges mit dem xml file, damit gehts auch nicht. Benutzen würde ich gerne das xml file
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n"/>
		</layout>
	</appender>
	<root>
		<priority value="warn"></priority>
		<appender-ref ref="stdout"/>
	</root>
</log4j:configuration>
 

S2PID

Mitglied
Habs hinbekommen

hab das log4j.xml file vom src ordner in den projektordner gepackt und in meiner anwendung ruf ich anfangs noch:
Code:
DOMConfigurator.configureAndWatch("log4j.xml", 60*1000);
auf.

Ich hatte da irgendwo so ein Beispiel her, da ging das ohne, bei mir nicht. Nunja egal nun gehts ja :) ich wüßte trotzdem gerne warum.
Und evtl kann mir einer sagen was dieses "60*1000" bedeudet. Hab in der entsprechenden Methode nachgesehen, da steht was von Delay, ganz schlau werd ich daraus aber nicht :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Zu dumm für einen LineNumberReader Java Basics - Anfänger-Themen 13
T KLasse das bessere Array Java Basics - Anfänger-Themen 16
M Bessere bzw. kürzere Variante für Code? Java Basics - Anfänger-Themen 2
cyro Best Practice Bessere Alterative zu ArrayList gesucht Java Basics - Anfänger-Themen 3
O Funktioniert dies? Und gibt es eine bessere Lösung? Java Basics - Anfänger-Themen 6
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
S Bessere Lösung? Java Basics - Anfänger-Themen 4
S Bessere Lösung zu häufigem instanceof Java Basics - Anfänger-Themen 25
F bräuchte eine bessere entwicklungsumgebung Java Basics - Anfänger-Themen 2
S unschöne schleifen.jemand ne bessere idee Java Basics - Anfänger-Themen 4
J Wartezustand in Endlosschleife - bessere Alternativen Java Basics - Anfänger-Themen 20
G Bessere Lösung für SQL STMNT ? (Schneller?) Java Basics - Anfänger-Themen 4
G was ist die bessere Variante Java Basics - Anfänger-Themen 4
C Rechnen mit Brüchen, ist meine Lösung soweit richtig? Java Basics - Anfänger-Themen 4
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
W Texteingabe - Bedeutung Fehlermeldung, Lösung? Java Basics - Anfänger-Themen 18
M Kennt jemand die richtige Lösung? Java Basics - Anfänger-Themen 7
H Codewars akzeptiert Lösung nicht Java Basics - Anfänger-Themen 29
A Selbe Aufgaben stellung, andere Lösung Java Basics - Anfänger-Themen 7
M Lösung Aufgabe - Java Programmiren lernen für Dummies Java Basics - Anfänger-Themen 11
ZH1896ZH Java-SemesterTest ohne Lösung :( Java Basics - Anfänger-Themen 47
D Beim Programmieren auf die Logisch einfache Lösung kommen. Java Basics - Anfänger-Themen 17
M Hamstersimulator- lösung hilfe benotigt Java Basics - Anfänger-Themen 3
M Hamstersimulator- Lösung? Java Basics - Anfänger-Themen 3
E Mathematische Aufgabe: Antwort entspricht nicht der Lösung Java Basics - Anfänger-Themen 5
W Tipps/Anmerkungen zu meiner Lösung?! Java Basics - Anfänger-Themen 2
H lösung aufgabe Java Basics - Anfänger-Themen 12
J Gleiche Methode in 2 verschiedenen Klassen - Lösung ? Java Basics - Anfänger-Themen 8
P java.lang.ClassCastException Bedeutung und Lösung Java Basics - Anfänger-Themen 3
M Methoden Fehler und finde die Lösung nicht wirklich Java Basics - Anfänger-Themen 6
J RPN Taschenrechner - keine Lösung!! Java Basics - Anfänger-Themen 84
I java.lang.ArrayIndexOutOfBoundsException at lösung.main Java Basics - Anfänger-Themen 3
J Best Practice DOS Fenster mit Befehlszeile (Lösung) Java Basics - Anfänger-Themen 2
S mehrfache if-Abfragen - beste Lösung Java Basics - Anfänger-Themen 1
J Einfache pub/sub Lösung mit ausführlicher Doku Java Basics - Anfänger-Themen 5
D Best Practice Testdaten. Was ist eine saubere Lösung? Java Basics - Anfänger-Themen 3
D Datentypen Datentyperstellung | Kompiler sagt Syntax Error doch ich find keine Lösung Java Basics - Anfänger-Themen 2
V Verstehe die Lösung einer Aufgabe von Grunkurs-Java nicht. Java Basics - Anfänger-Themen 11
P Verstehe Lösung einer Aufgabe von "Grundkurs-Java" nicht Java Basics - Anfänger-Themen 5
E Brauche eine Antwort zum Thema RegEx ( Alternative zur Lösung auch gesucht ) Java Basics - Anfänger-Themen 5
C Lösung für RegEx in Java gesucht Java Basics - Anfänger-Themen 2
S Eine rekursive Lösung Java Basics - Anfänger-Themen 4
G OOP [Eilig] Biete 10€ für Lösung von 2 Grundlagen-Aufgaben Java Basics - Anfänger-Themen 6
C For-Schleife wie kommt man auf die Lösung? Java Basics - Anfänger-Themen 2
M Erste Schritte boolean: ist Zahl Hexadezimal - Lösung verwirrend Java Basics - Anfänger-Themen 6
C Best Practice Was ist die elegantere Lösung bzgl. Klassenaufteilung in Robocode ? Java Basics - Anfänger-Themen 3
G Vererbung Lösung Standardproblem Java Basics - Anfänger-Themen 2
J Lösung eines Zahlenintervall wierd an der Falschen Stelle angezeigt. Java Basics - Anfänger-Themen 8
C Sortierverfahren - allgemeine Lösung? Java Basics - Anfänger-Themen 9
3 Bitte um Hilfe bei Lösung einer Aufgabe Java Basics - Anfänger-Themen 16
D speicherschonendere lösung? Java Basics - Anfänger-Themen 19
M Interval Teilmenge bestimmen - Fehler in meiner Lösung Java Basics - Anfänger-Themen 6
M Suche Korrektor für meine Lösung (FH: Java1 - Übungsklausur) Java Basics - Anfänger-Themen 4
F OOP Wieder mal Zugriffsprobleme... (Lösung am Ende) Java Basics - Anfänger-Themen 11
U JTable viele möglichkeiten, keine Lösung Java Basics - Anfänger-Themen 5
T Objektübergabe - saubere Lösung? Java Basics - Anfänger-Themen 3
U Rekursive lösung von pascal dreieck Java Basics - Anfänger-Themen 11
A brauche eine Lösung für Problem bei Moorhuhn-Version Java Basics - Anfänger-Themen 5
C Lösung einer Aufgabe mittels Iteration und Rekursion Java Basics - Anfänger-Themen 12
F Eingabe darf nur 1 oder 0 sein. Meine Lösung macht Probleme. Java Basics - Anfänger-Themen 8
C Frage zu try - catch (saubere Lösung?) Java Basics - Anfänger-Themen 3
D Benutzung von globalen Variablen einzigste Lösung? Java Basics - Anfänger-Themen 6
F Servlets, Formulare und ich weiß keine Lösung Java Basics - Anfänger-Themen 4
A Struktur -> Beste Lösung? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben