2

我正在寻找一种方法来读取远程 unix 主机上快速增长的日志文件。
日志文件偶尔会得到一个日志开关(例如再次从 0 字节开始)。我不能直接在远程主机上处理日志文件的原因是处理器给主机施加了太多负载,这是绝对不能发生的。所以我需要在两个不同的主机上进行处理和读取。

由于我不熟悉 Java 世界,我想请教如何最好地实现这一点。

到目前为止我的想法:
让本地日志文件处理器(localhost)将日志文件读取器(java 二进制文件)scp 到远程主机并启动它(通过本地日志文件处理器启动的 ssh 连接)。然后日志文件读取器开始读取/跟踪日志文件并将其作为 TCP 流提供(然后可以由本地日志文件处理器读取)。

我很确定还有更优雅的 javastyle 方法。感谢您的任何提示。

4

2 回答 2

9

如果您可以在远程主机上运行 ssh,那么您可以使用

ssh <remote host> "tail -f <remote log file name>" > <local log file name>

这会将写入远程日志文件名的任何内容重定向到本地文件名。如果远程文件被删除,您会收到一条消息,指出远程文件已被截断。

于 2012-10-16T09:52:22.320 回答
1

如果您需要在线阅读日志文件(即消息进入时),我建议检查通过 TCP 提供消息的方法,而不是(或另外)将它们写入文件。

如果远程应用程序使用日志框架,那么这通常只是配置中的几行。

这也将减少远程主机上的负载,因为它不再需要将任何数据写入磁盘。但这通常只有在远程进程大量访问磁盘以完成工作时才会出现问题。如果远程进程与数据库进行大量对话,这可能会适得其反,因为日志消息将与数据库查询竞争网络资源。

从积极的方面来说,这样可以更轻松地确保您最多处理每条日志消息(如果重新启动本地侦听器,您可能会丢失一些消息)。

如果那不可能,请tail -f <logfile>通过ssh(如 Vicent 在另一个答案中建议的那样)运行。如果您不想使用ProcessBuilder.

当您阅读这些文件时,最艰巨的任务是确保您只处理每条日志消息一次(即您不会遗漏任何消息并且您不会两次处理它们)。根据日志轮换的工作方式以及远程进程如何创建日志文件,您可能会在切换它们时丢失几条消息。

如果您不需要在线处理(即查看昨天的消息就足够了),请尝试rsync复制远程文件夹。rsync非常擅长避免重复传输,并且可以正常工作ssh。这将为您提供您可以处理的所有日志文件的本地副本。当然,rsync处理活动日志文件的成本太高,所以这是您无法检查的文件(因此限制,只有在您不需要在线处理时才有可能

最后一个提示:尽量避免传输无用的日志消息。通常可以通过在传输之前使用非常简单的脚本过滤日志文件来多次减少负载。

于 2012-10-16T13:44:11.473 回答