挂钩到System.out.println();并修改

时间:2015-01-06 14:05:15

标签: java string logging prefix

我想修改System.out.println();打印的输出。这怎么可能? 这是可能的 - 我在Bukkit / Craftbukkit中看到过它。如果插件正在使用System.out.println(String string)打印字符串; Bukkit为字符串添加时间/日期和日志状态。 我想像Bukkit一样做。

3 个答案:

答案 0 :(得分:13)

您可以更改用作标准输出的PrintStream

<强> System.setOut(PrintStream out)

创建您自己的PrintStream实现,它将您想要的任何额外信息打印到(旧)标准输出,并将其设置为:

System.setOut(myStream);

示例:

以下示例在使用PrintStream.println(String x)方法打印的每个打印String之前打印当前时间毫秒:

PrintStream myStream = new PrintStream(System.out) {
    @Override
    public void println(String x) {
        super.println(System.currentTimeMillis() + ": " + x);
    }
};
System.setOut(myStream);
System.out.println("Hello World!");

输出:

1420553422337: Hello World!

注意:

此示例仅覆盖PrintStream.println(String x)方法,因此调用PrintStream的其他打印方法不会将时间戳添加到输出中。

答案 1 :(得分:0)

PrintStream print= new PrintStream(System.out) {

    @Override

    public void println(String yourString) {

        super.println(System.currentTimeMillis()+ ": " + yourString);

    }

};

print.println("your String");

答案 2 :(得分:0)

这个问题已经回答,但是,我想添加一个很好的方法来跟踪打印。

PrintStream myStream = new PrintStream(System.out) {
        @Override
        public void println(String line) {
            StackTraceElement element = new Exception().getStackTrace()[1];
            super.println("("+element.getFileName()+":"+element.getLineNumber()+") "+line);
        }
    };

    System.setOut(myStream);

现在,当您打印某些内容时,它将显示为“(File:linenumber)文本”,在许多编辑器中,您只需单击该内容即可跳到该位置。始终获取stacktrace可能很昂贵,因此最好只在调试期间使用它。