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 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() { // 设置当前日志级别 currentLevel = getLogLevelFromConfig() 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() } // 辅助函数封装 func Info(format string, v ...interface{}) { if INFO >= currentLevel { infoLogger.Printf(format, v...) } } func Debug(format string, v ...interface{}) { if DEBUG >= currentLevel { debugLogger.Printf(format, v...) } } func Error(format string, v ...interface{}) { if ERROR >= currentLevel { errorLogger.Printf(format, v...) } } func Warn(format string, v ...interface{}) { if WARN >= currentLevel { warningLogger.Printf(format, v...) } }