我有一个基于Java GUI的应用程序,它将一些诊断消息写入System.out和System.err。在Windows上运行时,这些消息输出在哪里? (例如,在Mac OS X上,它们将打印到系统控制台日志中。)
修改
我应该补充一点,Java应用程序打包为.exe,所以(现在)我无法使用java
启动它。 (我想,我可以将各个.JAR文件复制到Windows测试机器上。)
此外,它是我继承的应用程序之前没有使用过日志框架;我想修改它以使用一个,但我希望能够快速获得一些日志输出来诊断问题。
答案 0 :(得分:6)
您实际上可以使用setout()和setErr()更改应用程序中System.out和System.err指向的位置。
因此,对于exmaple,如果要转储到文件,则可以执行
System.setOut(new PrintStream("output.txt"));
System.setErr(new PrintStream("err.txt"));
只需在main(String[] args)
进行一次即可,你应该好好去。
答案 1 :(得分:3)
AFAIK如果您使用java.exe
启动Java应用程序,它们将被写入控制台。如果使用javaw.exe
启动它,它们就无处可去,因为标准输入/输出/错误不会重定向到GUI应用程序。 (您可以手动为javaw.exe
创建一个子流程并重定向输出,但我认为这超出了范围)
我建议使用一些日志框架,然后将消息写入日志文件。 log4j
或java.util.logging
将是一个良好的开端......
答案 2 :(得分:2)
这实际上取决于您启动应用程序的方式。例如,如果您要从Windows命令行提示符(例如java -jar myApp.jar
)启动GUI,那么您可能会发现System.out和System.err都会进入控制台。如果您通过Windows shell本身启动(例如,双击可执行的JAR),那么这些错误流就会丢失,据我所知。设置应用程序作为服务的执行(但在您的情况下听起来不太可能)也会丢失输出流。
在put和output流中使用标准通常不是一个好主意,除非您期望在shell脚本类型环境中调用您的程序,在这种环境中这些是通信的通用通道。正如您自己发现的那样,这些通常在GUI环境中没有很好地定义。如果您确实希望在程序运行时捕获文本信息,请考虑使用“真实”日志记录框架(例如log4j或java.util.logging
包)将消息捕获到日志中。
答案 3 :(得分:2)
基于GUI的应用程序,在双击.jar文件时以javaw启动,不会输出System.out和System.err:
Load java.util.logging.config.file for default initialization
“javaw”吞下所有输出到System.out和System.err。尝试使用“java”(不使用“w”)。
答案 4 :(得分:1)
System.err
条消息。如果你不这样做,你就不会看到这些消息。
答案 5 :(得分:0)
如果使用java运行,则可以使用Java console。