# Log4j: Ausgabe in Datei



## Gustaf (1. Sep 2004)

Hallo, hab ein Problem mit dem Loggen mit log4j. Habe den Beispielcode benutzt, der mitgegeben wird:
	
	
	
	





```
package Logger;


import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;

public class Hello {
    
  static Logger logger = Logger.getLogger(Hello.class);
    
  public static void main(String argv[]) {
	BasicConfigurator.configure();
	logger.debug("Hello world.");
	logger.info("What a beatiful day.");
  }
}
```
Klappt auch wunderbar. Nun möchte ich es jedoch in einer Datei ausgegeben bekommen, und komme auch mit googlen usw. nicht wirklich weiter. 
Danke für alle Hilfen.
Gustaf


----------



## P3AC3MAK3R (1. Sep 2004)

Hier gibt es auch noch ein Codebeispiel:


```
import org.apache.log4j.*;

public class SampleLog {

  static Category iAll     = Category.getInstance("SampleLog");
  static Category iMethods = Category.getInstance("SampleLog.methods");

  public SampleLog() {
    iMethods.debug("Entering SampleLog constructor");
  }

  public void a() {
    iMethods.debug("Entering SampleLog.a()");
  }
  public void b() {
    iMethods.debug("Entering SampleLog.b()");
  }
  public void c() {
    iMethods.debug("Entering SampleLog.c()");
  }

  public static void main(String[] args) {
    PropertyConfigurator.configure  ("samplelog.properties");
    iAll.info("Creating SampleLog object ...");
    SampleLog sl = new SampleLog();
    iAll.info("... done");
    iAll.info("Executing methods ...");
    sl.a();
    sl.b();
    sl.c();
    iAll.info("... done");
  }
}
```

Für die Konfiguration wird dabei folgende Konfigurationsdatei verwendet:


```
log4j.category.SampleLog=INFO, slAppender

log4j.appender.slAppender=  org.apache.log4j.ConsoleAppender
log4j.appender.slAppender.layout=  org.apache.log4j.PatternLayout
log4j.appender.slAppender.layout.  ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

log4j.category.SampleLog.methods=DEBUG, methodAppender

<.999>log4j.appender.methodAppender=  <.999>org.apache.log4j.net.SocketAppender
log4j.appender.methodAppender.RemoteHost=  localhost
log4j.appender.methodAppender.Port=4445
```

Ich arbeite mich auch gerade erst in Log4j ein, aber ich vermute, daß es ausreicht, statt einem "ConsoleAppender" einen "FileAppender" zu verwenden.


----------



## P3AC3MAK3R (1. Sep 2004)

Verschoben: IDEs und Tools


----------



## meez (1. Sep 2004)

Geht auch einfacher:



```
package Logger;


import org.apache.log4j.*;


public class Hello {
   
  static Logger logger = Logger.getLogger(Hello.class);
   
  public static void main(String argv[]) {
   String datei = ...
   String logpattern = "%d{MM.dd.yyyy\tHH:mm:ss}\t%p\t%m %n";
   logger.addAppender(new FileAppender(new PatternLayout(logpattern), datei, true));
   logger.debug("Hello world.");
   logger.info("What a beatiful day.");
  }
}
```

Das Pattern musst du halt anpassen...


----------



## P3AC3MAK3R (1. Sep 2004)

Ich habe es jetzt so gelöst:


```
package loggingtest;

import java.io.IOException;

import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public class LoggingTest {

    static Logger logger = Logger.getRootLogger();

    static String filename = "C:\\Test.log";

    static String pattern = "%d{MM.dd.yyyy\tHH:mm:ss}\t%p\t%m %n";

    public static void main(String[] args) {

        // fileAppender erzeugen
        Appender fileAppender = null;
        try {
            fileAppender = new FileAppender(new PatternLayout(pattern),
                    filename, true);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(0);
        }

        // den fileAppender dem logger zuordnen
        logger.addAppender(fileAppender);

        // Logging-Level setzen
        logger.setLevel(Level.DEBUG);

        logger.debug("Methode main gestartet");

        method1();
        method2();
        method3();

        logger.debug("Methode main beendet");
    }

    private static void method1() {
        logger.debug("Methode method1 gestartet");
        logger.debug("Methode method1 beendet");
    }

    private static void method2() {
        logger.debug("Methode method2 gestartet");
        logger.debug("Methode method2 beendet");
    }

    private static void method3() {
        logger.debug("Methode method3 gestartet");
        logger.debug("Methode method3 beendet");
    }
}
```

