【发布时间】:2017-07-16 02:52:23
【问题描述】:
当我使用System.out.println 打印我的日志消息时,我正在编写一个基本的服务器程序。我写了一个基本的类文件,用它来写出日志。如果我要写以下内容:
System.out.println("Hello, world!");
System.out.println("Goodbye, world");
期望的输出是:
Log message - Hello, world!
Log message - Goodbye, world!
最终发生的结果与所需的输出不匹配。相反,它会输出到以下内容。
Log message - Hello, world!
Goodbye, world!
main方法的代码:
public static void main(String[] args){
LogManager.start();
System.out.println("Hello, world!");
System.out.println("Goodbye, world!");
LogManager.stop();
}
LogManager 类将打印出的默认PrintStream 切换为,并保留旧的副本以打印出日志消息。但是,“Log message -”并不总是带有前缀。虽然,在每个 println 调用之间休眠 2000 毫秒时,输出如下所示。
Log message - Hello, world!
Log message - Goodbye, world!Log message -
LogManager的代码如下。
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
public class LogManager implements Runnable{
private final PrintStream ps;
private final OutputStream out;
private static boolean cont = true;
public static void start(){
OutputStream stdout = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(stdout);
Thread th = new Thread(new LogManager(System.out, stdout));
System.setOut(ps);
th.start();
}
public static void stop(){
cont = false;
}
public LogManager(PrintStream std, OutputStream out){
this.ps = std;
this.out = out;
}
@Override
public void run() {
ByteArrayOutputStream baos = (ByteArrayOutputStream) out;
while(true){
if(!cont) return;
byte[] bytes = baos.toByteArray();
if(bytes.length > 0){
baos.reset();
ps.print("Log message - " + new String(bytes));
}
}
}
}
有人可以指出我做错了什么,我们将不胜感激。我想远离图书馆,因为我想将我的 JAR 大小保持在最低限度,而不必包含额外的包,尽管主要是因为我知道我没有使用任何其他人的图书馆来实现我正在做的事情。
【问题讨论】:
标签: java multithreading logging printstream