私はgolangにいくつかのログアナライザを作成しています。私が必要とするのは、新しく作成されたファイルのリアルタイムtail -fです。現在のテールを中断して新しいものを開始する
私はfsnotifyパッケージと共にテールパッケージを使用していますが、私はチャネルやルーチンをあまりよく知らないので、何か助けが必要です。
現在、プログラムは次のようになります。
package main
import(
"fmt"
"github.com/hpcloud/tail"
"strings"
"log"
"net/smtp"
"time"
"github.com/fsnotify/fsnotify"
)
//this function needs to monitor for new files in directory
func newFileCheck() (newFilename chan string, err error) {
watcher, err := fsnotify.NewWatcher()
if err != nil {
return
}
err = watcher.Add("myDir")
if err != nil {
return
}
newFilename = make(chan string)
// Process events
go func() {
for {
select {
case ev := <-watcher.Events:
log.Println("event:", ev)
newFilename <- ev.Name // Relative path to the file
//t.Stop() //if I pass reference to t THIS IS NOT HAPPENING ?
case err := <-watcher.Errors:
log.Println("error:", err)
}
}
}()
return
}
func main() {
newFileName = "mylog_0000.log.txt"
fmt.Println("Processing log: ",newFileName)
newFilenameChan, err := newFileCheck()
if err != nil {
fmt.Println("ERR: ",err)
}
t := tailLog(newFileName)
go func() {
for {
select {
case name := <-newFilenameChan:
fmt.Println("New file created: ",name) //this will be printed only once and then on new events nothing is printed ?
//NONE of the lines abowe doesn't work
t.Stop()
t.Dead()
t.Done()
t = tailLog(name)
}
}
}()
}
func tailLog(fileName string) *tail.Tail{
var count = 0
// close the old one and read new file
t, err := tail.TailFile("/mydir/"+fileName, tail.Config{Follow: true, ReOpen: true})
for line := range t.Lines {
//fmt.Println("Line is:", line.Text)
//check do we have what we need
if strings.Contains(strings.ToLower(line.Text), "mfc"){
count++
//do other stuff
}
}
fmt.Println(err)
return t
}
newFileCheck機能のみ拳時間のイベントを印刷し、そしてまた、私はアクティブな尾をキャンセルする方法を見つけ出すことができないんだけど、なぜだから私は把握することはできません新しいイベントが発生したら、そのイベントの後に再びテールを開始しますか?
ここに投稿する前に必ず 'go fmt'を使ってコードを実行する必要があります。これは、回答が得られる可能性が高くなるからです。ドキュメントの隣に –