# Frage zum Einsatz eines loggers



## Millman (18. Jul 2010)

Hallo zusammen,

ich möchte gerne einen logger in meiner Webapplikation einsetzen.

Sehe ich es richtig, dass ich in jeder meiner Klassen einen neuen Logger erzeugen und instanziieren muss?
Nach dem Schema:


```
public class LoggingA {
static Logger logger;
Handler file_handler;
Formatter klartext;
// ------------- Konstruktor für Klasse LoggingA ----------------
public LoggingA() throws IOException {
// Logger erzeugen
logger = Logger.getLogger("LoggingA");
// File Handler erzeugen
file_handler = new FileHandler("LoggingA.txt");
// Formatter erzeugen
klartext = new SimpleFormatter();
file_handler.setFormatter(klartext);
logger.addHandler(file_handler);
}
```


----------



## Marco13 (18. Jul 2010)

Man kann theoretisch auch nur einen globalen Logger verwenden, aber dann gehen viele Vorteile des eigentlichen Loggings verloren. Üblich ist schon eine Logger-Instanz pro Klasse, allerdings sollte man das Erzeugen des Loggers IMHO nicht in den Konstruktor schreiben, sondern vielleicht eher in eine statische Utility-Methode (wenn's aufwändiger ist).


----------



## Siassei (18. Jul 2010)

Böses Faul. Analysiere deinen Code ein mal. Du erzeugst bei jeder Instanz deiner Klasse einen neuen Logger und weist diesem einer static-Variablen zu!

In Java geht man im allg. so vor, wie Marco das bereits geschieldert hat. Benutzt du Log4J oder eine andere Bibliothek? Evtl. die mit gelieferte Logging-API?

In einer Config-Datei steuerst du normalerweiße, wie die einzelne Logger behandelt werden. Bei Log4J ist das z.B. eine XML oder Property Datei. In dieser kann man z.B. festlegen, dass alle Logger des Paket foo.bar.* in die Datei log1exapmple.log ausgegeben werden. Zudem lassen sich Informationen wie, Timestamp, Thread-Name, .... steuern.
Aber das sollte nicht in deinem Code passieren.


```
public class LoggingExample1 {

  private static final Logger log = Logger.getLogger(LoggingExample1.class);
}

// Oder, falls aufwändiger
public class LoggingExample2 {

  private static Logger log;

  // Wird spätestens beim ersten Zugriff auf die Klasse aufgerufen.
  // --> vor new oder LoggingExample2.staticMethod...()
  static {
    Config cg = Config.load(.....);
    cg.configure;
    log = Logger.getLogger(LoggingExample2);
    log.setXYZ(.....)
  }
}
```


----------

