您可以直接在程序中或在控制台上捕获输出。
在控制台上
如果您想获得绝对的一切(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 Logging或Log4J将所有内容打印到控制台并尝试捕获该输出,或者更进一步并使用Apache Commons Logging,它可以配置为在内部使用前两个系统中的任何一个。真正令人敬畏的部分是您不必猜测哪个类打印了每条日志消息,因为您会自动得到它。
如果您使用日志框架,您还可以通过设置单个变量来调整日志输出的详细程度——这将在发布时派上用场。