This commit is contained in:
Akvicor 2024-01-21 21:14:35 +08:00
parent 53e662ab85
commit 436c94704c
3 changed files with 157 additions and 173 deletions

16
.gitignore vendored
View File

@ -1,17 +1 @@
.idea
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/

14
file.go
View File

@ -1,17 +1,17 @@
package glog
import (
"os"
"sync"
"os"
"sync"
)
type File struct {
file *os.File
sync.Mutex
file *os.File
sync.Mutex
}
func (f *File) Write(p []byte) (n int, err error) {
f.Lock()
defer f.Unlock()
return f.file.Write(p)
f.Lock()
defer f.Unlock()
return f.file.Write(p)
}

300
glog.go
View File

@ -1,44 +1,44 @@
package glog
import (
"fmt"
"io"
"os"
"path"
"runtime"
"sync"
"time"
"fmt"
"io"
"os"
"path"
"runtime"
"sync"
"time"
)
const (
MaskUNKNOWN = 1 << iota
MaskDEBUG
MaskTRACE
MaskINFO
MaskWARNING
MaskERROR
MaskFATAL
MaskStdMask = MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
MaskStdAll = MaskUNKNOWN | MaskDEBUG | MaskTRACE | MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
MaskUNKNOWN = 1 << iota
MaskDEBUG
MaskTRACE
MaskINFO
MaskWARNING
MaskERROR
MaskFATAL
MaskStdMask = MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
MaskStdAll = MaskUNKNOWN | MaskDEBUG | MaskTRACE | MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
)
const (
FlagDate = 1 << iota
FlagTime
FlagLongFile
FlagShortFile
FlagPrefix
FlagStdFlag = FlagDate | FlagTime
FlagDate = 1 << iota
FlagTime
FlagLongFile
FlagShortFile
FlagPrefix
FlagStdFlag = FlagDate | FlagTime | FlagPrefix
)
var (
prefixUNKNOWN = "[UNKNOWN] "
prefixDEBUG = "[DEBUG ] "
prefixTRACE = "[TRACE ] "
prefixINFO = "[INFO ] "
prefixWARNING = "[WARNING] "
prefixERROR = "[ERROR ] "
prefixFATAL = "[FATAL ] "
prefixUNKNOWN = "[UNKNOWN] "
prefixDEBUG = "[DEBUG ] "
prefixTRACE = "[TRACE ] "
prefixINFO = "[INFO ] "
prefixWARNING = "[WARNING] "
prefixERROR = "[ERROR ] "
prefixFATAL = "[FATAL ] "
)
var mask = MaskStdAll
@ -50,162 +50,162 @@ var file *File
var lock sync.RWMutex
func init() {
consoleStdout = new(File)
consoleStdout.file = os.Stdout
consoleStderr = new(File)
consoleStderr.file = os.Stderr
file = nil
lock = sync.RWMutex{}
consoleStdout = new(File)
consoleStdout.file = os.Stdout
consoleStderr = new(File)
consoleStderr.file = os.Stderr
file = nil
lock = sync.RWMutex{}
}
func SetMask(m int) {
lock.Lock()
defer lock.Unlock()
mask = m
lock.Lock()
defer lock.Unlock()
mask = m
}
func SetFlag(f int) {
lock.Lock()
defer lock.Unlock()
flag = f
lock.Lock()
defer lock.Unlock()
flag = f
}
func SetLogFile(path string) error {
f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
if err != nil {
return err
}
lock.Lock()
defer lock.Unlock()
file = new(File)
file.file = f
return nil
f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
if err != nil {
return err
}
lock.Lock()
defer lock.Unlock()
file = new(File)
file.file = f
return nil
}
func CloseFile() {
lock.Lock()
defer lock.Unlock()
if file == nil {
return
}
err := file.file.Close()
if err != nil {
write(os.Stderr, prefixERROR, "failed to close log file")
}
file = nil
lock.Lock()
defer lock.Unlock()
if file == nil {
return
}
err := file.file.Close()
if err != nil {
write(os.Stderr, prefixERROR, "failed to close log file")
}
file = nil
}
func write(w io.Writer, prefix string, format string, values ...any) {
now := ""
if (flag&FlagDate) != 0 && (flag&FlagTime) != 0 {
now = time.Now().Format("2006-01-02 15:04:05 ")
} else if (flag & FlagDate) != 0 {
now = time.Now().Format("2006-01-02 ")
} else if (flag & FlagTime) != 0 {
now = time.Now().Format("15:04:05 ")
}
if (flag & FlagPrefix) != 0 {
_, _ = w.Write([]byte(now))
_, _ = w.Write([]byte(prefix))
} else {
_, _ = w.Write([]byte(prefix))
_, _ = w.Write([]byte(now))
}
now := ""
if (flag&FlagDate) != 0 && (flag&FlagTime) != 0 {
now = time.Now().Format("2006-01-02 15:04:05 ")
} else if (flag & FlagDate) != 0 {
now = time.Now().Format("2006-01-02 ")
} else if (flag & FlagTime) != 0 {
now = time.Now().Format("15:04:05 ")
}
if (flag & FlagPrefix) != 0 {
_, _ = w.Write([]byte(now))
_, _ = w.Write([]byte(prefix))
} else {
_, _ = w.Write([]byte(prefix))
_, _ = w.Write([]byte(now))
}
if (flag & FlagLongFile) != 0 {
_, p, l, ok := runtime.Caller(2)
if ok {
_, _ = fmt.Fprintf(w, "%s:%d ", p, l)
} else {
_, _ = w.Write([]byte("?:? "))
}
} else if (flag & FlagShortFile) != 0 {
_, p, l, ok := runtime.Caller(2)
if ok {
_, _ = fmt.Fprintf(w, "%s:%d ", path.Base(p), l)
} else {
_, _ = w.Write([]byte("?:? "))
}
}
_, _ = w.Write([]byte("| "))
_, _ = fmt.Fprintf(w, format, values...)
_, _ = w.Write([]byte("\n"))
if (flag & FlagLongFile) != 0 {
_, p, l, ok := runtime.Caller(2)
if ok {
_, _ = fmt.Fprintf(w, "%s:%d ", p, l)
} else {
_, _ = w.Write([]byte("?:? "))
}
} else if (flag & FlagShortFile) != 0 {
_, p, l, ok := runtime.Caller(2)
if ok {
_, _ = fmt.Fprintf(w, "%s:%d ", path.Base(p), l)
} else {
_, _ = w.Write([]byte("?:? "))
}
}
_, _ = w.Write([]byte("| "))
_, _ = fmt.Fprintf(w, format, values...)
_, _ = w.Write([]byte("\n"))
}
func Unknown(format string, values ...any) {
if (mask & MaskUNKNOWN) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixUNKNOWN, format, values...)
}
write(consoleStdout, prefixUNKNOWN, format, values...)
}
if (mask & MaskUNKNOWN) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixUNKNOWN, format, values...)
}
write(consoleStdout, prefixUNKNOWN, format, values...)
}
}
func Debug(format string, values ...any) {
if (mask & MaskDEBUG) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixDEBUG, format, values...)
}
write(consoleStdout, prefixDEBUG, format, values...)
}
if (mask & MaskDEBUG) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixDEBUG, format, values...)
}
write(consoleStdout, prefixDEBUG, format, values...)
}
}
func Trace(format string, values ...any) {
if (mask & MaskTRACE) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixTRACE, format, values...)
}
write(consoleStdout, prefixTRACE, format, values...)
}
if (mask & MaskTRACE) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixTRACE, format, values...)
}
write(consoleStdout, prefixTRACE, format, values...)
}
}
func Info(format string, values ...any) {
if (mask & MaskINFO) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixINFO, format, values...)
}
write(consoleStdout, prefixINFO, format, values...)
}
if (mask & MaskINFO) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixINFO, format, values...)
}
write(consoleStdout, prefixINFO, format, values...)
}
}
func Warning(format string, values ...any) {
if (mask & MaskWARNING) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixWARNING, format, values...)
}
write(consoleStdout, prefixWARNING, format, values...)
}
if (mask & MaskWARNING) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixWARNING, format, values...)
}
write(consoleStdout, prefixWARNING, format, values...)
}
}
func Error(format string, values ...any) {
if (mask & MaskERROR) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixERROR, format, values...)
}
write(consoleStderr, prefixERROR, format, values...)
}
if (mask & MaskERROR) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixERROR, format, values...)
}
write(consoleStderr, prefixERROR, format, values...)
}
}
func Fatal(format string, values ...any) {
if (mask & MaskFATAL) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixFATAL, format, values...)
}
write(consoleStderr, prefixFATAL, format, values...)
os.Exit(0)
}
if (mask & MaskFATAL) != 0 {
lock.Lock()
defer lock.Unlock()
if file != nil {
write(file, prefixFATAL, format, values...)
}
write(consoleStderr, prefixFATAL, format, values...)
os.Exit(0)
}
}