Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java console output - File And to Console BOTH

Probably this thread is a duplicate but can someone guide? I want to write the java program output to console and file at the same time. I know that i can send output to console with this piece of code

    PrintStream orgStdout = null;
    PrintStream fileStdout = null;

    orgStdout = System.out;
    try {
        fileStdout = new PrintStream(new FileOutputStream("C:\\testlogger.txt"));
        System.setOut(fileStdout);
        System.out.println("==============");
        for (int i = 0; i < 10; i++){
            System.out.println("" + i);
        }
        System.out.println("==============");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

but how to keep output on console and on file as well??

P.S: not looking for an option where i output in file and display it console in different thread.

like image 228
x.509 Avatar asked Apr 29 '11 22:04

x.509


2 Answers

Look for TeeOutputStream from Apache Commons IO.

like image 200
Rom1 Avatar answered Oct 08 '22 14:10

Rom1


Don't call System.setOut(), and just make two calls to print. It's not very elegant, but you could make a method that outputs to both.

PrintStream orgStdout = null;
PrintStream fileStdout = null;

orgStdout = System.out;
try {
    fileStdout = new PrintStream(new FileOutputStream("C:\\testlogger.txt"));
    System.out.println("==============");
    for (int i = 0; i < 10; i++){
        System.out.println("" + i);
        fileStdout.println("" + i);
    }
    System.out.println("==============");
    fileStdout.println("" + i);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

If you're running on a unix box, you could also use the tee command as long as everything is printed to stdout. You'd run your program like this:

java MyClass | tee testlogger.txt

Then everything printed to stdout goes to both the file and console.

like image 22
lazycs Avatar answered Oct 08 '22 14:10

lazycs