我如何从一个大的日志文件中读取最后两行而不将其完全加载到内存中?
我需要每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) } }