From 28b350c0a1e32c80bc1307c8f467000bbabe071a Mon Sep 17 00:00:00 2001 From: qydysky Date: Wed, 12 Aug 2020 18:14:46 +0800 Subject: [PATCH] 41 --- Log.go | 146 +++++++++++++++++++++++++++++++++++++++++++++------------ go.mod | 2 +- go.sum | 2 + 3 files changed, 118 insertions(+), 32 deletions(-) diff --git a/Log.go b/Log.go index c588262..177d03d 100644 --- a/Log.go +++ b/Log.go @@ -3,11 +3,16 @@ package part import ( "io" "os" - "log" + "log" + "syscall" ) type logl struct { - file string + fileName string + channelN chan int + channel chan interface{} + wantLog chan bool + waitclose chan bool tracef *log.Logger // 记录所有日志 infof *log.Logger // 重要的信息 warningf *log.Logger // 需要注意的信息 @@ -19,47 +24,126 @@ func Logf() (*logl) { } func (l *logl) New(fileP string) { + l.wantLog = make(chan bool,2) + l.waitclose = make(chan bool) + l.channelN = make(chan int,200) + l.channel = make(chan interface{},200) - File().NewPath(fileP) - - file, err := os.OpenFile(fileP, - os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) - if err != nil { - log.Fatalln("Failed to open error log file:", err) - } + l.fileName = fileP + + go func(){ + for { + <- l.wantLog - l.tracef = log.New(io.MultiWriter(file, os.Stdout), - "TRACE: "+fileP+" ", - log.Ldate|log.Ltime) + if len(l.channel) == 0 {continue} - l.infof = log.New(io.MultiWriter(file, os.Stdout), - "INFO: "+fileP+" ", - log.Ldate|log.Ltime) + fileName := l.fileName + if fileName == "" { + for len(l.channel) != 0 { + i := <- l.channelN + switch i { + case 0: + log.Println("TRACE:",<- l.channel) + case 1: + log.Println("INFO:",<- l.channel) + case 2: + log.Println("WARNING:",<- l.channel) + case 3: + log.Println("ERROR:",<- l.channel) + } + } + continue + } - l.warningf = log.New(io.MultiWriter(file, os.Stdout), - "WARNING: "+fileP+" ", - log.Ldate|log.Ltime) + File().NewPath(fileName) + file, err := os.OpenFile(fileName, + os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + l.E("Failed to open log file:", err) + continue + } - l.errorf = log.New(io.MultiWriter(file, os.Stderr), - "ERROR: "+fileP+" ", - log.Ldate|log.Ltime) - - l.file = fileP + err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX) + if err != nil { + l.E("cannot flock", fileName, err) + file.Close() + continue + } + + l.tracef = log.New(io.MultiWriter(file, os.Stdout), + "TRACE: "+fileName+" ", + log.Ldate|log.Ltime) + + l.infof = log.New(io.MultiWriter(file, os.Stdout), + "INFO: "+fileName+" ", + log.Ldate|log.Ltime) + + l.warningf = log.New(io.MultiWriter(file, os.Stdout), + "WARNING: "+fileName+" ", + log.Ldate|log.Ltime) + + l.errorf = log.New(io.MultiWriter(file, os.Stderr), + "ERROR: "+fileName+" ", + log.Ldate|log.Ltime) + + l.tracef.Println("Log chan",len(l.channel)) + + for len(l.channelN) != 0 { + i := <- l.channelN + switch i { + case -1: + l.fileName = "" + l.waitclose <- true + case 0: + l.tracef.Println(<- l.channel) + case 1: + l.infof.Println(<- l.channel) + case 2: + l.warningf.Println(<- l.channel) + case 3: + l.errorf.Println(<- l.channel) + } + } + + err = syscall.Flock(int(file.Fd()), syscall.LOCK_UN) + if err != nil { + log.Fatalln("cannot Unflock", fileName, err) + } + + file.Close() + + <- l.wantLog + } + }() +} + +func (l *logl) Close(){ + l.fileName = "" +} + +func (l *logl) WClose(){ + l.channelN <- -1 + if len(l.wantLog) ==0 {l.wantLog <- true;l.wantLog <- true} + <- l.waitclose } func (l *logl) T(i ...interface{}){ - if l.file == "" {log.Println("TRACE:",i);return} - l.tracef.Println(i...) + l.channelN <- 0 + l.channel <- i + if len(l.wantLog) ==0 {l.wantLog <- true;l.wantLog <- true} } func (l *logl) I(i ...interface{}){ - if l.file == "" {log.Println("INFO:",i);return} - l.infof.Println(i...) + l.channelN <- 1 + l.channel <- i + if len(l.wantLog) ==0 {l.wantLog <- true;l.wantLog <- true} } func (l *logl) W(i ...interface{}){ - if l.file == "" {log.Println("WARNING:",i);return} - l.warningf.Println(i...) + l.channelN <- 2 + l.channel <- i + if len(l.wantLog) ==0 {l.wantLog <- true;l.wantLog <- true} } func (l *logl) E(i ...interface{}){ - if l.file == "" {log.Println("ERROR:",i);return} - l.errorf.Println(i...) + l.channelN <- 3 + l.channel <- i + if len(l.wantLog) ==0 {l.wantLog <- true;l.wantLog <- true} } \ No newline at end of file diff --git a/go.mod b/go.mod index c26f1b9..2d0e881 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( //github.com/thedevsaddam/gojsonq/v2 v2.5.2 golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect - golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 // indirect + golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed // indirect ) replace github.com/thedevsaddam/gojsonq v2.3.0+incompatible => github.com/thedevsaddam/gojsonq/v2 v2.5.2 diff --git a/go.sum b/go.sum index a3b7dca..332e682 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,8 @@ golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIA golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 h1:yi1hN8dcqI9l8klZfy4B8mJvFmmAxJEePIQQFNSd7Cs= golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed h1:WBkVNH1zd9jg/dK4HCM4lNANnmd12EHC9z+LmcCG4ns= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -- 2.39.2