# Kann man System.out in eine Datei speichern? ähnlich wie log



## kage0002 (1. Aug 2007)

Hallo!

Ich würde gerne wissen ob es in Java eine Möglichkeit gibt den Output den man zum Beispiel mit dem Befehl System.out.println("Hallo Java"); in einer Datei speichern kann! 
Ich würde gerne beim starten meine Jar-Datei die Konsolenausgabe angucken.

Danke!


lg Katie


----------



## The_S (1. Aug 2007)

Ja, du kannst einfach den OutputStream (System.out) umleiten. Aber wenn du die sysouts eines Jars ansehen möchtest, dann starte das Jar doch einfach via


```
java -jar DeinJar.jar
```

über die Konsole!


----------



## Rock Lobster (1. Aug 2007)

Oder Du baust Dir kurz 'ne statische Logger-Klasse, mit einer log(String)-Funktion, die den String einfach direkt auf der Console ausgibt UND in eine Datei speichert. Dann kannst Du das auch immer wieder ein- und ausschalten, je nachdem, wie Du willst. Kannst das natürlich dann auch über Parameter lösen.


----------



## kage0002 (1. Aug 2007)

Hi!

Das Umleiten und  der Code _java -jar DeinJar.jar _ hat super geklappt! 
Danke für den Tip!

lg Katie


----------



## kage0002 (1. Aug 2007)

Hi Rock Lobster!

Hast du da ein Beispielcode wie man so eine Logger-Klasse schreibt?
Danke!

lg Katie


----------



## Rock Lobster (1. Aug 2007)

Naja im einfachsten Fall sowas:


```
public class Logger
{
   private static FileOutputStream file = null;

   public static void log(String str)
   {
      System.out.println(str);

      if (file != null)
         file.write(str.getBytes());
   }

   public static void log(Object o)
   {
      log(o.toString());
   }

   public static void setFileOutput(FileOutputStream f)
   {
      file = f;
   }
}
```

Das ist jetzt ungetestet, müßte aber funzen. Im Prinzip kannst Du auch den FileOutputStream direkt initialisieren, ohne ihn erst zu übergeben (also daß er beim ersten Log-Versuch einfach einen öffnen in 'nem bestimmten Verzeichnis oder sowas).

Der Vorteil ist, daß Du von nun an immer das hier benutzt:

```
Logger.log("Gib das hier mal aus...");
```

Somit hast Du eine einzige zentrale Log-Funktion. Diese kannst Du immer beliebig anpassen, z.B. kannst Du später auch Netzwerk-Funktionalitäten hinzufügen, sodaß Dein Logger über einen Socket die Ausgaben an einen anderen Rechner schickt und Du z.B. mit einem Laptop die Log-Ausgaben mitverfolgen kannst. Der Phantasie sind keine Grenzen gesetzt 

Es sei aber auch erwähnt, daß es berreits *fertige Logger* gibt, die oftmals sehr viele coole Sachen bieten. Zum Beispiel verschiedene Loglevel (Info, Warning, Error, usw), und Du kannst dann jederzeit einstellen, welche Levels Dich z.B. überhaupt nicht interessieren, und das wird dann auch nicht mehr ausgegeben. Natürlich ist es auch kein Problem, sich sowas selbst zu basteln (am besten zusätzlich zur log()-Funktion einfach eine info()-, error()-Funktion usw. bauen). Aber falls Du dazu keine Lust hast, dann sieh Dich mal nach fertigen Loggern um


----------



## thE_29 (1. Aug 2007)

Hier hast du sogar einen der drucken kann 

http://www.java-forum.org/de/viewtopic.php?t=24002&highlight=stdout


----------



## Rock Lobster (1. Aug 2007)

Ach ja... ein weiterer Vorteil ist auch, daß Du die Ausgaben formatieren kannst. Beispielsweise kannst Du durch Deine eigene Log-Funktion bestimmen, wie viele \n angefügt werden sollen, oder daß immer vorne der Name der aufrufenden Klasse dransteht, z.B. so:


```
public static void log(String str, Object invoker)
{
   str = invoker.getClass().getName() + ">    " + str + "\n";
   System.out.println(str);

   // und noch der file-output eben...
}
```

Du siehst, Du hast eine Fülle an Möglichkeiten, und mußt es immer nur an einer einzigen Stelle ändern, weil jede Ausgabe nur noch über Deine Logger-Klasse erfolgen.


----------

