Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何重复关机并建立go例行程序?_Go - Fatal编程技术网

如何重复关机并建立go例行程序?

如何重复关机并建立go例行程序?,go,Go,每个人,我都是golang的新手。我想从我的应用程序生成的日志文件中获取数据。由于回滚机制,我遇到了一些问题。例如,我的目标日志文件是chats.log,它将重命名为chats.log.2018xxx,并将创建一个新的chats.log。因此,我读取日志文件的go例程将无法工作。 因此,我需要检测变化并关闭以前的go例程,然后建立新的go例程 我寻找可以帮助我的模块,我发现 func ExampleNewWatcher(fn string, createnoti chan string, wg

每个人,我都是golang的新手。我想从我的应用程序生成的日志文件中获取数据。由于回滚机制,我遇到了一些问题。例如,我的目标日志文件是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
}
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的处理如我所演示的,它可以触发处理功能。除非您想查看的目录中有多个文件正在更改,但可能我误解了问题:)