【发布时间】:2015-05-15 16:01:07
【问题描述】:
我有一个正在运行的旧版应用程序,它将其输出发送到日志文件。我不想跟踪和管理这些日志文件,而是想在输出到达磁盘之前捕获输出并将其发送到网络上的其他地方(使用 syslog、fluentd 或 logstash 等)。
有什么方法可以在不更改应用程序代码本身的情况下捕获输出?我确实可以选择更改进程启动,所以我可以“包装”它。
我想到了几个选项:
- 命名管道 - 可以工作,但会受到管道缓冲区和损坏管道的限制。
- 标准重定向 - 实际上只适用于已知文件描述符,即 stdin、stdout、stderr / 0,1,2
是否有任何理智的方法可以插入我的程序,以便应用程序认为它仍在写入 /var/log/myapp.log 而是被发送到我的日志控制器,然后它可以按照它的意愿进行操作?
【问题讨论】:
-
“管道缓冲区和损坏的管道限制” - 我看不出有任何问题。你能详细说明一下吗?
-
@KarolyHorvath 你不关心吗?想象一个系统每秒输出数千条日志消息。对于基于磁盘的日志文件,它会导致大量磁盘 i/o 和空间使用。如果我可以捕获它并立即将其发送到主机之外,我可以解决这两个问题。但是每秒数千条消息会淹没 /dev/log 或任何其他管道,不是吗?
-
不应该。如果有疑问,请测试它。注意:它是一个管道,而不是一个基于磁盘的 文件。
-
当然是这个意思!
-
如果磁盘跟不上记录器,那么网络也永远无法跟上。
标签: linux io file-descriptor