modify mask&flag
Test / uint (1.19.13, ubuntu-latest) (push) Waiting to run Details
Test / uint (>=1.20, ubuntu-latest) (push) Waiting to run Details
Verify / lint (1.19.13) (push) Waiting to run Details
Verify / lint (>=1.20) (push) Waiting to run Details
Security / scan (1.19.13) (push) Successful in 1m0s Details
Security / scan (>=1.20) (push) Has been cancelled Details

This commit is contained in:
Akvicor 2024-01-25 02:08:04 +08:00
parent 4e03b69425
commit 9c80be5b7c
3 changed files with 176 additions and 114 deletions

43
file.go
View File

@ -5,13 +5,50 @@ import (
"sync"
)
type File struct {
type Paper struct {
file *os.File
sync.Mutex
}
func (f *File) Write(p []byte) (n int, err error) {
func NewPaperFromFile(file *os.File) *Paper {
return &Paper{
file: file,
Mutex: sync.Mutex{},
}
}
func (f *Paper) SetFile(file *os.File) {
f.Lock()
defer f.Unlock()
return f.file.Write(p)
if f.file != nil {
_ = f.file.Close()
}
if file != nil {
f.file = file
}
}
func (f *Paper) WriteString(s string) {
f.Lock()
defer f.Unlock()
if f.file != nil {
_, _ = f.file.WriteString(s)
}
}
func (f *Paper) Ready() bool {
f.Lock()
defer f.Unlock()
return f.file != nil
}
func (f *Paper) Close() error {
f.Lock()
defer f.Unlock()
var err error = nil
if f.file != nil {
err = f.file.Close()
f.file = nil
}
return err
}

220
glog.go
View File

@ -2,12 +2,12 @@ package glog
import (
"fmt"
"io"
"os"
"path"
"path/filepath"
"runtime"
"sync"
"strings"
"sync/atomic"
"time"
)
@ -19,8 +19,8 @@ const (
MaskWARNING
MaskERROR
MaskFATAL
MaskStdMask = MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
MaskStdAll = MaskUNKNOWN | MaskDEBUG | MaskTRACE | MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
MaskStd = MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
MaskAll = MaskUNKNOWN | MaskDEBUG | MaskTRACE | MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
)
const (
@ -28,8 +28,10 @@ const (
FlagTime
FlagLongFile
FlagShortFile
FlagFunc
FlagPrefix
FlagStdFlag = FlagDate | FlagTime | FlagPrefix
FlagStd = FlagDate | FlagTime | FlagPrefix
FlagAll = FlagDate | FlagTime | FlagShortFile | FlagFunc | FlagPrefix
)
var (
@ -42,33 +44,27 @@ var (
prefixFATAL = "[FATAL ] "
)
var mask = MaskStdAll
var flag = FlagStdFlag
var mask uint32 = MaskStd
var flag uint32 = FlagStd
var consoleStdout *File
var consoleStderr *File
var file *File
var lock sync.RWMutex
var stdout = NewPaperFromFile(os.Stdout)
var stderr = NewPaperFromFile(os.Stderr)
var file = NewPaperFromFile(nil)
func init() {
consoleStdout = new(File)
consoleStdout.file = os.Stdout
consoleStderr = new(File)
consoleStderr.file = os.Stderr
file = nil
lock = sync.RWMutex{}
func SetMask(m uint32) {
atomic.StoreUint32(&mask, m)
}
func SetMask(m int) {
lock.Lock()
defer lock.Unlock()
mask = m
func GetMask() uint32 {
return atomic.LoadUint32(&mask)
}
func SetFlag(f int) {
lock.Lock()
defer lock.Unlock()
flag = f
func SetFlag(f uint32) {
atomic.StoreUint32(&flag, f)
}
func GetFlag() uint32 {
return atomic.LoadUint32(&flag)
}
func SetLogFile(path string) error {
@ -76,137 +72,139 @@ func SetLogFile(path string) error {
if err != nil {
return err
}
lock.Lock()
defer lock.Unlock()
file = new(File)
file.file = f
file.SetFile(f)
return nil
}
func CloseFile() {
lock.Lock()
defer lock.Unlock()
if file == nil {
return
}
err := file.file.Close()
err := file.Close()
if err != nil {
write(os.Stderr, prefixERROR, "failed to close log file")
Error("failed to close log file: %v", err)
}
file = nil
}
func write(w io.Writer, prefix string, format string, values ...any) {
func CloseStdout() {
err := stdout.Close()
if err != nil {
Error("failed to close log stdout: %v", err)
}
}
func CloseStderr() {
err := stderr.Close()
if err != nil {
Error("failed to close log stderr: %v", err)
}
}
func Close() {
CloseFile()
CloseStdout()
CloseStderr()
}
func write(w *Paper, prefix string, format string, values ...any) {
if !w.Ready() {
return
}
log := strings.Builder{}
now := ""
if (flag&FlagDate) != 0 && (flag&FlagTime) != 0 {
flg := GetFlag()
if (flg&FlagDate) != 0 && (flg&FlagTime) != 0 {
now = time.Now().Format("2006-01-02 15:04:05 ")
} else if (flag & FlagDate) != 0 {
} else if (flg & FlagDate) != 0 {
now = time.Now().Format("2006-01-02 ")
} else if (flag & FlagTime) != 0 {
} else if (flg & FlagTime) != 0 {
now = time.Now().Format("15:04:05 ")
}
if (flag & FlagPrefix) != 0 {
_, _ = w.Write([]byte(now))
_, _ = w.Write([]byte(prefix))
if (flg & FlagPrefix) != 0 {
log.WriteString(now)
log.WriteString(prefix)
} else {
_, _ = w.Write([]byte(prefix))
_, _ = w.Write([]byte(now))
log.WriteString(prefix)
log.WriteString(now)
}
if (flag & FlagLongFile) != 0 {
_, p, l, ok := runtime.Caller(2)
if (flg & FlagFunc) != 0 {
c, _, _, ok := runtime.Caller(2)
if ok {
_, _ = fmt.Fprintf(w, "%s:%d ", p, l)
log.WriteString(runtime.FuncForPC(c).Name())
log.WriteString(" ")
} 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("?:? "))
log.WriteString("? ")
}
}
_, _ = w.Write([]byte("| "))
_, _ = fmt.Fprintf(w, format, values...)
_, _ = w.Write([]byte("\n"))
if (flg & FlagLongFile) != 0 {
_, p, l, ok := runtime.Caller(2)
if ok {
log.WriteString(fmt.Sprintf("%s:%d ", p, l))
} else {
log.WriteString("?:? ")
}
} else if (flg & FlagShortFile) != 0 {
_, p, l, ok := runtime.Caller(2)
if ok {
log.WriteString(fmt.Sprintf("%s:%d ", path.Base(p), l))
} else {
log.WriteString("?:? ")
}
}
log.WriteString("| ")
log.WriteString(fmt.Sprintf(format, values...))
log.WriteString("\n")
w.WriteString(log.String())
}
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 (GetMask() & MaskUNKNOWN) != 0 {
write(file, prefixUNKNOWN, format, values...)
write(stdout, 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 (GetMask() & MaskDEBUG) != 0 {
write(file, prefixDEBUG, format, values...)
write(stdout, 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 (GetMask() & MaskTRACE) != 0 {
write(file, prefixTRACE, format, values...)
write(stdout, 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 (GetMask() & MaskINFO) != 0 {
write(file, prefixINFO, format, values...)
write(stdout, 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 (GetMask() & MaskWARNING) != 0 {
write(file, prefixWARNING, format, values...)
write(stdout, 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 (GetMask() & MaskERROR) != 0 {
write(file, prefixERROR, format, values...)
write(stderr, 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...)
if (GetMask() & MaskFATAL) != 0 {
write(file, prefixFATAL, format, values...)
write(stderr, prefixFATAL, format, values...)
CloseFile()
os.Exit(0)
}
}

27
glog_test.go Normal file
View File

@ -0,0 +1,27 @@
package glog
import (
"fmt"
"testing"
)
func TestGlog(t *testing.T) {
defer func() {
if r := recover(); r == nil {
t.Errorf("expected os.Exit(0)")
} else {
if fmt.Sprint(r) != "unexpected call to os.Exit(0) during test" {
t.Errorf("expected os.Exit(0) got %v", r)
}
}
}()
SetMask(MaskAll)
SetFlag(FlagAll)
Unknown("test %s", "Unknown")
Debug("test %s", "Debug")
Trace("test %s", "Trace")
Info("test %s", "Info")
Warning("test %s", "Warning")
Error("test %s", "Error")
Fatal("test %s", "Fatal")
}