go官方日志库带色彩格式化

go默认的 log 输出的日志样式比较难看,所以通过以下方式进行了美化和格式化,而且加入了 unicode 的ascii码,进行色彩渲染。

复制代码
package main

import (
	"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)
}

下面是实际展示效果:

相关推荐
不正经学生1 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
门思科技2 小时前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
limuyang23 小时前
PDF Viewer KMP(基于 chrome 的 PDFium 内核)
android·kotlin
恋恋西风4 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx4 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
BizzZ_5 小时前
C++(22)——类型转换和IO流
开发语言·c++
小范同学_5 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu5 小时前
CSharp: 万年历
开发语言·后端·c#·.net
我找到地球的支点啦6 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
予昊6 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket