# System.out.println mit log4j ersetzen



## freez (8. Aug 2011)

Hallo,

gibt es eine Möglichkeit System.out.println umzuleiten um diese standardmäßig mit log.debug (log4j) zu verarbeiten?
Hintergrund ist folgender: Bis jetzt gibt es in einer bestehenden Anwendung nur System.out.println und diese möchte ich auf Konsole und Files im log4j Format umleiten (vielleicht auch mal ein anderes Ziel, was mit log4j möglich wäre)


----------



## mvitz (8. Aug 2011)

Nach > 400 Beiträgen, müsstest du eigentlich wissen, wie man nach sowas googled  Aber hier mal eine mögliche Lösung: System.out and System.err over log4j  /home/edivad

Ansonsten wäre es sicherlich eleganter (weiß ja nicht, von wieviel Klassen/aufrufen wir hier sprechen. Mit grep/sed bzw. search & replace das ganze direkt auf Log4j umzustellen und die System.out aufrufe zu entfernen.


----------



## Gast2 (8. Aug 2011)

Ich habe mir mal einen Appender für log4j geschrieben der die sysout und syserr aufrufe nach log4j umgeleitet und geloggt hat.
den code könnte ich dir heut abend mal posten wenn du magst.


----------



## freez (8. Aug 2011)

mvitz hat gesagt.:


> Nach > 400 Beiträgen, müsstest du eigentlich wissen, wie man nach sowas googled



Davon kannst du ausgehen. Du wirst lachen, aber auch wenn man Google bedienen kann, heißt das nicht, dass man fündig wird. Nach einer halben Stunde Suche habe ich aufgegeben und dachte, es gibt hier vielleicht nen Fachmann, der sich mit sowas auskennt. Es kann gut möglich sein, dass ich mich einfach nur zu dumm angestellt habe.

Aber nix für ungut: Danke für den Tipp, das sieht vielversprechend aus.


----------



## freez (8. Aug 2011)

EikeB hat gesagt.:


> Ich habe mir mal einen Appender für log4j geschrieben der die sysout und syserr aufrufe nach log4j umgeleitet und geloggt hat.
> den code könnte ich dir heut abend mal posten wenn du magst.



Danke, aber ich melde mich noch mal, sollte der Tipp von mvitz nicht den gewünschten Erfolg bringen. Dann musst du dir nicht die Arbeit machen. 

PS: Schaden würde es aber nicht eine Alternative zu haben ... vielleicht ist es ja für einen Besucher in Zukunft interessant


----------



## freez (8. Aug 2011)

mvitz hat gesagt.:


> Ansonsten wäre es sicherlich eleganter (weiß ja nicht, von wieviel Klassen/aufrufen wir hier sprechen. Mit grep/sed bzw. search & replace das ganze direkt auf Log4j umzustellen und die System.out aufrufe zu entfernen.



Wäre mir eigentlich auch lieber, aber es gibt nun mal Stellen, die man ungern anfasst und nur ändert, wenn es nicht anders geht.


----------



## mvitz (8. Aug 2011)

Ok, war ja auch nicht böse gemeint, hatte mich nur gewundert, dass du bei Google nichts gefunden hast, vermutlich irgendwie die falsche Kombination.

Ja hast recht, wobei ein Search/Replace auf System.out.println mit LOGGER.debug und anschließend in Eclipse in jeder Klasse die einen Fehler hat ein einfügen von (mit einem Eclipse Template gehts noch schneller)

private static final Logger LOGGER = Logger.getLogger(MyClass.class);

ist jetzt nichts, was Logik ändert


----------



## freez (8. Aug 2011)

mvitz hat gesagt.:


> ist jetzt nichts, was Logik ändert



Richtig! Das wäre ja mein bevorzugter Weg. Nur sobald dieselbe jar an unterschiedlichen Stellen mit unterschiedlichen Abhängigkeiten und mit unterschiedlichen Java Versionen laufen soll, und man nicht alle Konstellationen testen kann, sollte man ziemlich vorsichtig sein mit einem globalen Replace. Deswegen würde ich lieber für bestimmte Einsätze der Jar den Stream auf log4j umleiten. Von der Sache her geht es mir eigentlich nur darum den Stream aufs Filesystem zu lenken (wäre sogar am einfachsten mit '>'). Nur da ich eh schon mit log4j arbeite, wäre es mir lieb, den output in den selben Files zu finden, wie die log4j Ausgaben.


----------



## mvitz (8. Aug 2011)

Ah, das erklärt einiges.

Naja, dann viel Glück und könntest ja hier nochmal Bescheid geben, wenn die von mir verlinkte Lösung funktioniert hat.


----------



## Gast2 (8. Aug 2011)

Falls es noch interessiert, so habe ich das damals gemacht:


```
if (redirectConsole) {
              System.setErr(new LoggerPrintStream());
              System.setOut(new LoggerPrintStream());
        }
```


```
public class LoggerPrintStream extends PrintStream {

    public LoggerPrintStream() {
        super(new LoggerOutputStream());
    }
}
```


```
public class LoggerOutputStream extends OutputStream {

    private StringBuilder buffer;

    private static Logger logger = Logger.getRootLogger();

    public LoggerOutputStream() {
        buffer = new StringBuilder();
    }

    public void write(final int b) {
        char c = (char)b;
        if (c == '\n') {
            logger.error(buffer.toString());
            buffer.delete(0, buffer.length());
        } else {
            buffer.append(c);
        }
    }
}
```


----------



## freez (9. Aug 2011)

mvitz hat gesagt.:


> Naja, dann viel Glück und könntest ja hier nochmal Bescheid geben, wenn die von mir verlinkte Lösung funktioniert hat.



Ja, funktioniert hervorragend.

@EikeB: Danke. Werde es auch mal testen.


----------

