go默認的 log
輸出的日志樣式比較難看,所以通過以下方式進行了美化和格式化,而且加入了 unicode
的ascii碼,進行色彩渲染。
package mainimport ("fmt""log""os""runtime""strings""time"
)// 自定義日志格式
type CustomLogger struct {logger *log.Logger
}var levelColors map[string]string = map[string]string{"DEBUG": "[97;46m", // 藍色"INFO": "[97;42m", // 綠色"WARNING": "[97;43m", // 黃色"ERROR": "[97;41m", // 紅色"CRITICAL": "[97;45m", // 紅色加粗"SUCCESS": "[97;42m", // 綠色加粗
}// 初始化自定義日志
func NewCustomLogger() *CustomLogger {return &CustomLogger{logger: log.New(os.Stdout, "", 0), // 輸出到標準輸出,不帶前綴}
}// 自定義日志格式
func (l *CustomLogger) formatLog(level string, message string) string {// 獲取當前時間now := time.Now().Format("2006-01-02 15:04:05.000")// 獲取調用棧信息pc, file, line, ok := runtime.Caller(3) // 跳過三層調用棧caller := "unknown"if ok {funcName := runtime.FuncForPC(pc).Name()caller = fmt.Sprintf("%s:%d", file, line)if index := strings.LastIndex(funcName, "."); index != -1 {caller = fmt.Sprintf("%s.%s:%d", funcName[:index], funcName[index+1:], line)}}// 構建日志格式return fmt.Sprintf("[32m%s[0m |%s%s[0m| [35m%s[0m - [33m%s[0m",now, levelColors[level], level, caller, message)
}// 日志輸出函數
func (l *CustomLogger) Log(level string, message string) {logLine := l.formatLog(level, message)l.logger.Println(logLine)
}// 不同級別的日志函數
func (l *CustomLogger) Info(message string) {l.Log("INFO", message)
}func (l *CustomLogger) Infof(format string, v ...any) {message := fmt.Sprintf(format, v...)l.Log("INFO", message)
}func (l *CustomLogger) Error(message string) {l.Log("ERROR", message)
}func (l *CustomLogger) Errorf(format string, v ...any) {message := fmt.Sprintf(format, v...)l.Log("ERROR", message)
}func (l *CustomLogger) Debug(message string) {l.Log("DEBUG", message)
}func (l *CustomLogger) Debugf(format string, v ...any) {message := fmt.Sprintf(format, v...)l.Log("DEBUG", message)
}
下面是實際展示效果: