# log4j



## PollerJava (16. Nov 2007)

Hallo,

ich wollte jetzt das Beispiel von der Seite http://www.torsten-horn.de/techdocs/java-log4j.htm ausprobieren,, habe log4j.jar eingebunden, aber es wird der Logger nicht gefunden,

Weiß jemand wieso?

lg



```
package meinpackage;

import org.apache.log4j.Logger;   // Logger wird nicht gefunden

public class MeineKlasse1
{
  private static Logger logger = Logger.getLogger( MeineKlasse1.class );

  MeineKlasse1()
  {
    logger.info(  "Meine Info-Meldung aus MeineKlasse1."  );
    logger.error( "Meine Error-Meldung aus MeineKlasse1." );
  }
}
```


----------



## lhein (16. Nov 2007)

Hast Du das Tutorial gelesen und verstanden oder einfach nur die JAR eingebunden und 2-3 Zeilen übernommen?

Mein Vorschlag: Lies das Tutorial nochmal. Wenn das nicht hilft, dann geh auf die Log4J Seite und schau Dir die Dokus da an.

lr


----------



## PollerJava (16. Nov 2007)

OK, falsche jar,

jetzt bekomme ich folgenden Fehler:


```
Exception in thread "main" java.lang.NoSuchFieldError: level
        at org.apache.log4j.spi.RootLogger.setLevel(RootLogger.java:66)
        at org.apache.log4j.spi.RootLogger.<init>(RootLogger.java:45)
        at org.apache.log4j.LogManager.<clinit>(LogManager.java:80)
        at org.apache.log4j.Logger.getLogger(Logger.java:118)
        at meinpackage.MeineKlasse1.<clinit>(MeineKlasse1.java:7)
        at meinpackage.Main.main(Main.java:10)
Java Result: 1
```

Was mache ich da falsch??


----------



## PollerJava (16. Nov 2007)

Weiß jemand, wieso mein Logger kein setLevel hat:


```
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.FileAppender;

public class simpandfile {
   static Logger logger = Logger.getLogger(simpandfile.class);
   public static void main(String args[]) {
      SimpleLayout layout = new SimpleLayout();

      FileAppender appender = null;
      try {
         appender = new FileAppender(layout,"output1.txt",false);
      } catch(Exception e) {}

      logger.addAppender(appender);
      logger.setLevel((Level) Level.DEBUG);         // setLevel gibts gar nicht in der Klasse Logger?????

      logger.debug("Here is some DEBUG");
      logger.info("Here is some INFO");
      logger.warn("Here is some WARN");
      logger.error("Here is some ERROR");
      logger.fatal("Here is some FATAL");
   }
}
```


----------



## PollerJava (16. Nov 2007)

gibts eine andere Möglichkeit auch noch ausser log4j,
bekomms leider nicht hin, keine Ahnung, was da schief läuft,

lg


----------



## HoaX (16. Nov 2007)

evlt alte version von log4j? wieso überhaupt der cast auf level?

btw ist es leichter, einfacher, schöner log4j mittels properties- oder xml-datei zu konfigurieren anstatt im code


----------



## PollerJava (16. Nov 2007)

Ich habeum die 60 Klassen,

wie ist es am besten, für jedes Package einen Logger, für jede Klasse oder einen Logger für alle Klassen?

lg


----------



## Tobias (17. Nov 2007)

Für jede Klasse ein Logger. Du kannst die Logger auch gruppiert ansprechen, so dass du mit dieser Politik die größtmögliche "Auflösung" erreichst.

mpG
Tobias


----------



## PollerJava (17. Nov 2007)

Wie funktioniert das mit dem Gruppieren und sollen alle Logger in eine Datei schreiben oder jeder Logger eine eigene Datei haben und wie kann ich es machen, dass nicht ein Logger die Einträge eines anderen Loggers überschreibt, oder passiert das eh nicht (Hab keine Erfahrung mit Logger),

Vielen Dank und schönes We,


----------



## PollerJava (19. Nov 2007)

Hallo nochmal zu diesem Thema,

ich habe den unteren Code zum loggen meiner Fehler (z.B.: in der unteren Klasse Control), wenn ich das Programm aber neu starte, dann wird die XML- Datei aber jedes mal überschrieben,

Weiß jemand wie ich das verhindern kann,

lg und vielen Dank






```
public Control(String xmlDateiPfad) 
        {	
        try {
            file_handler = new FileHandler("log/Package_pack_Log.xml");
            xmllogging = new XMLFormatter();
            file_handler.setFormatter(xmllogging);
            loggerControl.addHandler(file_handler);
            loggerControl.setLevel(Level.ALL);
            loggerControl.entering("KlasseIrgendeine","anderer Text");
            } 
        catch (SecurityException ex) 
            {
            ex.printStackTrace();
            } 
        catch (IOException ex) 
            {
            ex.printStackTrace();
            }
```


