从多个服务器聚合多个日志文件的最佳方法

Cla*_*ren 40 logging monitoring distributed log4j

我需要一种简单的方法来监视分布在许多HP-UX服务器上的多个文本日志文件.它们是来自多个分布式遗留系统的文本和XML日志文件的混合.目前我们只是ssh到服务器并使用tail -fgrep,但是当你有许多日志要跟踪时,这不会扩展.

由于日志采用不同的格式,文件只是文件夹(当达到一定大小时自动旋转),我需要远程收集它们并以不同的方式解析每个文件.

我最初的想法是创建一个简单的守护进程,我可以在每个服务器上运行每个文件类型的自定义文件阅读器,将其解析为可以通过套接字通过网络导出的通用格式.在本地运行的另一个查看器程序将连接到这些套接字,并在一些简单的选项卡式GUI中显示已解析的日志或聚合到控制台.

如果我以这种方式实现它,我应该尝试转换为什么日志格式?

还有其他更简单的方法吗?我是否应该尝试将日志文件转换为log4j格式以与Chainsaw一起使用,或者是否有更好的日志查看器可以连接到远程套接字?我可以按照另一个日志问题的建议使用BareTail吗?这不是一个大规模分布式系统,并且不能将所有应用程序的当前日志记录实现更改为使用UDP广播或将消息放在JMS队列上.

mrm*_*mrm 21

对于实时日志监视来说,最轻量级的解决方案可能是使用带有tail -f的并发模式的Dancer shell:

dsh -Mac -- tail -f /var/log/apache/*.log
Run Code Online (Sandbox Code Playgroud)
  • -a适用于您在〜/ .dsh/machines.list中定义的所有计算机名称
  • -c用于并发运行尾部
  • -M将主机名添加到每行输出.

  • 电脑赞助 (2认同)

mas*_*omi 12

我们使用一个简单的shell脚本,如下所示.显然,你必须稍微调整一下,告诉它有关不同的文件名,并决定在哪个框中查找哪个,但你得到了基本的想法.在我们的例子中,我们在多个框的同一位置拖尾文件.这需要通过存储的密钥进行ssh身份验证,而不是输入密码.

#!/bin/bash
FILE=$1
for box in box1.foo.com box2.foo.com box3.foo.com box4.foo.com; do
     ssh $box tail -f $FILE &
done
Run Code Online (Sandbox Code Playgroud)

关于Mike Funk关于无法使用^ C终止尾随的评论,我将上述内容存储在名为multitails.sh的文件中,并将以下内容添加到其末尾.这会创建一个kill_multitails.sh文件,当你完成拖尾时会运行该文件,然后它会自行删除.

# create a bash script to kill off 
# all the tails when you're done
# run kill_multitails.sh when you're finished

echo '#!/bin/sh' > kill_multitails.sh
chmod 755 kill_multitails.sh
echo "$(ps -awx | grep $FILE)" > kill_multitails_ids
perl -pi -e 's/^(\d+).*/kill -9 $1/g' kill_multitails_ids
cat kill_multitails_ids >> kill_multitails.sh
echo "echo 'running ps for it'" >> kill_multitails.sh
echo "ps -awx | grep $FILE" >> kill_multitails.sh
echo "rm kill_multitails.sh" >> kill_multitails.sh
rm kill_multitails_ids


wait
Run Code Online (Sandbox Code Playgroud)


小智 5

Logscape - 像没有价格标签的splunk


Jam*_*fer 2

选项:

  1. 使用 SocketAppender 将所有日志直接发送到 1 个服务器。(这可能会严重影响性能并增加单点故障。)
  2. 使用脚本来聚合数据。我使用 scp、ssh 和身份验证密钥来允许我的脚本从所有服务器获取数据,而无需任何登录提示。