gpt4 book ai didi

go - 如何重复关机并建立go routine?

转载 作者:数据小太阳 更新时间:2023-10-29 03:03:16 26 4
gpt4 key购买 nike

各位,我是 golang 的新手。我想从我的 application.cuz 回滚机制生成的日志文件中获取数据,我遇到了一些问题。例如,我的目标日志文件是 chats.log ,它将重命名为 chats.log.2018xxx 并创建一个新的 chats.log。所以我读取日志文件的 go 例程将失败工作。所以我需要检测变化并关闭以前的 go 例程,然后建立新的 go 例程。

我寻找可以帮助我的模块,我找到了

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
}

我使用 fsnotify 来 detech 更改,并确保文件的事件是我的日志文件,然后将一些消息发送到 channel 。

这是我的工作程序:

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
}

我使用tail模块读取日志文件,并在其中添加了一个完成 channel 以关闭循环(我不知道我是否放置正确)我会将每个日志内容发送到一个 channel 以供使用。那么问题来了:我应该如何将它们组合在一起?

ps: 实际上,我可以使用一些工具来完成这项工作。比如apache-flume,但是所有这些工具都需要依赖。非常感谢!

最佳答案

这是一个完整的示例,它在文件更改或删除和重新创建时重新加载和重新读取文件:

package main

import (
"github.com/fsnotify/fsnotify"
"io/ioutil"
"log"
)

const filename = "myfile.txt"

func ReadFile(filename string) string {
data, err := ioutil.ReadFile(filename)
if err != nil {
log.Println(err)
}
return string(data)
}

func main() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
err = watcher.Add("./")
if err != nil {
log.Fatal(err)
}
for {
select {
case event := <-watcher.Events:
if event.Op == fsnotify.Create && event.Name == filename {
log.Println(ReadFile(filename))
}
case err := <-watcher.Errors:
log.Println("error:", err)
}
}
}

请注意,这不需要 goroutine、 channel 或 WaitGroup。最好让事情保持简单,并在实际需要时保留它们。

关于go - 如何重复关机并建立go routine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49932219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com