go 文件读取和文件实时监控

栏目: Go · 发布时间: 7年前

package main

import (
    "bufio"
    "io"
    "io/ioutil"
    "log"
    "os"
    "time"
)

// 一次性读取
func ReadAll(filePth string) ([]byte, error) {
    f, err := os.Open(filePth)
    if err != nil {
        return nil, err
    }
    defer f.Close()
    /*
    ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。
    成功的调用返回的err为nil而非EOF。
    因为本函数定义为读取r直到EOF,它不会将读取返回的EOF视为应报告的错误。
     */
    return ioutil.ReadAll(f)
}

// 分块读取 可在速度和内存占用之间取得很好的平衡。
func ReadBlock(filePth string, bufSize int, hookfn func([]byte)) error {
    f, err := os.Open(filePth)
    if err != nil {
        return err
    }
    defer f.Close()

    buf := make([]byte, bufSize) //一次读取多少个字节
    /*
    NewReader创建一个具有默认大小缓冲、从r读取的*Reader。
     */
    bfRd := bufio.NewReader(f)
    for {
        n, err := bfRd.Read(buf)
        hookfn(buf[:n]) // n 是成功读取字节数

        if err != nil { //遇到任何错误立即返回,并忽略 EOF 错误信息
            if err == io.EOF {
                return nil
            }
            return err
        }
    }

    return nil
}

// 输出到控制台
func processTask(line []byte) {
    os.Stdout.Write(line)
    //fmt.Println(string(line))
}

// 逐行读取
func ReadLine(filePth string, hookfn func([]byte)) error {
    f, err := os.Open(filePth)
    if err != nil {
        return err
    }
    defer f.Close()

    bfRd := bufio.NewReader(f)
    for {
        line, err := bfRd.ReadBytes('\n')
        hookfn(line)
        if err != nil {
            if err == io.EOF {
                return nil
            }
            return err
        }
    }
    return nil
}

// 文件监控
func FileMonitoring(filePth string, hookfn func([]byte)) {
    f, err := os.Open(filePth)
    if err != nil {
        log.Fatalln(err)
    }
    defer f.Close()

    rd := bufio.NewReader(f)
    f.Seek(0, 2)
    for {
        line, err := rd.ReadBytes('\n')
        // 如果是文件末尾不返回
        if err == io.EOF {
            time.Sleep(500 * time.Millisecond)
            continue;
        } else if err != nil {
            log.Fatalln(err)
        }
        go hookfn(line)
    }

}
func main() {

    /*
    一次性读取
     */

    // 直接读取文件,无需打开句柄
    /*
    ret,err:=ioutil.ReadFile("/usr/local/nginx/logs/access.log")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(ret))
    */

    // 一次性读取
    /*
    ret, err := ReadAll("/usr/local/nginx/logs/access.log")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(ret))
    */

    // 分块读取
    /*
    ReadBlock("/usr/local/nginx/logs/access.log", 10000, processTask)
    */

    // 逐行读取
    /*
    ReadLine("/usr/local/nginx/logs/access.log", processTask)
    */

    // 示例 日志实时监控
    FileMonitoring("/usr/local/nginx/logs/access.log", processTask)

}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Definitive Guide to HTML5 WebSocket

The Definitive Guide to HTML5 WebSocket

Vanessa Wang、Frank Salim、Peter Moskovits / Apress / 2013-3 / USD 26.30

The browser is, hands down, the most popular and ubiquitous deployment platform available to us today: virtually every computer, smartphone, tablet, and just about every other form factor imaginable c......一起来看看 《The Definitive Guide to HTML5 WebSocket》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具