我有一个运行的遗留应用程序将其输出发送到日志文件。我希望在输出到磁盘之前捕获输出,然后将其发送到网络上的其他位置(使用syslog,或者流利,或者使用logstash等),而不是拖尾和管理这些日志文件。
有没有办法在不改变应用程序代码本身的情况下捕获输出?我可以选择更改进程启动,因此我可以“包装”它。
我想到了几个选择:
是否有任何理智的方式来插入我的程序,以便应用程序认为它仍在写入/var/log/myapp.log,而是发送到我的日志控制器,然后可以按照自己的意愿执行?
答案 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'