流式传输远程日志文件的有效方法

时间:2012-10-16 09:29:24

标签: java logging remoting

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

由于我不在Java世界的家中,我想请教一下如何才能最好地实现这一目标。

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

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

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

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

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

如果无法做到这一点,请通过tail -f <logfile>运行ssh(正如Vicent在其他答案中建议的那样)。 See this question用于Java的SSH库,如果您不想使用ProcessBuilder

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

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

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