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

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

由于日志格式不同,只是文件夹中的文件(达到一定大小时会自动旋转),因此我需要远程收集这些日志,并对每个日志文件进行不同的parsing。

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

如果我要这样实现,应该尝试使用哪种日志格式?

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

选项:

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

用于实时日志观看的最轻重量解决scheme可能是使用舞者的shell并发模式,尾巴-f:

dsh -Mac -- tail -f /var/log/apache/*.log 
  • -a适用于在〜/ .dsh / machines.list中定义的所有机器名称
  • -c是尾部并发运行
  • -M将主机名前置到每行输出。

我们使用一个简单的shell脚本,如下所示。 显然,你必须稍微调整一下,告诉它关于不同的文件名,并决定哪个盒子在哪里,但是你得到了基本的想法。 在我们的例子中,我们在多个盒子上的相同位置拖尾文件。 这需要通过存储密钥进行sshauthentication,而不是input密码。

 #!/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的文件中,并在其后面加上以下内容。 这会创build一个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 

Logscape – 像没有价格标签的splunk

多发或者

“ 芯片是系统pipe理员和开发人员的本地和远程日志parsing和监控工具。
它将swatch,tee,tail,grep,ccze和mail的function封装成一个,附带一些额外的“

例如。

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 | ==> /”模式。

我为此写了vsConsole – 轻松访问日志文件 – 然后添加应用程序监视和版本跟踪。 想知道你怎么想的。 http://vs-console.appspot.com/

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

您可以使用Chainsaw提供的各种接收器(VFSLogFilePatternReceiver通过ssh,SocketReceiver,UDPReceiver,CustomSQLDBReceiver等方式对文件进行尾部处理),然后通过更改默认选项卡标识符或创build“自定义expression式日志面板”一个与各种源标签中的事件相匹配的expression式。

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

XpoLog for Java