【问题标题】:Monitor A File For Additions And Get Last Added Line监视文件的添加并获取最后添加的行
【发布时间】:2016-12-01 22:48:16
【问题描述】:

我无法监控文件的更改。我需要能够知道文件何时更改,何时更改,我需要添加的新行。我打算解析每一行并找到符合某些条件的行,并根据这些行中的信息采取行动。我提前知道预期的匹配行数,但我不知道总共将添加多少行到文件中,也不知道匹配行将在哪里。

到目前为止,我已经尝试了 2 个包,但均无济于事。

fsnotify/fsnotify

据我所知,fsnotify 只能告诉我何时文件被修改,而不能告诉我修改的细节是什么。因为我需要知道文件中到底添加了什么,所以这对我没有好处。

(作为一个附带问题,这可以循环运行吗?我尝试的示例仅在一次修改后退出。我需要监视多个修改。)

hpcloud/tail

这个包试图模仿 Unix 的 tail 命令,但它似乎有自己的问题。我得到的输出包括时间戳和其他数据——我只想要添加的行,没有别的。此外,它似乎认为一个文件已被多次修改,即使它只是一次编辑。此外,这里的交易破坏者是如果该行后面没有换行符,它不会输出最后一行。

委派给tail

我遇到了this 的答案,它建议将这项工作委托给tail 命令本身,但我需要它才能跨平台工作(特别是 macOS、Linux 和 Windows)。我不相信 Windows 上存在等效命令。

我该如何解决这个问题?

【问题讨论】:

  • hpcloud/tail 的额外信息有什么问题?你仍然会得到附加的数据。
  • @JimB 这并不理想,但我可以解决它。我不能使用hpcloud/tail 的主要原因是因为如果没有换行符,它不会输出最后一行。
  • 你当然可以使用 fsnotify,你只需根据收到的通知按需读取文件。我不知道用 Go 编写的更好的完整“tail -f”包(但场外推荐无论如何都是题外话)
  • 查看stackoverflow.com/questions/31120987/… 以获得简单的解决方案。当应用程序监控少量文件并且可以容忍一点延迟时,它运行良好。
  • @JimB 感谢您为我指明了正确的方向。我最终使用fsnotifygo-difffsnotify 发现更改时仅获取最后一行。如果您想写您的评论作为答案,我可以接受。

标签: go tail


【解决方案1】:

@user2515526,

通常更改的 diff 超出了文件观察程序的功能范围,因为,您知道,您可以更改图像,并且观察程序需要在内存中跟踪几 Mb 的 diff,如果我们有数千文件? 但是,尽管听起来很糟糕,但这可能正是您想要实现的方式(当然,取决于您的应用程序等 - 可能适用于文本文件),即 - 保留差异图(每个文件 1 个差异) 自上次修改以来。不能说我喜欢它,但听起来 fsnotify 不支持您需要的更改/差异。

另外,关于你关于循环运行的问题,也许你可以在这里得到一些提示:https://github.com/kataras/iris/blob/8370d76910cdd8de043753ed81ae080eae8dc798/utils/file.go 它是一个框架,允许构建一个监视 TypeScript 文件更改的服务器。所以听起来与您的案例/问题相似。

干杯, -D

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 2017-05-16
    • 2016-07-22
    • 2016-05-25
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多