【问题标题】:How to tail follow file but only output new entries to the log如何尾随文件但仅将新条目输出到日志
【发布时间】:2022-01-26 10:59:29
【问题描述】:

我正在尝试使用 go 执行类似于 tail -f 的操作(打开文件并继续跟踪文件更改),但仅从文件末尾开始打印更改。我需要寻找文件的结尾,但我不知道该怎么做。我正在查看 io.Seeker 但还没有找到方法。

package main

import (
    "fmt"

    "github.com/nxadm/tail"
)

var logFile = "/var/log/syslog"

func main() {
    t, err := tail.TailFile(logFile, tail.Config{
     Follow: true, 
     // Location: // somehow indicate it's the end of the file?
    })
    if err != nil {
        panic(err)
    }

    for line := range t.Lines {
        fmt.Println(line.Text)
    }
}

上面的代码中缺少什么跳转到文件末尾?

这是我得到上述示例的source

【问题讨论】:

  • 这能回答你的问题吗? Reading log files as they're updated in Go
  • 我不太明白你的问题:如果你使用外部包来tail -f 一个文件,那么使用该包的 API 的适当功能 如果它有它. 如果没有,您基本上必须找到更好的包或自己推出另一个实现,在后一种情况下,您将不会遇到麻烦,因为*os.File 寻找文件末尾 - 什么是由os 打开文件的函数返回——100% 支持查找。
  • @kostix 我是 golang 的新手,所以我问这个问题是为了知道我是否误解了库,或者是否有一些实现已经跳到最后。如果您知道更好的软件包或推出自己的解决方案,那将很有帮助。
  • @rustyx 感谢您的回复,该链接上的解决方案输出了完整的日志,然后开始跟踪。我不希望这样,因为日志可能很大,我只需要在开始跟踪后获取新数据。那,或者我误解了包文档。

标签: file go tail


【解决方案1】:

我在repo上搜索了SeekInfo,找到了解决办法:Location: &tail.SeekInfo{Offset: 0, Whence: io.SeekEnd}

完整示例:

package main

import (
    "fmt"
    "io"

    "github.com/nxadm/tail"
)

var logFile = "/var/log/syslog"

func main() {
    t, err := tail.TailFile(logFile, tail.Config{
     Follow: true, 
     Location: &tail.SeekInfo{Offset: 0, Whence: io.SeekEnd}, // <- line changed
    })
    if err != nil {
        panic(err)
    }

    for line := range t.Lines {
        fmt.Println(line.Text)
    }
}

【讨论】:

  • 好吧,基本上我是来这里发表评论的。您的方法的问题在于您没有阅读 API 文档,否则您会立即找到调整 Config 中的起点的可能性。看起来您刚刚复制并粘贴了一个示例。那不是所谓的软件工程。阅读有关您将要使用的文档的文档是一项基本技能。请不要冒犯;发展这项技能将在未来拯救你的脖子不止一个。
  • 我发现代码不是在 API 上,而是在存储库的某个随机文件上。我什至将 Location 注释在初始代码上,因为我阅读了 API。我只是想要一个不是真正工程的班轮。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2015-05-05
相关资源
最近更新 更多