logo
4
5
Login
The repository has been archived and is now in read-only mode.

logx

logx 是一个Go语言实现的简单、灵活的日志模块,提供了多级日志支持、彩色输出、自定义格式和并发安全等功能。

功能特点

  • 支持11个日志级别(从Emergency到Trace)
  • 彩色日志输出,不同级别显示不同颜色
  • 灵活的日志配置(可设置输出级别、调用深度、退出级别等)
  • 全局日志实例,线程安全的单例模式
  • 支持设置日志前缀
  • 支持设置自定义输出目标
  • 支持自定义日志格式化输出
  • 清晰的接口设计,兼容PHP和Golang风格的日志方法
  • 并发安全的实现

文件结构

  • level.go: 定义日志级别枚举和相关方法
  • log.go: 提供全局日志实例和简化的日志函数
  • logger.go: 定义日志接口和核心实现

日志级别

logx 支持以下日志级别,按照代码中定义的顺序(从高到低):

级别枚举值颜色描述是否导致程序退出
Emergency0红色加粗系统不可用,必须立即处理
Panic1红色加粗严重错误,导致panic
Fatal2红色加粗严重错误,导致程序退出
Alert3品红色加粗必须立即关注,需立刻处理
Critical4亮品红色加粗严重错误,关键功能失败
Error5亮红色一般错误,影响部分功能
Warning/Warn6黄色警告,潜在问题
Notice7亮青色正常但重要的事件
Info8白色普通运行信息
Debug9蓝色调试信息,较详细
Trace10亮黑色跟踪信息,最详细

安装

使用以下命令安装 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 是日志条目的核心数据结构,包含了完整的日志信息:

// LogEntry 日志条目结构体 type LogEntry struct { Time time.Time // 日志发生的时间 Level Level // 日志等级(如 TRACE、INFO、ERROR 等) Prefix string // 日志前缀,用于区分模块或子系统,可为空 CallDepth int // 堆栈深度,用于获取调用源位置(文件和行号) File string // 日志所在文件路径(相对路径或经过格式化的路径) Line int // 日志所在文件的行号 Message string // 日志内容正文 }

主要配置方法

  • SetLevel(level Level): 设置日志输出级别,只有小于等于该级别的日志才会输出
  • SetPrefix(p string): 设置日志前缀,方便区分不同模块的日志
  • SetFormatFunc(format FormatFunc): 设置自定义的日志格式化函数
  • SetExitLevel(levels []Level): 设置哪些级别的日志会导致程序退出
  • SetWriter(w io.Writer): 设置日志输出目标,可以是文件、网络连接等

日志输出方法

根据日志级别提供了11个输出方法:

方法名日志级别描述是否导致程序退出
EmergencyEmergencyLevel系统不可用,必须立即处理
PanicPanicLevel严重错误,导致panic
FatalFatalLevel严重错误,导致程序退出
AlertAlertLevel必须立即关注,需立刻处理
CriticalCriticalLevel严重错误,关键功能失败
ErrorErrorLevel一般错误,影响部分功能
Warning/WarnWarningLevel警告,潜在问题
NoticeNoticeLevel正常但重要的事件
InfoInfoLevel普通运行信息
DebugDebugLevel调试信息,较详细
TraceTraceLevel跟踪信息,最详细

依赖

  • github.com/fatih/color: 提供终端彩色输出功能
  • Go标准库 fmt, os, sync, slices, path/filepath, runtime, time, io

注意事项

  • 默认情况下,全局日志实例的级别设置为TraceLevel,这意味着会输出所有级别的日志
  • 默认情况下,EmergencyLevel、PanicLevel和FatalLevel的日志会导致程序退出
  • 可以通过 SetExitLevel 方法自定义哪些级别的日志会导致程序退出
  • 日志级别设置后,高于该级别的日志将不会输出(例如,设置为InfoLevel时,Debug和Trace级别的日志将不会输出)
  • 设置前缀可以方便地区分不同模块的日志
  • 可以通过 SetWriter 方法自定义日志的输出目标
  • 通过 SetFormatFunc 方法可以完全自定义日志的输出格式
  • 所有公共方法都是并发安全的
  • 全局日志实例使用单例模式确保线程安全

About

这个日志库基于 Go 标准库和 fatih/color 封装,支持多级别日志输出并带有彩色高亮,跨平台兼容,能直观地区分不同级别日志,适合开发与生产环境使用。

704.00 KiB
4 forks5 stars1 branches8 TagREADMEApache-2.0 license
Language
Go49.8%
License23.3%
Markdown23.2%
gitignore3.7%