【问题标题】:go - redirect stderr to file AND to stdoutgo - 将 stderr 重定向到文件 AND 到 stdout
【发布时间】:2016-09-29 14:53:11
【问题描述】:

我想将stderr重定向到一个文件和stdout

我知道如何使用dup2stderr 重定向到文件:
err := syscall.Dup2(int(fatal_logfile.Fd()), int(os.Stderr.Fd()))

但是我不知道如何再次将其重定向到stdout。就像将一个流源“复制”到两个不同的流一样。

请注意,此功能在应用启动时调用,并用于重定向stderr,例如,出现panic。那么在这种情况下我不能使用recover(即使我运行了很多goroutines)。

有人知道如何解决这个问题吗?


另一个可行的解决方案是在调用二进制文件时使用pipestee,但是否可以在应用程序内部定义相同的行为/逻辑?我希望它默认以这种方式运行。

./app_bin 2> >(tee -a fatal.log)

【问题讨论】:

  • 我认为在应用程序之外处理这个可能会更好,根据需要重定向stderr。您可能可以使用一些管道和副本来执行此操作,但您现在有机会丢失 stderr 输出,而不是拥有单个未缓冲的流。
  • 正确的@JimB - 我刚刚更新了我的问题,包括在运行二进制文件时重定向stderr 的解决方案。可能是一个幼稚的问题,但我可以在应用程序中“导入”相同的逻辑吗?我希望它默认以这种方式运行
  • 在程序之外执行此操作总是更可靠。如果目标是在发生崩溃时捕获输出,那么在程序中执行tee 的函数可能无法在进程退出之前获取数据。
  • 感谢@JimB 的输入,我想我会听从您的建议:在应用程序之外应用重定向。我可能会直接将其包含在system.d 脚本中。

标签: file go stream stdout stderr


【解决方案1】:
writer := io.MultiWriter(os.Stdout, os.Stderr)

无论写给writer 的内容都会写给os.Stdoutos.Stderr

【讨论】:

  • 为什么否定 1. 这似乎是一个可行的解决方案?
  • 问题是要求将 stderr 写入重定向并复制到 os.File 和 os.Stdout。这将创建一个单独的 io.Writer,它将输出发送到 os.Stdout 和 os.Stderr,但根本不重定向 os.Stderr。
猜你喜欢
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2022-01-18
  • 1970-01-01
  • 2012-08-07
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多