为什么不将要捕获的消息写入stderr并适当地重定向呢?您应该考虑的一个问题是stdout [通常] 是缓冲的,而stderr不是。
您正在寻找shell 重定向和管道。假设您使用的是标准的 shell,如 shell、bash、csh 等......
command >foo.txt
将标准输出重定向 到文件。填充中的任何现有内容都将被替换。foo.txt
command >>foo.txt
将重定向 stdout,将其附加到文件foo.txt
的现有内容(如果有)的foot.txt
.
foo | bar
将通过 command的标准输入管道foo
命令的内容。stdout
bar
*nix 进程打开了三个标准 i/o 句柄:
- stdin是标准输入。它是文件句柄 0。
- stdout是标准输出。它是文件句柄 1。
- stderr是标准错误。它是文件句柄 2。
重定向和管道运算符也可以挂钩特定的文件句柄。所以...
command >foo.txt 2>&1
执行以下操作:
- 将标准输出重定向到文件
foo.txt
- 将stderr重定向到文件句柄 1,stderr,现在打开为
foo.txt
.
其他 shell 可以(并且确实)使用不同但通常相似的语法。
您还应该了解一些有用的命令:
tee(1)
.
这将获取给定的标准输入并将其写入命令行上指定的文件以及标准输出,因此链如下:
some-command 2>&1 | tee some-command.log.2013-05-31.txt | less
运行some-command
,这可能会产生大量的输出,将其标准错误重定向到标准输出,然后通过管道传输tee(1)
,生成一个日志文件,some-commmand.log.2013-05-31.txt
并通过管道传输less(1)
它以在控制台上对其进行分页。
less(1)
more(1)
more
通常是less(1)
这些日子的同义词。这两个都是分页器,它缓冲输出并一次显示一个屏幕,让您向前和向后翻页。
man(1)
apropos(1)
这是*nix 的在线帮助系统。要了解有关它们的更多信息,请尝试运行以下命令:
* `man man`
* `man apropos`
获取and命令的手册页。您也可以尝试, 或针对您正在使用的特定 shell(例如,将为您提供shell 的手册页,同时为您提供 Bourne shell ( ) 手册页并为您提供手册页。man
apropos
man tee
man [your-shell-name]
man csh
csh
man sh
sh
man bash
bash
本页描述了 C 和 Bourne shell 系列的常用管道/重定向运算符:http: //www.mathinfo.u-picardie.fr/asch/f/MeCS/courseware/users/help/general/unix/redirection.html
您还应该阅读相应的 O'ReillyNutshell
书籍:
编辑注意:
正如我在下面的评论中提到的,您可以将System.Out
and替换System.Err
为您自己的PrintStream
,如下所示:
PrintStream originalStdOut = System.Out ;
PrintStream newStdout = CreateNewOutputSink() ;
System.Out.flush() ;
System.Out.setOut( newStdout ) ;
invokeSome3rdPartyCode() ;
System.Out.flush() ;
System.Out.setOut( originalStdout ) ;
这将让您挂钩来自 3rd 方库的输出并将其重定向到您选择的数据接收器,同时不会影响您的普通输出。如果您同时挂钩System.Out
并将System.Err
它们重定向到相同 PrintStream
的位置,您将在此过程中捕获标准输出和错误输出。