2023-02-10 15:42:45 +08:00
|
|
|
package glog
|
|
|
|
|
|
|
|
import (
|
2024-01-24 00:15:07 +08:00
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
"path/filepath"
|
|
|
|
"runtime"
|
2024-01-25 02:08:04 +08:00
|
|
|
"strings"
|
|
|
|
"sync/atomic"
|
2024-01-24 00:15:07 +08:00
|
|
|
"time"
|
2023-02-10 15:42:45 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2024-01-24 00:15:07 +08:00
|
|
|
MaskUNKNOWN = 1 << iota
|
|
|
|
MaskDEBUG
|
|
|
|
MaskTRACE
|
|
|
|
MaskINFO
|
|
|
|
MaskWARNING
|
|
|
|
MaskERROR
|
|
|
|
MaskFATAL
|
2024-01-25 02:08:04 +08:00
|
|
|
MaskStd = MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
|
|
|
|
MaskAll = MaskUNKNOWN | MaskDEBUG | MaskTRACE | MaskINFO | MaskWARNING | MaskERROR | MaskFATAL
|
2023-02-10 15:42:45 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2024-01-24 00:15:07 +08:00
|
|
|
FlagDate = 1 << iota
|
|
|
|
FlagTime
|
|
|
|
FlagLongFile
|
|
|
|
FlagShortFile
|
2024-01-25 02:08:04 +08:00
|
|
|
FlagFunc
|
2024-01-24 00:15:07 +08:00
|
|
|
FlagPrefix
|
2024-01-25 02:08:04 +08:00
|
|
|
FlagStd = FlagDate | FlagTime | FlagPrefix
|
|
|
|
FlagAll = FlagDate | FlagTime | FlagShortFile | FlagFunc | FlagPrefix
|
2023-02-10 15:42:45 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2024-01-24 00:15:07 +08:00
|
|
|
prefixUNKNOWN = "[UNKNOWN] "
|
|
|
|
prefixDEBUG = "[DEBUG ] "
|
|
|
|
prefixTRACE = "[TRACE ] "
|
|
|
|
prefixINFO = "[INFO ] "
|
|
|
|
prefixWARNING = "[WARNING] "
|
|
|
|
prefixERROR = "[ERROR ] "
|
|
|
|
prefixFATAL = "[FATAL ] "
|
2023-02-10 15:42:45 +08:00
|
|
|
)
|
|
|
|
|
2024-01-25 02:08:04 +08:00
|
|
|
var mask uint32 = MaskStd
|
|
|
|
var flag uint32 = FlagStd
|
2023-02-10 15:42:45 +08:00
|
|
|
|
2024-01-25 02:08:04 +08:00
|
|
|
var stdout = NewPaperFromFile(os.Stdout)
|
|
|
|
var stderr = NewPaperFromFile(os.Stderr)
|
|
|
|
var file = NewPaperFromFile(nil)
|
2023-02-10 15:42:45 +08:00
|
|
|
|
2024-01-25 02:08:04 +08:00
|
|
|
func SetMask(m uint32) {
|
|
|
|
atomic.StoreUint32(&mask, m)
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
2024-01-25 02:08:04 +08:00
|
|
|
func GetMask() uint32 {
|
|
|
|
return atomic.LoadUint32(&mask)
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
2024-01-25 02:08:04 +08:00
|
|
|
func SetFlag(f uint32) {
|
|
|
|
atomic.StoreUint32(&flag, f)
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetFlag() uint32 {
|
|
|
|
return atomic.LoadUint32(&flag)
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func SetLogFile(path string) error {
|
2024-01-24 00:15:07 +08:00
|
|
|
f, err := os.OpenFile(filepath.Clean(path), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2024-01-25 02:08:04 +08:00
|
|
|
file.SetFile(f)
|
2024-01-24 00:15:07 +08:00
|
|
|
return nil
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func CloseFile() {
|
2024-01-25 02:08:04 +08:00
|
|
|
err := file.Close()
|
|
|
|
if err != nil {
|
|
|
|
Error("failed to close log file: %v", err)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2024-01-25 02:08:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func CloseStdout() {
|
|
|
|
err := stdout.Close()
|
2024-01-24 00:15:07 +08:00
|
|
|
if err != nil {
|
2024-01-25 02:08:04 +08:00
|
|
|
Error("failed to close log stdout: %v", err)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
2024-01-25 02:08:04 +08:00
|
|
|
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{}
|
2024-01-24 00:15:07 +08:00
|
|
|
now := ""
|
2024-01-25 02:08:04 +08:00
|
|
|
flg := GetFlag()
|
|
|
|
|
|
|
|
if (flg&FlagDate) != 0 && (flg&FlagTime) != 0 {
|
2024-01-24 00:15:07 +08:00
|
|
|
now = time.Now().Format("2006-01-02 15:04:05 ")
|
2024-01-25 02:08:04 +08:00
|
|
|
} else if (flg & FlagDate) != 0 {
|
2024-01-24 00:15:07 +08:00
|
|
|
now = time.Now().Format("2006-01-02 ")
|
2024-01-25 02:08:04 +08:00
|
|
|
} else if (flg & FlagTime) != 0 {
|
2024-01-24 00:15:07 +08:00
|
|
|
now = time.Now().Format("15:04:05 ")
|
|
|
|
}
|
2024-01-25 02:08:04 +08:00
|
|
|
if (flg & FlagPrefix) != 0 {
|
|
|
|
log.WriteString(now)
|
|
|
|
log.WriteString(prefix)
|
2024-01-24 00:15:07 +08:00
|
|
|
} else {
|
2024-01-25 02:08:04 +08:00
|
|
|
log.WriteString(prefix)
|
|
|
|
log.WriteString(now)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2024-01-25 02:08:04 +08:00
|
|
|
|
|
|
|
if (flg & FlagFunc) != 0 {
|
|
|
|
c, _, _, ok := runtime.Caller(2)
|
|
|
|
if ok {
|
|
|
|
log.WriteString(runtime.FuncForPC(c).Name())
|
|
|
|
log.WriteString(" ")
|
|
|
|
} else {
|
|
|
|
log.WriteString("? ")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flg & FlagLongFile) != 0 {
|
2024-01-24 00:15:07 +08:00
|
|
|
_, p, l, ok := runtime.Caller(2)
|
|
|
|
if ok {
|
2024-01-25 02:08:04 +08:00
|
|
|
log.WriteString(fmt.Sprintf("%s:%d ", p, l))
|
2024-01-24 00:15:07 +08:00
|
|
|
} else {
|
2024-01-25 02:08:04 +08:00
|
|
|
log.WriteString("?:? ")
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2024-01-25 02:08:04 +08:00
|
|
|
} else if (flg & FlagShortFile) != 0 {
|
2024-01-24 00:15:07 +08:00
|
|
|
_, p, l, ok := runtime.Caller(2)
|
|
|
|
if ok {
|
2024-01-25 02:08:04 +08:00
|
|
|
log.WriteString(fmt.Sprintf("%s:%d ", path.Base(p), l))
|
2024-01-24 00:15:07 +08:00
|
|
|
} else {
|
2024-01-25 02:08:04 +08:00
|
|
|
log.WriteString("?:? ")
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
|
|
|
}
|
2024-01-25 02:08:04 +08:00
|
|
|
|
|
|
|
log.WriteString("| ")
|
|
|
|
log.WriteString(fmt.Sprintf(format, values...))
|
|
|
|
log.WriteString("\n")
|
|
|
|
w.WriteString(log.String())
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func Unknown(format string, values ...any) {
|
2024-01-25 02:08:04 +08:00
|
|
|
if (GetMask() & MaskUNKNOWN) != 0 {
|
|
|
|
write(file, prefixUNKNOWN, format, values...)
|
|
|
|
write(stdout, prefixUNKNOWN, format, values...)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func Debug(format string, values ...any) {
|
2024-01-25 02:08:04 +08:00
|
|
|
if (GetMask() & MaskDEBUG) != 0 {
|
|
|
|
write(file, prefixDEBUG, format, values...)
|
|
|
|
write(stdout, prefixDEBUG, format, values...)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func Trace(format string, values ...any) {
|
2024-01-25 02:08:04 +08:00
|
|
|
if (GetMask() & MaskTRACE) != 0 {
|
|
|
|
write(file, prefixTRACE, format, values...)
|
|
|
|
write(stdout, prefixTRACE, format, values...)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func Info(format string, values ...any) {
|
2024-01-25 02:08:04 +08:00
|
|
|
if (GetMask() & MaskINFO) != 0 {
|
|
|
|
write(file, prefixINFO, format, values...)
|
|
|
|
write(stdout, prefixINFO, format, values...)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func Warning(format string, values ...any) {
|
2024-01-25 02:08:04 +08:00
|
|
|
if (GetMask() & MaskWARNING) != 0 {
|
|
|
|
write(file, prefixWARNING, format, values...)
|
|
|
|
write(stdout, prefixWARNING, format, values...)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func Error(format string, values ...any) {
|
2024-01-25 02:08:04 +08:00
|
|
|
if (GetMask() & MaskERROR) != 0 {
|
|
|
|
write(file, prefixERROR, format, values...)
|
|
|
|
write(stderr, prefixERROR, format, values...)
|
2024-01-24 00:15:07 +08:00
|
|
|
}
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func Fatal(format string, values ...any) {
|
2024-01-25 02:08:04 +08:00
|
|
|
if (GetMask() & MaskFATAL) != 0 {
|
|
|
|
write(file, prefixFATAL, format, values...)
|
|
|
|
write(stderr, prefixFATAL, format, values...)
|
|
|
|
CloseFile()
|
2024-01-24 00:15:07 +08:00
|
|
|
os.Exit(0)
|
|
|
|
}
|
2023-02-10 15:42:45 +08:00
|
|
|
}
|