log4j

max5432

Aktives Mitglied
Hallo allerseits

In meiner log4j.properties Datei habe ich folgendes angegeben:

Java:
log4j.appender.FileAPP.layout.ConversionPattern = [%d / %p]\t(%F\:%L) - %m%n

Wenn ich eine Ausnahme protokolliere, bekomme ich immer die Nummer der Codezeile, die den Eintrag in die log-Datei geschreiben hat: dies ist die Zeile

Java:
logger.error(e.getMessage());

im entsprechenden catch-Block.

Ist es möglich, die Codezeile direkt anzugeben, die zur Ausnahme geführt hat? Wie sehe so ein Pattern aus?

Danke.
 

max5432

Aktives Mitglied
Danke.

Nun, klappt nicht ganz. Zusätzlich bekomme ich die genaue Angabe der Ausnahme: die Nummer der Codezeile, die zur Ausnahme geführt hat, wird nicht angegeben. Weiterhin wird die Nummer der Codezeile angegeben, in der logger.error(e) steht.


Die genaue Angabe des Ausnahme-Typs hilft sicher, die "schuldige" Codezeile zu finden: jedoch wäre schön, wenn die Codezeile-Nummer explizit angegeben werden könnte.
 
M

maki

Gast
Denke dass du F und L falsch verstanden hast, letzteres auf jedenfall.

Die Zeile in der die Exception geworfen wurde bekommst du nur aus dem Stacktrace, L gibt dir nur die Zeile in der die Exception geloggt wurde.
F sollte komplett überflüssig sein, wenn man den Loggern sinnvolle Namen gibt, so wie in der DOku gezeigt:
Java:
 import com.foo.Bar;

 // Import log4j classes.
 import org.apache.log4j.Logger;
 import org.apache.log4j.BasicConfigurator;

 public class MyApp {

   // Define a static logger variable so that it references the
   // Logger instance named "MyApp".
   static Logger logger = Logger.getLogger(MyApp.class);
...
Es wird ja sowohl von F und L abgeraten in der Log4J Doku.
 

max5432

Aktives Mitglied
Wenn ich F und L weglasse, habe ich "von Haus aus" noch weniger Informationen.

Das heisst, dass ich vor dem Loggen an sich Stack-Trace verarbeiten bzw. einzelne Einträge extrachieren und in die Log-Datei passend schreiben muss? Oder, bin ich auf dem Holzweg?
 
M

maki

Gast
Du bist auf dem Holzweg imho, vielleciht machst du vorher schon was falsch, L & F braucht man nicht, und wenn doch, macht man was falsch ;)

Zeig mal den Code wie du die Logger initialisierst.
 

max5432

Aktives Mitglied
Hier ist der Code:

Java:
public class DataManager{

static Logger logger = Logger.getLogger(DataManager.class.getName());

// ... 

}

Die log4j.properties:

Java:
### Ausgabe in die Datei 'data.log'

# LogRoot-Kategorie
log4j.rootCategory=INFO,FileAPP

# log-file parameter
log4j.appender.FileAPP = org.apache.log4j.RollingFileAppender
log4j.appender.FileAPP.File = data.log
log4j.appender.FileAPP.MaxFileSize = 1000KB
log4j.appender.FileAPP.MaxBackupIndex = 1
log4j.appender.FileAPP.Append = true

# Layout definieren
log4j.appender.FileAPP.layout = org.apache.log4j.PatternLayout

#log4j.appender.FileAPP.layout.ConversionPattern = [%d / %p]\t(%F\:%L) - %m%n
log4j.appender.FileAPP.layout.ConversionPattern = [%d / %p]\t - %m%n

Ich habe inzwischen eine Methode implementiert, die mir StackTrace aufbereitet:

Java:
public static String getStackTraceAsString(Exception e) {
        StringBuffer b = new StringBuffer();

        StackTraceElement[] arr = e.getStackTrace();

        for (StackTraceElement ste : arr)
        {
            b.append(ste.getClassName() + " - " + ste.getMethodName()
                    + " - Line Nr. " + ste.getLineNumber() + "\n");
        }

        return b.toString();
    }

Da habe ich schon viel mehr Infos und finde auch die Codezeile-Nummer, die Probleme verursacht hat. Trotzdem würde mich interessieren, ob man das einfacher und besser machen kann.
 
M

maki

Gast
...Trotzdem würde mich interessieren, ob man das einfacher und besser machen kann.
Siehe meine erste antwort ;)
Dann noch das Pattern aus der Doku, das war's.

