如何重复关机并建立go例行程序?
每个人,我都是golang的新手。我想从我的应用程序生成的日志文件中获取数据。由于回滚机制,我遇到了一些问题。例如,我的目标日志文件是chats.log,它将重命名为chats.log.2018xxx,并将创建一个新的chats.log。因此,我读取日志文件的go例程将无法工作。 因此,我需要检测变化并关闭以前的go例程,然后建立新的go例程 我寻找可以帮助我的模块,我发现如何重复关机并建立go例行程序?,go,Go,每个人,我都是golang的新手。我想从我的应用程序生成的日志文件中获取数据。由于回滚机制,我遇到了一些问题。例如,我的目标日志文件是chats.log,它将重命名为chats.log.2018xxx,并将创建一个新的chats.log。因此,我读取日志文件的go例程将无法工作。 因此,我需要检测变化并关闭以前的go例程,然后建立新的go例程 我寻找可以帮助我的模块,我发现 func ExampleNewWatcher(fn string, createnoti chan string, wg
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
}
func示例newwatcher(fn字符串、createnoti chan字符串、wg sync.WaitGroup){
工作组.添加(1)
推迟工作组完成()
观察者,错误:=fsnotify.NewWatcher()
如果错误!=零{
log.Fatal(错误)
}
延迟观察者。关闭()
完成:=制作(陈波)
go func(){
为了{
挑选{
案例事件:=下面是一个完整的示例,在文件更改或删除并重新创建时重新加载和读取文件:
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)
}
}
}
主程序包
进口(
“github.com/fsnotify/fsnotify”
“io/ioutil”
“日志”
)
const filename=“myfile.txt”
func ReadFile(文件名字符串)字符串{
数据,err:=ioutil.ReadFile(文件名)
如果错误!=零{
log.Println(错误)
}
返回字符串(数据)
}
func main(){
观察者,错误:=fsnotify.NewWatcher()
如果错误!=零{
log.Fatal(错误)
}
延迟观察者。关闭()
err=watcher.Add(“./”)
如果错误!=零{
log.Fatal(错误)
}
为了{
挑选{
案例事件:=下面是一个完整的示例,在文件更改或删除并重新创建时重新加载和读取文件:
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)
}
}
}
主程序包
进口(
“github.com/fsnotify/fsnotify”
“io/ioutil”
“日志”
)
const filename=“myfile.txt”
func ReadFile(文件名字符串)字符串{
数据,err:=ioutil.ReadFile(文件名)
如果错误!=零{
log.Println(错误)
}
返回字符串(数据)
}
func main(){
观察者,错误:=fsnotify.NewWatcher()
如果错误!=零{
log.Fatal(错误)
}
延迟观察者。关闭()
err=watcher.Add(“./”)
如果错误!=零{
log.Fatal(错误)
}
为了{
挑选{
case event:=实际上什么都没有。这只是从原始示例复制过来的。显然,作者这样做是为了阻止代码完成,因为在这种情况下,为什么ExampleNewWatcher
函数中有一个goroutine。是的,我想说作者不需要goroutine、channels或waitgroupl、 最好保持简单。但是我不想重写代码来提前删除它…谢谢你的时间,因为我想以后在代码中做多个工作。当我阅读tail模块的源代码时。我发现有重新打开配置将检测文件是否被删除或删除,并尝试重新打开该文件。我想咨询你的建议ice,我在tailer函数中设置了一个done频道。我用对了吗?@Rwang我不这么认为,我认为当你发送done
信号时,会终止另一个ExampleNewWatcher
goroutine,这看起来像是在第一次编辑后发生的。你不想无限期地继续查看该文件吗?我也不想I don’我不明白为什么你需要告诉文件观察者你已经完成了对文件的处理。正如我所演示的那样,它只会触发处理功能。除非你要观察的目录中有多个文件正在更改,但可能我误解了这个问题:)实际上什么都没有。这只是从原始e例如。显然,作者这样做是为了阻止代码完成,因为在这种情况下,为什么ExampleNewWatcher
函数中会有一个goroutine。是的,我想说作者不需要goroutine、channels或waitgroup。最好保持简单。但是我不想将代码重写为早些删除它…谢谢你的时间,因为我想以后在代码中做多个工作。当我阅读tail模块的源代码时,我发现有一个reopen config将检测文件是否被删除或删除,并尝试重新打开该文件。我想咨询你的建议,我在tailer函数中放置了一个done通道。我用对了吗?@Rwang我不这么认为,我认为当您发送done
信号时,会终止另一个ExampleNewWatcher
goroutine,这似乎会在第一次编辑后发生。您不想无限期地继续查看该文件吗?我也不明白为什么您需要告诉文件查看者您已完成对fi的处理如我所演示的,它可以触发处理功能。除非您想查看的目录中有多个文件正在更改,但可能我误解了问题:)