----------



## tfa (19. Nov 2007)

Nimm einen Appender, z.B. den DailyRollingFileAppender. 
Und konfiguriere log4j mit einer XML-Datei und nicht im Code (Beispiel), das ist einfacher.


----------



## PollerJava (19. Nov 2007)

gibts irgendwo einen JavaCode auch dafür wie ich das machen kann bzw. wie könnte ich in meinem Code oben den Appender benutzen, damit die neuen Meldungen nur angehängt werden?

Vielen Dank


----------



## PollerJava (19. Nov 2007)

Bei mir geht einfach das Programm unten nicht, es gibt keine Methode setLevel(..) in der Klasse Logger,
Ich habe das jar- File log4j-1.2.15.jar,

Weiß da jemand noch einen Rat???
lg



```
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.FileAppender;

public class simpandfile {
   static Logger logger = Logger.getLogger(simpandfile.class);
   public static void main(String args[]) {
      SimpleLayout layout = new SimpleLayout();

      FileAppender appender = null;
      try {
         appender = new FileAppender(layout,"output1.txt",false);
      } catch(Exception e) {}

      logger.addAppender(appender);
      logger.setLevel((Level) Level.DEBUG);         // setLevel gibts gar nicht in der Klasse Logger?????

      logger.debug("Here is some DEBUG");
      logger.info("Here is some INFO");
      logger.warn("Here is some WARN");
      logger.error("Here is some ERROR");
      logger.fatal("Here is some FATAL");
   }
}
```


----------



## HLX (19. Nov 2007)

Natürlich gibt es setLevel(..) - steht in der Superklasse vom Logger: org.apache.log4j.Category

Warum musst du den Parameter in 'setLevel' casten?


----------



## PollerJava (19. Nov 2007)

ich hab das Beispiel 1:1 von hier  http://www.torsten-horn.de/techdocs/java-log4j.htm kopiert, warum gibt es dann die Methode setLevel() bei mir nicht??

Was mache ich da falsch??

Vielen Dank,


----------



## HLX (19. Nov 2007)

Zeig mal die genaue Fehlermeldung.


----------



## PollerJava (19. Nov 2007)

```
java.lang.NoSuchFieldError: level
        at org.apache.log4j.spi.RootLogger.setLevel(RootLogger.java:66)
        at org.apache.log4j.spi.RootLogger.<init>(RootLogger.java:45)
        at org.apache.log4j.LogManager.<clinit>(LogManager.java:80)
        at org.apache.log4j.Logger.getRootLogger(Logger.java:136)
        at meinpackage.Main.<clinit>(Main.java:7)
Exception in thread "main" 
Java Result: 1
```

wenn ich setLEvel aukommentiere, dann bekomme ich die Fehlermeldung oben, sonst bekomme ich eben den Fehler, dass es die MEthode nicht kennt,





```
symbol  : method setLevel(org.apache.log4j.Level)
location: class org.apache.log4j.Logger
      logger.setLevel(Level.ALL);
1 error
```

lg


----------



## HLX (19. Nov 2007)

Hmpf...ich hab mir gerade das Beispiel angesehen und festgestellt das du es NICHT 1:1 übernommen hast. Warum steht die setLevel-Methode nicht im try-Block?

Und jetzt wirds ganz wichtig:  :meld: 
Lass dir, wie im Beispiel, *IMMER* etwas ausgeben, wenn du eine Exception abfängst - am besten den Stacktrace. Sonst erfährst du es nie, wenn da was passiert.


----------



## PollerJava (19. Nov 2007)

Ja ja, das mach ich eh immer,
ich hab nur ein bischen rumprobiert, aber es ist 1:1 auch nicht gegangen da ja die Methode setLevel() nicht existiert,

Ist es bei dir gegangen, ich vermute mal auch nicht,, da hat scih vielleicht was getan beim Package von .9 auf .15??


----------



## HLX (19. Nov 2007)

PollerJava hat gesagt.:
			
		

> Ja ja, das mach ich eh immer



Und was ist das???

```
} catch(Exception e) {}
```

So steht es oben in deinem Code.

Zwischen den zwei "Unterversionen" hat sich bestimmt nichts getan. Falls eine Methode bei einer neuen Version (z.B. 1.3.) nicht mehr angewendet werden soll, wird sie auf deprecated gesetzt. Daher existiert die Methode definitiv. Der Fehler liegt woanders.


----------



## PollerJava (19. Nov 2007)

gehts bei dir?


----------



## HLX (19. Nov 2007)

Ich habe mir nicht die Mühe gemacht das auszuprobieren. Ein Blick in die API und in den Quellcode zeigen das die Methode existiert. Setze das Beispiel bitte 1:1 um.


----------

