starlog/typed.go

222 lines
4.3 KiB
Go
Raw Normal View History

2020-12-21 17:22:45 +08:00
package starlog
import (
"fmt"
"io"
"math/rand"
"sync"
"time"
2020-12-29 14:05:14 +08:00
"b612.me/starlog/colorable"
2020-12-21 17:22:45 +08:00
)
const (
LvDebug = iota
LvInfo
LvNotice
LvWarning
LvError
LvCritical
LvPanic
LvFatal
)
var (
levels = map[int]string{
LvDebug: "DEBUG",
LvInfo: "INFO",
LvNotice: "NOTICE",
LvWarning: "WARNING",
LvError: "ERROR",
LvCritical: "CRITICAL",
LvPanic: "PANIC",
LvFatal: "FATAL",
}
2024-08-18 17:33:43 +08:00
stacks *starChanStack
2020-12-21 17:22:45 +08:00
stackStarted bool = false
stackStopChan chan int
2021-09-23 10:39:17 +08:00
stackMu sync.Mutex
2020-12-21 17:22:45 +08:00
stdScreen io.Writer = colorable.NewColorableStdout()
2022-06-21 10:16:32 +08:00
errScreen io.Writer = colorable.NewColorableStderr()
2020-12-21 17:22:45 +08:00
)
type starlog struct {
mu *sync.Mutex
output io.Writer
2022-06-21 10:16:32 +08:00
errOutputLevel int
2020-12-21 17:22:45 +08:00
showFuncName bool
showThread bool
showLevel bool
showDeatilFile bool
showColor bool
switching bool
showStd bool
2021-09-23 10:28:05 +08:00
onlyColorLevel bool
2020-12-21 17:22:45 +08:00
stopWriter bool
id string
name string
colorList map[int][]Attr
colorMe map[int]*Color
2020-12-21 17:22:45 +08:00
}
type StarLogger struct {
thread string
handlerFunc func(LogData)
2020-12-21 17:22:45 +08:00
logcore *starlog
isStd bool
}
type logTransfer struct {
handlerFunc func(LogData)
LogData
}
type LogData struct {
Name string
Log string
Colors []Attr
2020-12-21 17:22:45 +08:00
}
func newLogCore(out io.Writer) *starlog {
return &starlog{
mu: &sync.Mutex{},
output: out,
2022-06-21 10:16:32 +08:00
errOutputLevel: LvError,
2020-12-21 17:22:45 +08:00
showFuncName: true,
showThread: true,
showLevel: true,
showStd: true,
showDeatilFile: true,
switching: false,
stopWriter: false,
showColor: true,
id: generateId(),
colorList: map[int][]Attr{
LvDebug: []Attr{FgWhite},
LvInfo: []Attr{FgGreen},
LvNotice: []Attr{FgCyan},
2020-12-21 17:22:45 +08:00
LvWarning: []Attr{FgYellow},
LvError: []Attr{FgMagenta},
LvCritical: []Attr{FgRed, Bold},
LvPanic: []Attr{FgRed, Bold},
LvFatal: []Attr{FgRed},
},
colorMe: map[int]*Color{
LvDebug: NewColor([]Attr{FgWhite}...),
LvInfo: NewColor([]Attr{FgGreen}...),
LvNotice: NewColor([]Attr{FgCyan}...),
2020-12-21 17:22:45 +08:00
LvWarning: NewColor([]Attr{FgYellow}...),
LvError: NewColor([]Attr{FgMagenta}...),
LvCritical: NewColor([]Attr{FgRed, Bold}...),
LvPanic: NewColor([]Attr{FgRed, Bold}...),
LvFatal: NewColor([]Attr{FgRed}...),
},
}
}
func NewStarlog(out io.Writer) *StarLogger {
return &StarLogger{
handlerFunc: nil,
thread: "MAN",
logcore: newLogCore(out),
isStd: false,
}
}
2022-06-21 10:16:32 +08:00
func (logger *StarLogger) StdErrLevel() int {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
return logger.logcore.errOutputLevel
}
func (logger *StarLogger) SetStdErrLevel(level int) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.errOutputLevel = level
}
2020-12-21 17:22:45 +08:00
func (logger *StarLogger) NewFlag() *StarLogger {
return &StarLogger{
thread: getRandomFlag(false),
handlerFunc: logger.handlerFunc,
logcore: logger.logcore,
isStd: false,
}
}
func (logger *StarLogger) SetNewRandomFlag() {
logger.thread = getRandomFlag(false)
}
func (logger *StarLogger) SetName(name string) {
logger.logcore.mu.Lock()
defer logger.logcore.mu.Unlock()
logger.logcore.name = name
}
func (logger *StarLogger) GetName() string {
return logger.logcore.name
}
2020-12-21 17:22:45 +08:00
func getRandomFlag(isMain bool) string {
rand.Seed(time.Now().UnixNano())
if isMain {
return "MAN"
}
flag := "MAN"
for flag == "MAN" {
flag = string([]byte{uint8(rand.Intn(26) + 65), uint8(rand.Intn(26) + 65), uint8(rand.Intn(26) + 65)})
}
return flag
}
func generateId() string {
rand.Seed(time.Now().UnixNano())
return fmt.Sprintf("%dstar%db612%d", time.Now().UnixNano(), rand.Intn(1000000), rand.Intn(1000000))
}
func StartStacks() {
2021-09-23 10:39:17 +08:00
stackMu.Lock()
2020-12-21 17:22:45 +08:00
if stackStarted {
2021-09-23 10:39:17 +08:00
stackMu.Unlock()
2020-12-21 17:22:45 +08:00
return
}
2023-02-12 10:18:05 +08:00
unlock := make(chan struct{})
2020-12-21 17:22:45 +08:00
go func() {
stackStarted = true
2024-08-18 17:33:43 +08:00
stacks = newStarChanStack(1024)
2021-09-23 10:39:17 +08:00
stackMu.Unlock()
2023-02-12 10:18:05 +08:00
unlock <- struct{}{}
2020-12-21 17:22:45 +08:00
defer func() {
stackStarted = false
}()
for {
select {
case <-stackStopChan:
return
default:
}
2023-02-12 10:18:05 +08:00
poped, err := stacks.Pop()
if err != nil {
return
2020-12-21 17:22:45 +08:00
}
val := poped.(logTransfer)
if val.handlerFunc != nil {
val.handlerFunc(val.LogData)
2020-12-21 17:22:45 +08:00
}
}
}()
2023-02-12 10:18:05 +08:00
<-unlock
2020-12-21 17:22:45 +08:00
}
func StopStacks() {
if !stackStarted {
return
}
stackStopChan <- 1
}
2021-09-23 10:44:56 +08:00
func Stop() {
2023-02-12 10:18:05 +08:00
stacks.Close()
2021-09-23 10:44:56 +08:00
StopStacks()
2021-11-12 16:03:34 +08:00
}