139 lines
2.7 KiB
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
|
|
}
|