1

有什么方法可以将 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

它会在命令提示符上打印很多东西,我想将所有这些打印在控制台上的东西存储到一个文件中。

4

3 回答 3

1

您可以在命令后写“> outfile.name”

于 2012-04-11T23:12:30.383 回答
1

就 Java 编程而言,您必须制作某种日志系统才能将程序的所有输出写入一个文件,或者如果您正在寻找组织,则可以写入多个文件。如果你只需要数据的某些片段和部分,我推荐使用这种方法。

Dwrd 的回答是正确的。但是,如果您只需要输出的某些部分(例如 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

这样做的缺点是命令提示符屏幕不会有任何输出。

于 2012-04-11T23:25:04.447 回答
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 记录到同一个文件中,您最终可能会得到包含两个 PrintStreams 交织的无意义输出,或者 STDOUT 中的某些内容可能会比相关消息打印得晚得多打印到 STDERR。一种解决方法是酌情调用System.out.flush(),但如果您将大量文本记录到System.out.

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

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

于 2012-04-11T23:40:11.527 回答