bash_go_service/shared/pkg/logger/logger.go

139 lines
2.7 KiB
Go

package logger
import (
"fmt"
"log"
"os"
"path/filepath"
"runtime"
"strings"
"time"
"bash_go_service/shared/pkg/constants"
"github.com/spf13/viper"
)
// LogLevel 定义日志级别类型
type LogLevel int
const (
OFF LogLevel = -1
DEBUG LogLevel = iota
INFO
WARN
ERROR
)
var (
infoLogger *log.Logger
debugLogger *log.Logger
errorLogger *log.Logger
warningLogger *log.Logger
currentLevel LogLevel
)
type LogWriter struct {
prefix string
color string
level LogLevel
}
func (w *LogWriter) Write(p []byte) (n int, err error) {
if currentLevel == OFF {
return len(p), nil
}
// 检查日志级别
if w.level < currentLevel {
return len(p), nil // 当前日志等级比配置的还低,不打印
}
_, file, line, ok := runtime.Caller(4)
if !ok {
file = "???"
line = 0
}
filename := filepath.Base(file)
now := time.Now().Format("2006-01-02 15:04:05.000")
logPrefix := fmt.Sprintf("%s%s%s [%s%-7s%s] %s%s:%d%s | ",
constants.ColorGray, now, constants.ColorReset,
w.color, w.prefix, constants.ColorReset,
constants.ColorBold, filename, line, constants.ColorReset,
)
return os.Stdout.Write([]byte(logPrefix + string(p)))
}
// getLogLevelFromConfig 从配置文件获取日志级别
func getLogLevelFromConfig() LogLevel {
logLevel := strings.ToUpper(viper.GetString("log.level"))
switch logLevel {
case "DEBUG":
return DEBUG
case "INFO":
return INFO
case "WARN":
return WARN
case "ERROR":
return ERROR
default:
return OFF // 默认INFO级别
}
}
func init() {
infoLogger = log.New(&LogWriter{prefix: "INFO", color: constants.ColorGreen, level: INFO}, "", 0)
debugLogger = log.New(&LogWriter{prefix: "DEBUG", color: constants.ColorBlue, level: DEBUG}, "", 0)
errorLogger = log.New(&LogWriter{prefix: "ERROR", color: constants.ColorRed, level: ERROR}, "", 0)
warningLogger = log.New(&LogWriter{prefix: "WARN", color: constants.ColorYellow, level: WARN}, "", 0)
}
// UpdateLogLevel 更新日志级别
func UpdateLogLevel() {
currentLevel = getLogLevelFromConfig()
Debug("Log level set to: %d", currentLevel)
}
// 辅助函数封装
func Info(format string, v ...interface{}) {
if currentLevel == OFF {
return
}
if INFO >= currentLevel {
infoLogger.Printf(format, v...)
}
}
func Debug(format string, v ...interface{}) {
if currentLevel == OFF {
return
}
if DEBUG >= currentLevel {
debugLogger.Printf(format, v...)
}
}
func Error(format string, v ...interface{}) {
if currentLevel == OFF {
return
}
if ERROR >= currentLevel {
errorLogger.Printf(format, v...)
}
}
func Warn(format string, v ...interface{}) {
if currentLevel == OFF {
return
}
if WARN >= currentLevel {
warningLogger.Printf(format, v...)
}
}
func SetLevel(level LogLevel) {
currentLevel = level
}