2017-02-20 1 views
0

in meinem Code deaktivieren:java log4j 2 System.out.printin

System.out.println("hello println"); 
mylogger.info("hello info"); 
mylogger.debug("hello debug"); 

Ich möchte nur von Logger log in meiner Konsole (kein Druck "Hallo println" über System.out.println):

hallo info

hallo debug

Meine log4j-Datei ist:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 

    <appender name="consoleInfo" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}]: %m%n" /> 
     </layout> 
    </appender> 

    <category name="org.openqa.selenium"> 
     <priority value="off" /> 
    </category> 
    <category name="org.apache.log4j"> 
     <priority value="off" /> 
    </category> 

    <root> 
     <level value="INFO" /> 
     <appender-ref ref="consoleInfo" /> 
    </root> 

</log4j:configuration> 
+3

Am einfachsten ist es, '' System.out.println'' nicht aufzurufen. Sie können Aufrufe von '' System.out'' mit Ihrer log4j-Konfiguration nicht unterdrücken. – f1sh

+0

Möchten Sie 'System.out' umleiten oder ausschalten? Sie sollten sich wahrscheinlich in beiden Fällen https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#setOut-java.io.PrintStream ansehen. – Henrik

+0

Ja, ich möchte alle 'System.out.println' ausschalten. – sgrillon

Antwort

0

Sie können „ausschalten“ System.out indem sie sie mit einem Schriftsteller zu ersetzen, die alle Eingaben einfach ignoriert:

System.out.println("This is written."); 

System.setOut(new PrintStream(new OutputStream() { 
    @Override 
    public void write(int b) throws IOException {} 
})); 

System.out.println("Not written!"); 

Wenn Sie Guava auf dem Classpath haben sollte, kann es zu

verkürzt werden
System.setOut(new PrintStream(ByteStreams.nullOutputStream())); 
+0

Ich denke, Sie können das Konsolenprotokoll nicht mit log4j sehen. –

+0

@grape_mao: Nun, Sie können immer tun, wie in meiner Antwort beschrieben, aber ersetzen Sie die 'PrintStream' mit etwas, das in ein' log' Objekt schreibt. Ob es ein guter Ansatz ist, ist eine andere Sache. :) – Henrik

+0

Wird ein Protokollobjekt Ergebnis in endlosen rekursiven Aufruf aufrufen? –

0

Sie können Ihr System outs zu einem appender umleiten, indem wie unten in einen appender die out-Parameter des Systems zeigt:

public abstract class TraceStream extends PrintStream 
{ 
    private static final Logger trace = LogManager.getLogger(TraceStream.class); 
    public TraceStream(OutputStream stream) { 
    super(stream); 
    } 

    protected abstract void trace(String line); 


    public void print(boolean b) { 
    TRACE.info(String.valueOf(b)); 
    } 


    public void print(char c) { 
    trace(String.valueOf(c)); 
    } 


    public void print(char[] s) { 
    trace(String.valueOf(s)); 
    } 


    public void print(double d) { 
    trace(String.valueOf(d)); 
    } 


    public void print(float f) { 
    trace(String.valueOf(f)); 
    } 


    public void print(int i) { 
    trace(String.valueOf(i)); 
    } 


    public void print(long l) { 
    trace(String.valueOf(l)); 
    } 


    public void print(Object obj) { 
    trace(obj.toString()); 
    } 


    public void print(String s) { 
    trace(s); 
    } 


    public void println() { 
    trace(""); 
    } 


    public void println(boolean x) { 
    trace(String.valueOf(x)); 
    } 


    public void println(char x) { 
    trace(String.valueOf(x)); 
    } 


    public void println(char[] x) { 
    trace(String.valueOf(x)); 
    } 


    public void println(double x) { 
    trace(String.valueOf(x)); 
    } 


    public void println(float x) { 
    trace(String.valueOf(x)); 
    } 


    public void println(int x) { 
    trace(String.valueOf(x)); 
} 


public void println(long x) { 
    trace(String.valueOf(x)); 
} 


    public void println(Object x) { 
    trace(x.toString()); 
    } 


    public void println(String x) { 
    trace(x); 
    } 


    public void write(int c) { 
    trace(String.valueOf(c)); 
    } 


    public static void traceStdErr() { 
    System.setErr(new TraceStream(System.err) { 
    protected void trace(String line) { 
     TRACE.error(ThreeLetterCode.CODE_EXC, line); 
    } 
    }); 
} 


public static void traceStdOut() { 
    System.setOut(new TraceStream(System.out) { 
    protected void trace(String line) { 
    TRACE.info(ThreeLetterCode.CODE_INF, line); 
    } 
    }); 
    } 
} 

Auf diese Weise werden alle Ihre Systemouts und Errs die Protokolldatei erreichen.

Verwandte Themen