如何重定向进程文件的输出写入?

时间:2015-05-14 16:33:05

标签: linux io file-descriptor

我有一个运行的遗留应用程序将其输出发送到日志文件。我希望在输出到磁盘之前捕获输出,然后将其发送到网络上的其他位置(使用syslog,或者流利,或者使用logstash等),而不是拖尾和管理这些日志文件。

有没有办法在不改变应用程序代码本身的情况下捕获输出?我可以选择更改进程启动,因此我可以“包装”它。

我想到了几个选择:

  • 命名管道 - 它可以工作,但受管道缓冲和管道限制的限制。
  • 标准重定向 - 实际上仅适用于已知文件描述符,即stdin,stdout,stderr / 0,1,2

是否有任何理智的方式来插入我的程序,以便应用程序认为它仍在写入/var/log/myapp.log,而是发送到我的日志控制器,然后可以按照自己的意愿执行?

3 个答案:

答案 0 :(得分:1)

使用命名管道。 管道缓冲区大小不是您应该担心的事情,如果读取器端没有死亡(或提前关闭连接),您就不应该获得SIGPIPES。

您的读者可以像

一样简单
<named_pipe nc some_address some_port &

如果你在作家写作时要杀了它,那么作者就会得到一个SIGPIPE。

至于缓冲区大小问题,只要nc some_address someport >( nc some_address some_port)更快或速度与写入命名管道的速度一样快,编写器进程就赢了#39 ;被阻止。如果编写器更快,它将在缓冲区填满时。 (但是,写入磁盘或网络也会阻止你)。

您不必担心系统确定的管道缓冲区大小;只需在管道的读取器端修改缓冲(例如,如果管道缓冲区大小对于您来说太小,则可以设置nc的TCP输出缓冲区大小,这与增加管道缓冲区大小具有相同的效果)。 p>

如果你从bash启动程序并且你的应用程序将日志文件作为参数,你可以简单地给它include "wp-load.php";,这将为你创建一个匿名命名管道。

答案 1 :(得分:0)

在Linux上,您可以为您的流程创建<input type="submit" value="Coming Soon!" id="add" class="btn add-to-cart disabled" disabled="disabled" style="opacity: 0.5;"> 环境。所有文件访问现在都是您给定根路径的本地访问,这使您可以为要替换的所有文件准备管道/ fifos。这可能需要一段时间才能使整个环境运行,但它可以在完全受控的环境中运行该过程。

答案 2 :(得分:0)

正如PSkocik所说,你可以尝试使用'nc'立即发送日志,但请记住'nc'在收到EOF字符时自行停止。您可以尝试使用tail跟踪日志并将其发送到远程主机

tail -f named-pipe-log-file|nc remote-host port

在远程主机上,让“nc”以侦听模式运行,使用'nc -lkd port > log'

写入本地日志