40

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

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

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

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

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

4

10 回答 10

23

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

dsh -Mac -- tail -f /var/log/apache/*.log
  • -a 适用于您在 ~/.dsh/machines.list 中定义的所有机器名称
  • -c 用于tail的并发运行
  • -M 将主机名添加到每一行输出。
于 2010-08-13T17:36:32.480 回答
14

我们使用一个简单的 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
于 2008-10-02T19:02:31.307 回答
5

Logscape - 就像没有价格标签的 splunk

于 2012-10-12T12:26:16.520 回答
2

选项:

  1. 使用 SocketAppender 将所有日志直接发送到 1 个服务器。(这可能会严重影响性能并增加单点故障。)
  2. 使用脚本聚合数据。我使用 scp、ssh 和身份验证密钥来允许我的脚本在没有任何登录提示的情况下从所有服务器获取数据。
于 2008-09-18T12:41:50.423 回答
2

多尾

" chip是一款面向系统管理员和开发者的本地和远程日志解析和监控工具。
它把 swatch、tee、tail、grep、ccze 和 mail 的功能封装成一个,并带有一些附加功能"

例如。

芯片 -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 "运行 |==> /"

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

于 2012-04-09T16:29:16.380 回答
2

我正是为此目的编写了 vsConsole——轻松访问日志文件——然后添加了应用程序监控和版本跟踪。想知道您对此有何看法。http://vs-console.appspot.com/

于 2013-02-14T09:37:04.677 回答
1

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

于 2008-09-17T15:00:15.840 回答
1

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

于 2010-01-15T05:58:43.633 回答
1

gltail - 使用来自多个服务器的 Ruby、SSH 和 OpenGL 实时可视化服务器流量、事件和统计信息

于 2010-06-25T07:47:25.167 回答
1

用于 Java 的XpoLog

于 2012-02-15T13:52:15.667 回答