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

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

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)

}

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

查看所有标签

猜你喜欢:

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

交互设计之路

交互设计之路

库帕 / Chris Ding / 电子工业出版社 / 2006-3 / 38.00元

本书是基于众多商务案例,讲述如何创建更好的、高客户忠诚度的软件产品和基于软件的高科技产品的书。本书列举了很多真实可信的实际例子,说明目前在软件产品和基于软件的高科技产品中,普遍存在着“难用”的问题。作者认为,“难用”问题是由这些产品中存在着的高度“认知摩擦”引起的,而产生这个问题的根源在于现今软件开发过程中欠缺了一个为用户利益着想的前期“交互设计”阶段。“难用”的产品不仅损害了用户的利益,最终也将......一起来看看 《交互设计之路》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具