logx 是一个Go语言实现的简单、灵活的日志模块,提供了多级日志支持、彩色输出、自定义格式和并发安全等功能。
level.go: 定义日志级别枚举和相关方法log.go: 提供全局日志实例和简化的日志函数logger.go: 定义日志接口和核心实现logx 支持以下日志级别,按照代码中定义的顺序(从高到低):
| 级别 | 枚举值 | 颜色 | 描述 | 是否导致程序退出 |
|---|---|---|---|---|
| Emergency | 0 | 红色加粗 | 系统不可用,必须立即处理 | 是 |
| Panic | 1 | 红色加粗 | 严重错误,导致panic | 是 |
| Fatal | 2 | 红色加粗 | 严重错误,导致程序退出 | 是 |
| Alert | 3 | 品红色加粗 | 必须立即关注,需立刻处理 | 否 |
| Critical | 4 | 亮品红色加粗 | 严重错误,关键功能失败 | 否 |
| Error | 5 | 亮红色 | 一般错误,影响部分功能 | 否 |
| Warning/Warn | 6 | 黄色 | 警告,潜在问题 | 否 |
| Notice | 7 | 亮青色 | 正常但重要的事件 | 否 |
| Info | 8 | 白色 | 普通运行信息 | 否 |
| Debug | 9 | 蓝色 | 调试信息,较详细 | 否 |
| Trace | 10 | 亮黑色 | 跟踪信息,最详细 | 否 |
使用以下命令安装 logx 包:
go get cnb.cool/zhiqiangwang/pkg/logx # 获取最新 tag 代码
go get cnb.cool/zhiqiangwang/pkg/logx@main # [不推荐]获取最新提交代码
import "cnb.cool/zhiqiangwang/pkg/logx"
// 设置日志级别
logx.SetLevel(logx.InfoLevel)
// 设置日志前缀
logx.SetPrefix("[APP]")
// 设置导致程序退出的日志级别
logx.SetExitLevel([]logx.Level{logx.EmergencyLevel, logx.PanicLevel, logx.FatalLevel})
// 使用不同级别的日志
logx.Info("这是一条信息日志")
logx.Warning("这是一条警告日志")
logx.Error("这是一条错误日志")
logx.Debug("这是一条调试日志") // 由于级别设置为Info,这条不会输出
logx.Trace("这是一条跟踪日志") // 由于级别设置为Info,这条不会输出
package main
import (
"cnb.cool/zhiqiangwang/pkg/logx"
"os"
)
func main() {
// 创建自定义日志实例,直接使用os.Stderr作为输出目标
logger := logx.New(logx.DebugLevel, os.Stderr)
logger.SetPrefix("[CUSTOM]") // 设置日志前缀
logger.SetExitLevel([]logx.Level{logx.EmergencyLevel, logx.FatalLevel}) // 设置触发程序退出的日志级别
// 使用自定义日志实例
logger.Info("这是使用自定义日志实例的信息")
logger.Debug("这是调试信息")
logger.Trace("这是跟踪信息")
}
// 也可以使用Default()获取默认的日志实例
func defaultLoggerExample() {
logger := logx.Default()
logger.Info("这是使用默认日志实例的信息")
}
logx 使用 LogEntry 结构体和 FormatFunc 类型来支持自定义日志格式化。LogEntry 包含了完整的日志信息,包括时间、级别、前缀、文件名、行号和消息内容。
import (
"cnb.cool/zhiqiangwang/pkg/logx"
"fmt"
"os"
)
// 自定义日志格式化函数
logx.SetFormatFunc(func(entry logx.LogEntry) string {
// 自定义格式:[时间] [级别] [前缀] 消息
return fmt.Sprintf("[%s] [%-9s] [%s] %s",
entry.Time.Format("2006-01-02 15:04:05"),
entry.Level.String(),
entry.Prefix,
entry.Message)
})
// 或者在自定义日志实例上设置
logger := logx.New(logx.DebugLevel, os.Stderr)
logger.SetFormatFunc(func(entry logx.LogEntry) string {
// 自定义格式:<时间> <级别> {前缀} {文件:行号} 消息
return fmt.Sprintf("<%s> <%s> {%s} {%s:%d} %s",
entry.Time.Format("15:04:05"),
entry.Level.String(),
entry.Prefix,
entry.File,
entry.Line,
entry.Message)
})
logx.Info("这是使用自定义格式的日志")
注意:New 函数接受两个参数:日志级别(Level 类型)和输出目标(io.Writer 类型)。这与标准库的 io 接口兼容,可以将日志输出到文件、网络连接等任何实现了 io.Writer 接口的对象。
LogEntry 是日志条目的核心数据结构,包含了完整的日志信息:
// LogEntry 日志条目结构体
type LogEntry struct {
Time time.Time // 日志发生的时间
Level Level // 日志等级(如 TRACE、INFO、ERROR 等)
Prefix string // 日志前缀,用于区分模块或子系统,可为空
CallDepth int // 堆栈深度,用于获取调用源位置(文件和行号)
File string // 日志所在文件路径(相对路径或经过格式化的路径)
Line int // 日志所在文件的行号
Message string // 日志内容正文
}
根据日志级别提供了11个输出方法:
| 方法名 | 日志级别 | 描述 | 是否导致程序退出 |
|---|---|---|---|
| Emergency | EmergencyLevel | 系统不可用,必须立即处理 | 是 |
| Panic | PanicLevel | 严重错误,导致panic | 是 |
| Fatal | FatalLevel | 严重错误,导致程序退出 | 是 |
| Alert | AlertLevel | 必须立即关注,需立刻处理 | 否 |
| Critical | CriticalLevel | 严重错误,关键功能失败 | 否 |
| Error | ErrorLevel | 一般错误,影响部分功能 | 否 |
| Warning/Warn | WarningLevel | 警告,潜在问题 | 否 |
| Notice | NoticeLevel | 正常但重要的事件 | 否 |
| Info | InfoLevel | 普通运行信息 | 否 |
| Debug | DebugLevel | 调试信息,较详细 | 否 |
| Trace | TraceLevel | 跟踪信息,最详细 | 否 |
github.com/fatih/color: 提供终端彩色输出功能fmt, os, sync, slices, path/filepath, runtime, time, ioSetExitLevel 方法自定义哪些级别的日志会导致程序退出SetWriter 方法自定义日志的输出目标SetFormatFunc 方法可以完全自定义日志的输出格式