如何将 PrintStream 绑定到 System.out 和 err 流
How to tie a PrintStream to the System.out and err streams
我正在尝试将我的 PrintStream 对象绑定到控制台的输出和错误流,以便我在那里写入的内容也将写入我的日志文件。
public static void tieOutputStreams(String fileName) {
try {
File output = new File(fileName);
FileWriter writer = new FileWriter(output);
writer.close();
outputStream = new TiedOutputStream(output);
}
catch (Exception e) {
e.printStackTrace();
}
System.setErr(outputStream);
System.setOut(outputStream);
}
写完后,我可以将其重置为原来的样子。
public static void resetOutputStreams() {
outputStream.close();
System.setErr(System.err);
System.setOut(System.out);
}
TiedOutputStream class 看起来像这样:
public class TiedOutputStream extends PrintStream {
public TiedOutputStream(File logFile) throws FileNotFoundException {
super(logFile);
}
@Override
public void print(Object obj) {
super.print(obj);
System.out.print(obj);
}
@Override
public PrintStream printf(String format, Object... args) {
super.printf(format, args);
System.out.printf(format, args);
return this;
}
@Override
public void println(Object args) {
super.println(args);
System.out.println(args);
}
}
我的主要方法:
public static void main(String[] args) {
try {
TieOutputStreams.tieOutputStreams("./sample.log");
System.out.println("Output console");
System.err.println("Error console");
float num = 1.123456f;
System.out.printf("A float: %.6f", num);
} catch (Exception e) {
e.printStackTrace();
}
finally {
TieOutputStreams.resetOutputStreams();
}
}
我希望将这些语句打印在我的日志文件和系统控制台上 (out / err)。由于我不知道的原因,这是行不通的。我感谢所有的答案和评论。提前致谢!
我知道有 Log4j。但我还是想这样做。
这不起作用主要是因为你没有保存原来的 System.out
并且因为你没有覆盖 println(String obj)
当你调用 System.out.println("Output console");
时你不会打进去你重写的方法,因为那个人期望和对象并且在 PrintStream
中有一个更具体的方法需要一个 String
参数
这似乎有效:
public class TiedOutputStream extends PrintStream {
private final PrintStream sout;
private final PrintStream serr;
public TiedOutputStream(File logFile) throws FileNotFoundException {
super(logFile);
sout = System.out;//save standard output
serr = System.err;
}
@Override
public void print(Object obj) {
super.print(obj);
sout.print(obj);
}
@Override
public void println(String obj) {
super.println(obj);
sout.println(obj);
}
@Override
public PrintStream printf(String format, Object... args) {
super.printf(format, args);
sout.printf(format, args);
return this;
}
@Override
public void println(Object args) {
super.println(args);
sout.println(args);
}
}
不确定为什么 tieOutputStreams 创建了那个 FileWriter
public static void tieOutputStreams(String fileName) {
try {
File output = new File(fileName);
outputStream = new TiedOutputStream(output);
System.setErr(outputStream);
System.setOut(outputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
main
方法不变。您应该更新 resetOutputStreams 以恢复到原始 out
和 err
。如果我要使用它,我会覆盖 PrintStream
中的所有 print* 方法。
我正在尝试将我的 PrintStream 对象绑定到控制台的输出和错误流,以便我在那里写入的内容也将写入我的日志文件。
public static void tieOutputStreams(String fileName) {
try {
File output = new File(fileName);
FileWriter writer = new FileWriter(output);
writer.close();
outputStream = new TiedOutputStream(output);
}
catch (Exception e) {
e.printStackTrace();
}
System.setErr(outputStream);
System.setOut(outputStream);
}
写完后,我可以将其重置为原来的样子。
public static void resetOutputStreams() {
outputStream.close();
System.setErr(System.err);
System.setOut(System.out);
}
TiedOutputStream class 看起来像这样:
public class TiedOutputStream extends PrintStream {
public TiedOutputStream(File logFile) throws FileNotFoundException {
super(logFile);
}
@Override
public void print(Object obj) {
super.print(obj);
System.out.print(obj);
}
@Override
public PrintStream printf(String format, Object... args) {
super.printf(format, args);
System.out.printf(format, args);
return this;
}
@Override
public void println(Object args) {
super.println(args);
System.out.println(args);
}
}
我的主要方法:
public static void main(String[] args) {
try {
TieOutputStreams.tieOutputStreams("./sample.log");
System.out.println("Output console");
System.err.println("Error console");
float num = 1.123456f;
System.out.printf("A float: %.6f", num);
} catch (Exception e) {
e.printStackTrace();
}
finally {
TieOutputStreams.resetOutputStreams();
}
}
我希望将这些语句打印在我的日志文件和系统控制台上 (out / err)。由于我不知道的原因,这是行不通的。我感谢所有的答案和评论。提前致谢!
我知道有 Log4j。但我还是想这样做。
这不起作用主要是因为你没有保存原来的 System.out
并且因为你没有覆盖 println(String obj)
当你调用 System.out.println("Output console");
时你不会打进去你重写的方法,因为那个人期望和对象并且在 PrintStream
中有一个更具体的方法需要一个 String
参数
这似乎有效:
public class TiedOutputStream extends PrintStream {
private final PrintStream sout;
private final PrintStream serr;
public TiedOutputStream(File logFile) throws FileNotFoundException {
super(logFile);
sout = System.out;//save standard output
serr = System.err;
}
@Override
public void print(Object obj) {
super.print(obj);
sout.print(obj);
}
@Override
public void println(String obj) {
super.println(obj);
sout.println(obj);
}
@Override
public PrintStream printf(String format, Object... args) {
super.printf(format, args);
sout.printf(format, args);
return this;
}
@Override
public void println(Object args) {
super.println(args);
sout.println(args);
}
}
不确定为什么 tieOutputStreams 创建了那个 FileWriter
public static void tieOutputStreams(String fileName) {
try {
File output = new File(fileName);
outputStream = new TiedOutputStream(output);
System.setErr(outputStream);
System.setOut(outputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
main
方法不变。您应该更新 resetOutputStreams 以恢复到原始 out
和 err
。如果我要使用它,我会覆盖 PrintStream
中的所有 print* 方法。