]> 127.0.0.1 Git - part/.git/commitdiff
41
authorqydysky <qydysky@foxmail.com>
Wed, 12 Aug 2020 10:14:46 +0000 (18:14 +0800)
committerqydysky <qydysky@foxmail.com>
Wed, 12 Aug 2020 10:14:46 +0000 (18:14 +0800)
Log.go
go.mod
go.sum

diff --git a/Log.go b/Log.go
index c58826228fd6f8019104f400443358b8e11907dd..177d03d72a818795c708ef4dbe15f11835089b62 100644 (file)
--- 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 c26f1b97a7346fd1a4f7301a1a5050576d4242d7..2d0e88124ab9027cc1949f9163c59a354c601350 100644 (file)
--- 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 a3b7dca45cf7bfcde4dc9e950cef32358aa4130b..332e68296605417432fe529ed9302a3aa38f25b1 100644 (file)
--- 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=