System.err and System.out en Java ejemplos
En java los 3 primeros streamsstdin (standard input) , stdout (standard output) and stderr (standard output error) se manejar por defecto por System.in, Sytem.out y System.err respectivamente. A menudo necesitamos cambiar la salida de acuerdo con nuestras necesidades. Esto se puede hacer de varias maneras diferentes como por ejemplo especificarlo desde el SO o usar Java para elegir como queremos gestionarlos.
En los siguientes ejemplos se muestra como manejar estos streams en diferentes escenarios.
Redirigir los Streams a archivos desde la consola Unix
java MyExample > output.log 2>error.log
Redirigir los Streams de Salida a Archivos en Java
Este ejemplo redirige los 2 streams de salida a dos archivos. Produce un ArithmeticException dividiendo por 0 y guarda las trazas en el stderr.log. No poducirá ninguna salida por la consola.
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; public class OutPuts { public static void main(String[] args) { try { FileOutputStream fout = new FileOutputStream("stdout.log"); FileOutputStream ferr = new FileOutputStream("stderr.log"); PrintStream out = new PrintStream(fout); PrintStream err = new PrintStream(ferr); System.setOut(out); System.setErr(err); out.println("trace console 1"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } System.out.println("trace console 2"); System.out.println(100/0); } }
Redirigir el Stream de salida de error al Stream de salida estandar
public class OutPuts { public static void main(String[] args) { System.setErr(System.out); System.out.println("trace console"); System.out.println(100/0); } }
Redirigir los Streams de Salida a un archivo y sacar los resultados por Consola
En este ejemplo se crea una clase a modo de "proxy" para que cada vez que se llame al os metodos print o println su contenido sea guardado en los archivos especificados y lo muestre por consola.
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; public class OutPuts { public static void main(String[] args) { System.setOut(new ProxyPrintStream(System.out, "stdout.log")); System.setErr(new ProxyPrintStream(System.err, "stderr.log")); System.out.println("trace console 1"); System.out.println(100 / 0); } } class ProxyPrintStream extends PrintStream{ private PrintStream fileStream = null; private PrintStream originalPrintStream = null; public ProxyPrintStream(PrintStream out, String FilePath) { super(out); originalPrintStream = out; try { FileOutputStream fout = new FileOutputStream(FilePath,true); fileStream = new PrintStream(fout); } catch (FileNotFoundException e) { e.printStackTrace(); } } public void print(final String str) { originalPrintStream.print(str); fileStream.print(str); } public void println(final String str) { originalPrintStream.println(str); fileStream.println(str); } }
* Este ejemplo añade o crea un archivo ya existente para que cree un archivo nuevo cada vez cambia new FileOutputStream(FilePath,true) por new FileOutputStream(FilePath).
Redirigir los Streams de salida en Log4J
Este ejemplo muestra todas las trazas de los streams de salida estandar por los archivos de los del log4j. Sirve para asegurarse que todas las trazas de error o de código puestas en la aplicación incluidas las que usan System.out.println o System.out.print se guarden en los archvios de log.
/** * To change tie the sysOut and sysErr to the log */ public static void tieSystemOutAndErrToLog() { System.setOut(createLoggingProxy(System.out)); System.setErr(createLoggingProxy(System.err)); } public static PrintStream createLoggingProxy(final PrintStream realPrintStream) { return new PrintStream(realPrintStream) { public void print(final String string) { logger.warn(string); } public void println(final String string) { logger.warn(string); } }; }