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

时间:2008-09-17 14:21:40

标签: logging log4j monitoring distributed

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

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

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

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

还有其他更简单的方法吗?我是否应该尝试将日志文件转换为log4j格式以与Chainsaw一起使用,或者是否有更好的日志查看器可以连接到远程套接字?我可以按BareTail中的建议使用another log question吗?这不是massivly distributed system,并且更改当前日志记录实现以使所有应用程序使用UDP广播或将消息放在JMS队列上不是一种选择。

10 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分: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

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

答案 2 :(得分:5)

Logscape - 像没有价格标签的splunk

答案 3 :(得分:2)

选项:

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

答案 4 :(得分:2)

multitail

chip是系统管理员和开发人员的本地和远程日志解析和监控工具 它将swatch,tee,tail,grep,ccze和mail的功能整合到一个中,并添加一些额外内容“

例如

chip -f -m0 ='RUN'-s0 ='red'-m1 ='。*' - s1 user1 @ remote_ip1:'/ var / log / log1 / var / log / log2 / var / log / log3 user2 @ remote_ip2:'/ var / log / log1 / var / log / log2 / var / log / log3''| egrep“RUN | ==> /”

这将以红色突出显示-m0模式的出现, 预过滤'RUN | ==> /'来自所有日志文件的模式。

答案 5 :(得分:2)

我为了这个目的而编写了vsConsole--轻松访问日志文件 - 然后添加了应用程序监控和版本跟踪。想知道你对它的看法。 http://vs-console.appspot.com/

答案 6 :(得分:1)

Awstats提供了一个可以将多个apache日志文件合并在一起的perl脚本。此脚本可以很好地扩展,因为内存占用非常低,日志文件永远不会加载到内存中。 我知道这不是你所需要的,但也许你可以从这个脚本开始并根据你的需要进行调整。

答案 7 :(得分:1)

您可以使用Chainsaw提供的各种接收器(VFSLogFilePatternReceiver通过ssh,SocketReceiver,UDPReceiver,CustomSQLDBReceiver等来拖尾文件),然后通过更改默认选项卡标识符或创建“自定义表达式logpanel”将日志聚合到单个选项卡中'通过提供与各种源选项卡中的事件匹配的表达式。

答案 8 :(得分:1)

gltail - 使用来自多个服务器的Ruby,SSH和OpenGL实时显示服务器流量,事件和统计信息

答案 9 :(得分:1)

XpoLog for Java