如何重复关闭并建立执行例程?

every one,I am new to golang.I wanna get the data from log file generated by my application.cuz roll-back mechanism, I met some problem.For instance,my target log file is chats.log,it will be renamed to chats.log.2018xxx and a new chats.log will be created.so my go routine that read log file will fail to work. so I need detect the change and shutdown the previous go routine and then establish the new go routine.

I looked for modules that can help me,and I found

func ExampleNewWatcher(fn string, createnoti chan string, wg sync.WaitGroup) {
    wg.Add(1)
    defer wg.Done()
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    done := make(chan bool)
    go func() {
        for {
            select {
            case event := <-watcher.Events:
                if event.Op == fsnotify.Create && event.Name==fn{
                        createnoti <- "has been created"
                }
            case err := <-watcher.Errors:
                log.Println("error:", err)
            }
        }
    }()

    err = watcher.Add("./")
    if err != nil {
        log.Fatal(err)
    }
    <-done
}

I use fsnotify to detech the change,and make sure the event of file is my log file,and then send some message to a channel.

this is my worker go routine:

func tailer(fn string,isfollow bool, outchan chan string, done <-chan interface{},wg sync.WaitGroup) error {
    wg.Add(1)
    defer wg.Done()
    _, err := os.Stat(fn)
    if err != nil{
        panic(err)
    }
    t, err := tail.TailFile(fn, tail.Config{Follow:isfollow})
    if err != nil{
        panic(err)
    }
    defer t.Stop()

    for line := range t.Lines{
        select{
        case outchan <- line.Text:
            case <- done:
                return nil
        }
    }

    return nil
}

I using tail module to read the log file,and I add a done channel to it to shutdown the cycle(I don't know whether I put it in the right way) And I will send every log content to a channel to consuming it. So here is the question:how should I put it together?

ps: Actually,I can use some tool to do this job.like apache-flume,but all of those tools need dependency. Thank you a lot!

查看全部
douzhi9921
douzhi9921
2018/04/20 00:41
  • it技术
  • 互联网问答
  • IT行业问题
  • 编程语言问答
  • 计算机技术
  • 点赞
  • 收藏
  • 回答
    私信
满意答案
查看全部

1个回复