如何每10秒从Go中读取大文件的最后几行

我如何从一个大的日志文件中读取最后两行而不将其完全加载到内存中?

我需要每10秒钟阅读一次(在Win机上)…并且我被困在尝试阅读最后几行。

package main

import (

"fmt"

"time"

"os"

)

const MYFILE = "logfile.log"

func main() {

c := time.Tick(10 * time.Second)

for now := range c {

readFile(MYFILE)

}

}

func readFile(fname string){

file, err:=os.Open(fname)

if err!=nil{

panic(err)

}

buf:=make([]byte, 32)

c, err:=file.ReadAt(32, ????)

fmt.Printf("%s\n", c)

}

日志文件类似于:

07/25/2013 11:55:42.400, 0.559

07/25/2013 11:55:52.200, 0.477

07/25/2013 11:56:02.000, 0.463

07/25/2013 11:56:11.800, 0.454

07/25/2013 11:56:21.600, 0.424

07/25/2013 11:56:31.400, 0.382

07/25/2013 11:56:41.200, 0.353

07/25/2013 11:56:51.000, 0.384

07/25/2013 11:57:00.800, 0.393

07/25/2013 11:57:10.600, 0.456

谢谢!

回答:

您可以使用file.Seek()或file.ReadAt()几乎结束,然后向前阅读。除非您知道2行=

x字节,否则您只能估计从哪里开始搜索。

您可以使用os.Stat(name)获得文件长度

这是一个基于ReadAt,Stat和示例日志文件的示例:

package main

import (

"fmt"

"os"

"time"

)

const MYFILE = "logfile.log"

func main() {

c := time.Tick(10 * time.Second)

for _ = range c {

readFile(MYFILE)

}

}

func readFile(fname string) {

file, err := os.Open(fname)

if err != nil {

panic(err)

}

defer file.Close()

buf := make([]byte, 62)

stat, err := os.Stat(fname)

start := stat.Size() - 62

_, err = file.ReadAt(buf, start)

if err == nil {

fmt.Printf("%s\n", buf)

}

}

以上是 如何每10秒从Go中读取大文件的最后几行 的全部内容, 来源链接: utcz.com/qa/430417.html

回到顶部