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

标签 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

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

最佳答案

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

在控制台上

如果你想获得绝对的一切(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() 将所有内容打印到控制台并 try catch 该输出,我建议使用 Java LoggingLog4J ,或更进一步并使用 Apache Commons Logging ,可以配置为在内部使用前两个系统中的任何一个。真正令人敬畏的部分是您不必猜测哪个类打印了每条日志消息,因为您会自动获得它。

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

关于java - 将打印到 Windows CMD 的所有内容存储在一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10115234/

相关文章:

java - 配置 Play !在多个数据库环境中使用特定数据库的 2 个模型

Python 脚本在 IDLE 中执行时有效,但在控制台中无效

windows - 通过 cmd 中的命令删除目录,但在 bat 文件中不使用相同的命令

java - 为什么我的方法不返回任何内容?

java - 使用 <Item extends java.lang.Comparable<Item>> 时绑定(bind)不匹配

windows - 如何在iis中添加新的应用程序映射

c# - 获取产品 key 、域名、用户名等 Windows 详细信息。

windows - 无法在 cmd 中通过管道传输 cmdlet 对象

c# - 假设 always-trust 在 GPG cmd 中是 yes/true

java - 找不到合适的方法(无参数)