通过ssh在多台机器上的尾日志文件


36

我正在尝试tail在多个远程计算机上创建日志文件,并将输出转发到本地工作站。我希望按Ctrl- 时关闭连接C

目前,我具有以下功能,几乎可以按预期工作。

function dogfight_tail() {
 logfile=/var/log/server.log
 pids=""
 for box in 02 03; do
   ssh server-$box tail -f $logfile | grep $1 &
   pids="$pids $!"
 done
 trap 'kill -9 $pids' SIGINT
 trap  wait
}

连接关闭,我收到的输出tail。但是,由于输出是成批进行的,因此存在某种缓冲。

这是有趣的部分……

执行以下命令并将“测试”附加到/var/log/server.log远程计算机上的文件4-5次后,我可以看到相同的缓冲行为…

ssh server-01 "tail -f /var/log/server.log | grep test"

……找到了禁用它的两种方法……

  1. 将-t标志添加到ssh。

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
  2. 从远程命令中删除引号。

    ssh server-01 tail -f /var/log/server.log | grep test

但是,这些方法都无法在上述多台计算机上执行的功能中起作用。

我尝试过dsh,执行时具有相同的缓冲行为。

dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"

同样在这里,如果我删除引号,则缓冲消失并且一切正常。

dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test

还尝试parallel-ssh了与完全相同的作品dsh。有人可以解释这是怎么回事吗?

我该如何解决这个问题?ssh如果可能的话,最好是顺子走。

PS我不想使用multitail或类似的东西,因为我希望能够执行任意命令。


您可以dbitail此处结帐并下载。

Answers:


36

您会看到grepGlibc提供的标准stdout缓冲区的作用。最好的解决方案是通过使用禁用它--line-buffered(GNU grep,我不确定还有哪些其他实现可能支持它或类似的东西)。

至于为什么仅在某些情况下会发生这种情况:

ssh server "tail -f /var/log/server.log | grep test"

在服务器上的引号中运行整个命令-因此grep等待填充其缓冲区。

ssh server tail -f /var/log/server.log | grep test

通过ssh通道发送grep的输出在本地计算机上运行tail

这里的关键部分是grep根据其是否stdin为终端来调整其行为。当您运行时ssh -t,远程命令正与一个控制终端一起运行,因此远程的grep行为类似于您的本地终端。


非常感谢您的详细解释。现在这对我来说很有意义,并且脚本使用--line-buffered可以按预期工作。
deephacks 2014年

@deephacks在这种情况下,请考虑接受答案-它为其他遇到相同问题的人提供了线索。
彼得2014年

1
grep / glibc的缓冲取决于其stdoutssh tail | grep输出到本地终端,无缓冲。ssh -t "tail|grep"输出到一个没有缓冲的pty。ssh "tail|grep"输出到管道(到sshd),经过缓冲(除非--line-buffered)。
dave_thompson_085

2

看一下这个: multitail

MultiTail允许您监视终端中多个窗口中的日志文件和命令输出,着色,过滤和合并。

要在多个服务器中添加日志,请使用:

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'

3
但是,它不允许您通过ssh进行操作,这是此问题的条件。(而且,这个问题专门说“不想使用多重尾巴”。)
主教

1
@bishop:我认为这种批评是不公平的,部分原因是尽管该问题可能指定不使用多重尾巴,但这似乎是由于误解造成的。上面的示例显示了如何使用任意命令,并且常规的shell扩展也可以工作multitail <(ssh …) <(ssh …)-允许期望的结果,即使这并不是他们最初认为可以回答问题的方式。
克里斯·亚当斯

0

您可以在“辅助日志”中签出。

我创建的Java工具,能够使用SSH读取本地和远程日志文件。使用起来非常简单。

更多说明:https//github.com/pschweitz/insidelog/wiki

只需下载与您的操作系统相对应的版本,即可在Java运行时中执行本机jar发行版(需要Java 8_40或更高版本):

https://github.com/pschweitz/insidelog/releases

您可以找到完整的文档(以及嵌入在Github的页面中)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.