将打印到Windows CMD的所有内容存储在一个文件中

时间:2012-04-11 23:07:55

标签: java windows cmd

有什么方法可以保存文件中Windows 7命令提示符上发生的所有事情。这样我就可以看到控制台上打印的东西是什么了。我在命令提示符下运行多线程Java程序 -

java -server -Xms512m -Xmx512m -XX:PermSize=512m -XX:MaxPermSize=512m -Duser.timezone=GMT-7 –jar BatchMain.jar -taskId V3-PERSONALIZATIONGEO-SAMPLE-TASK -noofthreads 1 -timeout 5 -numberOfIP 1000 -privateIPAddress false

它会在命令提示符上打印很多内容,并且我希望将所有在控制台上打印的内容存储到文件中。

3 个答案:

答案 0 :(得分:1)

您可以在命令

后面写“> outfile.name”

答案 1 :(得分:1)

就Java编程而言,您必须制作某种日志记录系统,以便将所有程序的输出写入文件,或者如果您正在寻找组织,则必须编写多个文件。如果您只需要某些部分数据,我建议使用此方法。

Dwrd's answer是正确的。但是,如果您只需要输出的某些部分(例如IP地址),这将不是您正在寻找的代码。从程序的开始到结束,所有输出都将写入您指定的文件。为了更清楚掌握这个主题,你可以使用这段代码:

java -server -Xms512m -Xmx512m -XX:PermSize=512m -XX:MaxPermSize=512m -Duser.timezone=GMT-7 –jar BatchMain.jar -taskId V3-PERSONALIZATIONGEO-SAMPLE-TASK -noofthreads 1 -timeout 5 -numberOfIP 1000 -privateIPAddress false > myLog.txt

这样做的缺点是命令提示屏幕没有输出。

答案 2 :(得分:1)

您可以直接在程序中或控制台上捕获输出。

在控制台上

如果你想获得绝对所有东西(STDOUT和STDERR),你需要重定向STDOUT(来自System.out)和STDERR(来自System.err)。您可以将两者重定向到同一文件(将> log.txt 2>&1添加到控制台命令的末尾),也可以将它们记录到不同的文件中(将> BatchMain.log 2> BatchMain.err添加到控制台的末尾)。

记录到单个文件log.txt:

java -server -Xms512m -Xmx512m -XX:PermSize=512m -XX:MaxPermSize=512m -Duser.timezone=GMT-7 –jar BatchMain.jar -taskId V3-PERSONALIZATIONGEO-SAMPLE-TASK -noofthreads 1 -timeout 5 -numberOfIP 1000 -privateIPAddress false > log.txt 2>&1

记录到单独的文件BatchMain.log和BatchMain.err:

java -server -Xms512m -Xmx512m -XX:PermSize=512m -XX:MaxPermSize=512m -Duser.timezone=GMT-7 –jar BatchMain.jar -taskId V3-PERSONALIZATIONGEO-SAMPLE-TASK -noofthreads 1 -timeout 5 -numberOfIP 1000 -privateIPAddress false > BatchMain.log 2> BatchMain.err

直接在你的程序中

main(String[] args)方法(或其他适当的位置)中,将System.out和System.err设置为直接打印到文件(如果您愿意,可以打印到同一文件)。例如:

package com.example.logging;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class LogToFiles {

    public static void main(String[] args) throws FileNotFoundException {
        System.setOut(new PrintStream("example.log"));
        System.setErr(new PrintStream(new FileOutputStream("example.err"), true));

        System.out.println("System.out example");
        System.err.println("System.err example");
    }

}

如果您希望输出也在控制台上可见,您可以更进一步插入自己的中间PrintStream来执行此操作。

需要考虑的其他事项

请注意,Java缓冲了System.out,所以如果你将STDOUT和STDERR都记录到同一个文件中,你最终会得到两个PrintStream交织在一起的无意义输出,或者STDOUT中的某些内容可能比相关文件打印得晚得多打印到STDERR的消息。一种解决方法是根据需要调用System.out.flush(),但如果您将大量文本记录到System.out,这可能会降低性能。

我不建议使用System.out.println()将所有内容打印到控制台并尝试捕获该输出,而是建议使用Java LoggingLog4J,或者更进一步使用{{3}可以配置为在内部使用前两个系统中的任何一个。真正令人敬畏的部分是你不必判断哪个类打印了每条日志消息,因为你会自动获得它。

如果您使用日志记录框架,您还可以通过设置单个变量来调整日志记录输出的详细程度 - 这将在发布时派上用场。