【问题标题】:Tail a text file on a web server via HTTP通过 HTTP 在 Web 服务器上跟踪文本文件
【发布时间】:2011-05-31 14:59:47
【问题描述】:

寻找有关如何解决以下问题的意见。我的 ColdFusion 9 应用程序有一个简单的记录器,可以将文本写入文件。在我的开发机器上,该文件是本地文件,因此我可以使用“tail -f”或 CFB 的 TailView 来观看它。当它部署在生产服务器上时,我想要一个工具来观看它。问题:生产位于共享 CF 托管服务提供商处,它不允许 RDS 文件访问或目录观察器网关。我想知道一个带有元刷新标签的页面,或者如果我想变得更花哨,AJAXy 也能达到同样的效果。想法?任何已经存在的工具?

我可能会对此进行试验,但希望有一些“更完整”的东西:following a log file over http

【问题讨论】:

标签: logging coldfusion shared-hosting tail


【解决方案1】:

您可以使用以下 PHP 脚本:

<?php
header("Content-Type: text/plain");
set_time_limit(0);
passthru("tail -F -n +0 log.txt");
?>

【讨论】:

  • 我在 Mac OS X 上的 /var/log/syslog 上试过这个,在我停止 php 服务器之前,浏览器窗口中什么也没有出现。知道如何定期刷新输出吗?
【解决方案2】:

以下伪代码受this Java solution 启发,完全未经测试:

if (NOT structKeyExists(application, "log") {
    application.log = fileOpen('log.txt', 'read')
}

while(NOT FileisEOF(application.log))  {
    writeOutput(fileReadLine(application.log) & "<br/>");
}

将它放在具有元刷新的页面上,我认为您可能正在做生意。

【讨论】:

  • 谢谢,橙皮。日志文件通常存在一些问题,例如它们很大。我不想为了获取最新的 10 行而重复发送相同的 1MB 数据。我现在正在考虑使用 AJAX 和 HTTP 的 HEAD 请求来查看 Content-Length 的纯粹客户端。如果该值与之前的值不同,请使用 HTTP Range 字段执行 GET 以仅获取更新的数据以附加到 DOM。似乎应该已经存在的东西所以我在谷歌搜索......
  • 您不会重复发送相同的数据,因为文件引用只创建一次并保留在应用程序范围内。所以每次刷新只显示新添加的行。
  • 啊,当然。您认为以上将如何处理日志翻转?
  • @DaveBurns:不会,您需要编写该算法。大概您会知道日志翻转的时间或文件大小。所以fileClose()当前引用并重新创建。此外,如果您的 CF 服务器重新启动,您可能需要考虑在该情况下维护一个行指针,并在该情况下向前迭代到您需要的位置。
【解决方案3】:

我为我的用例创建了以下 bash 脚本 (tail.sh)

它使用“lynx”获取文件列表,从中获取所需的文件大小,并在无限循环中尝试获取文件的一部分

【讨论】:

    【解决方案4】:

    我知道这很老套,但您是否考虑过登录到数据库?如果您为表中的日志条目添加时间戳,您可以使用 HTTP 缓存标头与服务器通信您应该看到哪些新数据。

    【讨论】:

    • 我想到了。记录到数据库是人们喜欢或讨厌的事情之一 - 不知何故它变得虔诚。我是那些觉得它太重的人之一。讨论的好话题 - 谢谢。
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 2014-07-17
    • 2019-12-22
    • 2010-09-05
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多