2013-03-14 12 views
9

W moim testu pakietu projektów istnieje duże wykorzystaniePrzekierowanie System.out.println zalogować

próbuję przekierować te dane wyjściowe do pliku dziennika (poprzez konfigurację lub z jednego punktu bez refactoring cały projekt), aby w razie potrzeby można było wyłączyć, aby poprawić wydajność. Używam log4j do logowania. Czy ktoś wie, jest to możliwe? jeśli tak, jak to zrobić? Z góry dzięki.

+1

ta strona wyjaśnia to bardzo SZCZEGÓŁOWY: https://examples.javacodegeeks.com/core-java/lang/system/out/logging-system-println-results-log-file-example/ –

Odpowiedz

1

Zastosowanie powłoki przekierowania. Wyobraź sobie wywołanie "java" dla twojego projektu, jeśli używasz prawie wszystkich systemów uniksopodobnych, ps aux | grep java pomoże.

Następnie wystarczy uruchomić to polecenie za pomocą>/path/to/logfile. Przykład:

java -jar myjar.jar -cp path/to/lib.jar:path/to/otherlib.jar com.bigcorp.myproject.Main > /var/log/myproject.log 
+1

Nie to było pytanie. – peterh

2

myślę, że można użyć System.setOut(PrintStream) ustawić wyjście do strumienia wyjściowego pliku. Następnie możesz umieścić tę linię w swojej metodzie BeforeClass. Chciałbym użyć klasy BaseTest i umieścić ten wiersz kodu w metodzie beforeclass tej klasy. Następnie spraw, aby wszystkie przypadki testowe rozszerzyły tę klasę.

0
public class RecursiveLogging { 
public static void main(String[] args) { 
    System.setOut(new PrintStream(new CustomOutputStream())); 

    TestMyException.testPrint(); 
} 

} 

class CustomOutputStream extends OutputStream { 
private Logger logger = Logger.getLogger(this.getClass()); 

@Override 
public final void write(int b) throws IOException { 
    // the correct way of doing this would be using a buffer 
    // to store characters until a newline is encountered, 
    // this implementation is for illustration only 
    logger.info((char) b); 
} 

@Override 
public void write(byte[] b, int off, int len) throws IOException { 
    if (b == null) { 
     throw new NullPointerException(); 
    } else if ((off < 0) || (off > b.length) || (len < 0) || 
       ((off + len) > b.length) || ((off + len) < 0)) { 
     throw new IndexOutOfBoundsException(); 
    } else if (len == 0) { 
     return; 
    } 
    byte[] pb = new byte[len]; 
    for (int i = 0 ; i < len ; i++) { 
     pb[i] = (b[off + i]); 
    } 
    String str = new String(pb); 
    logger.info(str); 
} 
} 
3

Biorąc pod uwagę, że lepiej jest wymienić System.out.println(), czasami nie mamy wyboru. W każdym razie zrobiłem małą użyteczność dla że:

SystemOutToSlf4j.enableForClass(MyClass.class) 

Następnie cała println pochodzi z MojaKlasa zostanie przekierowany do rejestratora. See this post for more details...

public class SystemOutToSlf4j extends PrintStream { 

    private static final PrintStream originalSystemOut = System.out; 
    private static SystemOutToSlf4j systemOutToLogger; 

    /** 
    * Enable forwarding System.out.println calls to the logger if the stacktrace contains the class parameter 
    * @param clazz 
    */ 
    public static void enableForClass(Class clazz) { 
    systemOutToLogger = new SystemOutToSlf4j(originalSystemOut, clazz.getName()); 
    System.setOut(systemOutToLogger); 
    } 


    /** 
    * Enable forwarding System.out.println calls to the logger if the stacktrace contains the package parameter 
    * @param packageToLog 
    */ 
    public static void enableForPackage(String packageToLog) { 
    systemOutToLogger = new SystemOutToSlf4j(originalSystemOut, packageToLog); 
    System.setOut(systemOutToLogger); 
    } 

    /** 
    * Disable forwarding to the logger resetting the standard output to the console 
    */ 
    public static void disable() { 
    System.setOut(originalSystemOut); 
    systemOutToLogger = null; 
    } 

    private String packageOrClassToLog; 

    private SystemOutToSlf4j(PrintStream original, String packageOrClassToLog) { 
    super(original); 
    this.packageOrClassToLog = packageOrClassToLog; 
    } 

    @Override 
    public void println(String line) { 
    StackTraceElement[] stack = Thread.currentThread().getStackTrace(); 
    StackTraceElement caller = findCallerToLog(stack); 
    if (caller == null) { 
     super.println(line); 
     return; 
    } 

    org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(caller.getClass()); 
    log.info(line); 
    } 

    public StackTraceElement findCallerToLog(StackTraceElement[] stack) { 
    for (StackTraceElement element : stack) { 
     if (element.getClassName().startsWith(packageOrClassToLog)) 
     return element; 
    } 

    return null; 
    } 

} 
Powiązane problemy