【发布时间】:2016-09-29 14:53:11
【问题描述】:
我想将stderr重定向到一个文件和stdout。
我知道如何使用dup2 将stderr 重定向到文件:err := syscall.Dup2(int(fatal_logfile.Fd()), int(os.Stderr.Fd()))
但是我不知道如何再次将其重定向到stdout。就像将一个流源“复制”到两个不同的流一样。
请注意,此功能在应用启动时调用,并用于重定向stderr,例如,出现panic。那么在这种情况下我不能使用recover(即使我运行了很多goroutines)。
有人知道如何解决这个问题吗?
另一个可行的解决方案是在调用二进制文件时使用pipes 和tee,但是否可以在应用程序内部定义相同的行为/逻辑?我希望它默认以这种方式运行。
./app_bin 2> >(tee -a fatal.log)
【问题讨论】:
-
我认为在应用程序之外处理这个可能会更好,根据需要重定向stderr。您可能可以使用一些管道和副本来执行此操作,但您现在有机会丢失 stderr 输出,而不是拥有单个未缓冲的流。
-
正确的@JimB - 我刚刚更新了我的问题,包括在运行二进制文件时重定向
stderr的解决方案。可能是一个幼稚的问题,但我可以在应用程序中“导入”相同的逻辑吗?我希望它默认以这种方式运行 -
在程序之外执行此操作总是更可靠。如果目标是在发生崩溃时捕获输出,那么在程序中执行
tee的函数可能无法在进程退出之前获取数据。 -
感谢@JimB 的输入,我想我会听从您的建议:在应用程序之外应用重定向。我可能会直接将其包含在
system.d脚本中。
标签: file go stream stdout stderr