Feuer frei!


----------



## Gustaf (2. Sep 2004)

Hab jetzt das untersten Beispiel von Peaemaker versucht, da ich es am übersichtlichsten halte und den Code gut verstehen kann. Leider wird die log Datei bei mir nicht erzeugt. Muss in diesem Beispiel die Konfigurationsdatei auch verwendet werden, und wenn ja wie und wohin kommt diese ?
Fragen über Fragen, Danke fürdie Antworten...


----------



## P3AC3MAK3R (2. Sep 2004)

Das Beispiel von oben kommt eigentlich ohne Konfigurationsdatei aus.

Ich habe das Beispiel nochmal so umgestrickt, daß es eine Konfigurationsdatei verwendet:


```
package loggingtest;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LoggingTest {

    static Logger logger = Logger.getRootLogger();

    public static void main(String[] args) {

        // Log4j-Konfiguration laden
        PropertyConfigurator.configure("log4j.properties");

        logger.debug("Methode main gestartet");

        logger.debug("DEBUG-Meldung");
        logger.info("INFO-Meldung");
        logger.warn("WARN-Meldung");
        logger.error("ERROR-Meldung");
        logger.fatal("FATAL-Meldung");

        method1();
        method2();
        method3();

        logger.debug("Methode main beendet");
    }

    private static void method1() {
        logger.debug("Methode method1 gestartet");
        logger.debug("Methode method1 beendet");
    }

    private static void method2() {
        logger.debug("Methode method2 gestartet");
        logger.debug("Methode method2 beendet");
    }

    private static void method3() {
        logger.debug("Methode method3 gestartet");
        logger.debug("Methode method3 beendet");
    }
}
```

Die Konfigurationsdatei "log4j.properties" sieht wie folgt aus:


```
# dem rootLogger den Appender A1 zuordnen
log4j.rootLogger=, A1

# Appender A1 konfigurieren
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.append=false
log4j.appender.A1.file=C:\\Test.log

# Layout des Appenders A1 konfigurieren
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss,SSS}\t%c\t%p\t%m%n
```


----------



## Gast (2. Sep 2004)

Hatt sich erledigt..klappt bestens , danke. Steht jedoch ne ganze Menge in der Logdatei drinne.  Dachte dort werden nur die selbst definierten debugs reingeschrieben z.B. 
logger.debug("Methode main gestartet"); 
ist jedoch wesentlich mehr. Danke für die Hilfe
Gustaf


----------



## P3AC3MAK3R (2. Sep 2004)

Verstehe ich Dich richtig, daß Deine Logdatei nur die Debug-Meldungen selbst (also z. B. "Methode main gestartet") enthalten soll?

In dem Fall mußt Du einfach die ConversionPattern anpassen.

Vorher:


```
log4j.appender.A1.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss,SSS}\t%c\t%p\t%m%n
```

Nachher:


```
log4j.appender.A1.layout.ConversionPattern=%m%n
```


----------



## P3AC3MAK3R (2. Sep 2004)

Wie man die ConversionPatterns zu verstehen hat, steht übrigens auch in der API-Dokumentation:

http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html


----------



## Gustaf (2. Sep 2004)

Danke Meister, wir huldigen dir


----------



## P3AC3MAK3R (2. Sep 2004)

Ich glaube, der Spruch, den ich in einem Dokument zu Log4j gelesen habe, stimmt echt. Da stand nämlich etwas davon, daß die Verwendung dieses Tools süchtig machen kann.


----------



## Gustaf (2. Sep 2004)

Hmmm...wo muss die log4j.properties genau hin ?


----------



## P3AC3MAK3R (2. Sep 2004)

Ich arbeite mit Eclipse und habe sie dabei im Projektverzeichnis (auf Root-Ebene) abgelegt.

Alternativ dazu kann man aber auch einfach den vollen Pfad zu der Datei angeben.


----------

