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

时间:2020-03-05 18:58:59  来源:igfitidea点击:

我需要一种简单的方法来监视分布在许多HP-UX服务器上的多个文本日志文件。它们是来自多个分布式旧系统的文本和XML日志文件的混合。当前,我们仅使用SSH到服务器并使用tail -f和grep,但是当我们需要跟踪许多日志时,这种方法无法扩展。

由于日志的格式不同,只是文件夹中的文件(当它们达到特定大小时会自动旋转),所以我既需要远程收集它们,又要分别解析每个文件。

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

如果要以这种方式实现,应该尝试转换为哪种日志格式?

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

解决方案

回答

Awstats提供了一个perl脚本,该脚本可以将多个apache日志文件合并在一起。该脚本可以很好地扩展,因为内存占用非常少,日志文件永远不会加载到内存中。
我知道这并不是我们真正需要的,但是也许我们可以从此脚本开始并使其适应需求。

回答

选项:

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

回答

我们使用一个简单的shell脚本,如下所示。显然,我们必须对其进行一些微调以告知它不同的文件名,并确定要在哪个框上查找哪个文件名,但是我们有了基本的想法。在我们的案例中,我们将文件拖到多个盒子的相同位置。这要求通过存储的密钥而不是输入密码来进行ssh身份验证。

#!/bin/bash
FILE=
for box in box1.foo.com box2.foo.com box3.foo.com box4.foo.com; do
     ssh $box tail -f $FILE &
done

关于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 /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

回答

我们可以使用链锯提供的各种接收器(VFSLogFilePatternReceiver通过ssh,SocketReceiver,UDPReceiver,CustomSQLDBReceiver等对文件进行尾处理),然后通过更改默认选项卡标识符或者通过提供"创建自定义表达式logpanel",将日志聚合到单个选项卡一个与各个"源"选项卡中的事件匹配的表达式。

回答

使用多个服务器上的Ruby,SSH和OpenGL对服务器流量,事件和统计信息进行实时可视化

回答

实时日志监视的最轻量级解决方案可能是在并发模式下使用带有-f尾部的Dancer's shell:

dsh -Mac -- tail -f /var/log/apache/*.log
  • -a用于我们在〜/ .dsh / machines.list中定义的所有计算机名称。
  • -c用于并发运行tail
  • -M将主机名添加到输出的每一行。