Du solltest den Stacktrace loggen, nicht nur die Message.

Den Aufwand den du treibst macht es nur komplizierter und viel langsamer, aber vor allem könnten dir wichtige Infos verloren gehen.
 

mvitz

Top Contributor
Einfach den Stacktrace loggen. Dort steht ja die Zeile in der Fehler geworfen wurde. (Evtl. muss dann mit der debug Option von Java kompilieren).
 

HoaX

Top Contributor
Nimm logger.error(e.getMessage(), e);

bei nur logger.error(e) wird nur toString von e aufgerufen, du bekommst keinen Stacktrace!
 
M

maki

Gast
Nimm logger.error(e.getMessage(), e);

bei nur logger.error(e) wird nur toString von e aufgerufen, du bekommst keinen Stacktrace!
Hab gerade nachgelesen wie das funzt, keine der Logger Methoden (error, debug, etc.) erwartet eine Exception bei einem einzelnen Parameter.
Also wäre alternativ auch das möglich:
Java:
logger.error("Meldung deiner Wahl", e);
Dann klappt es auch mit dem Stacktrace.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K log4j nach log4j2 überführen Java Basics - Anfänger-Themen 0
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
MiMa log4j als separate Dateien in Schleife? Java Basics - Anfänger-Themen 6
L Erste Schritte Log4J Fragen Java Basics - Anfänger-Themen 5
B Log4J Pfad des Logfiles definieren Java Basics - Anfänger-Themen 6
Tom299 Log4j in jeder Klasse definieren? Java Basics - Anfänger-Themen 12
O Wie Log4J - Ausgaben/Events auffangen?! Java Basics - Anfänger-Themen 3
S log4j in externer Library Java Basics - Anfänger-Themen 4
M xml log4j überschreiben für/in Java Klassen Java Basics - Anfänger-Themen 4
N wie *.class-Dateien mit log4j loggen? Java Basics - Anfänger-Themen 9
F Log4j - log4j:WARN No appenders could be found for logger Java Basics - Anfänger-Themen 1
0 Log4J Probleme beim einlesen der Log datei Java Basics - Anfänger-Themen 2
0 Log4J Instanz erzeugen Java Basics - Anfänger-Themen 2
M Input/Output log4j mit properties datei Java Basics - Anfänger-Themen 6
T LOG4J Konfiguration Java Basics - Anfänger-Themen 5
W log4j "installieren" Java Basics - Anfänger-Themen 10
F ThreadId in Log4j Java Basics - Anfänger-Themen 4
H Log4J und Angabe eines Ordners Java Basics - Anfänger-Themen 5
A log4j - wie kann ich im Quellcode initialisieren statt in der properties-Datei? Java Basics - Anfänger-Themen 2
A log4j - Warum wird Methode getHeader 2x ausgeführt? Java Basics - Anfänger-Themen 2
S log4j pfad per umgebungsvariable setzen? Java Basics - Anfänger-Themen 2
G Probleme mit log4j Java Basics - Anfänger-Themen 2
M log4j design Java Basics - Anfänger-Themen 11
G log4j Java Basics - Anfänger-Themen 4
S LineNumberReader - bessere Lösung möglich? - Log4J Java Basics - Anfänger-Themen 9
G Kompletten Stacktrace mit Log4j ausgeben Java Basics - Anfänger-Themen 3
M logging mit log4j Java Basics - Anfänger-Themen 4
M log4j frage zu whitespaces Java Basics - Anfänger-Themen 2
G log4j Java Basics - Anfänger-Themen 3
H Log4J Pfad setzen Java Basics - Anfänger-Themen 2
M log4j Unterverzeichnis mit Datum , Timestamp in LogDateiname Java Basics - Anfänger-Themen 2
G Log4j? Java Basics - Anfänger-Themen 15
G Log4j notwendig oder nicht? Java Basics - Anfänger-Themen 16
J Log4j + Junit Java Basics - Anfänger-Themen 4
M log4j XML Konfigurationsdatei Java Basics - Anfänger-Themen 2
M "System.out" "System.err" bzw. log4j Java Basics - Anfänger-Themen 9
K log4j Java Basics - Anfänger-Themen 2
R log4j - Datum an Logdatei anhängen möglich? Java Basics - Anfänger-Themen 7
S log4j "Richtiges" Design Java Basics - Anfänger-Themen 4
B Log4J Anfänger sucht hilfe! Java Basics - Anfänger-Themen 4
N Log4J Problem Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben