分布式日志系统02-构建日志监控模块

安装tail库:

1
go get github.com/hpcloud/tail

linux中的tail命令⽤途是依照要求将指定的⽂件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案⽂件的最后⼏⾏显示到终端上,假设该档案有更新,tail会⾃⼰主动刷新,确保你看到最新的档案内容。

处理流程

⾸先初始化配置结构体config
调⽤TailFile函数,并传⼊⽂件路径和config,返回有个tail的结构体,tail结构体的Lines字段封装了拿到的信息

遍历tail.Lnes字段,取出信息(注意这⾥要循环的取,因为tail可以实现实时监控)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
模拟日志输出
-path 日志路径
-line 日志行数
-interval 日志间隔打印时间,单位ms
*/

package main



import (

    "bufio"

    "flag"

    "fmt"

    "os"

    "sync"

    "time"

)



func writeLog(logpath string, logline int, interval int, wg *sync.WaitGroup) {

    fmt.Println("write log file: ", logpath)

    defer func() {

        fmt.Println("writeLog done ")

        wg.Done()

    }()

    filew, err := os.OpenFile(logpath, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)

    if err != nil {

        fmt.Println("open file error ", err.Error())

        return

    }



    w := bufio.NewWriter(filew)

    for i := 0; i < logline; i++ {

        timeStr := time.Now().Format("2006-01-02 15:04:05")

        logStr := "Hello current time is " + timeStr

        fmt.Fprintln(w, logStr) // 写入日志

        fmt.Println(logStr)     // 也在终端打印出来

        time.Sleep(time.Millisecond * time.Duration(interval))

        w.Flush()

    }

}



// go run writelog.go -path="logxx.txt" -line=20 -interval=500

func main() {

    var logpath string // log的路径

    flag.StringVar(&logpath, "path", "log.txt", "log path")

    var logline *int // 模拟log的函数

    logline = flag.Int("line", 20, "log line")

    var interval *int // 多久打印一行

    interval = flag.Int("interval", 500, "interval time of write line (ms)")

    // [必须调用]从 arguments 中解析注册的 flag

    flag.Parse()



    fmt.Printf("path:%s, line:%d, interval:%d\n", logpath, *logline, *interval)

    wg := &sync.WaitGroup{}

    wg.Add(1)

    go writeLog(logpath, *logline, *interval, wg)

    wg.Wait()

    fmt.Println("main finish")

}

上次更新 2025-11-06