glog

package
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 25, 2025 License: MIT Imports: 25 Imported by: 12

README

GMC Log 模块

简介

GMC Log 模块提供强大的日志记录功能,支持多种输出格式、异步日志、日志分级、日志分组等特性。

功能特性

  • 多级别日志:支持 Trace、Debug、Info、Warn、Error、Panic、Fatal
  • 多种格式:支持 Text、JSON 格式
  • 异步日志:支持异步写入,提高性能
  • 日志分组:支持多个独立的日志实例
  • 灵活输出:支持输出到文件、标准输出、自定义 Writer
  • 调用栈:错误日志自动记录调用栈
  • 日志轮转:支持按大小和时间轮转
  • 颜色输出:终端输出支持颜色

快速开始

基本使用
package main

import (
    "github.com/snail007/gmc/module/log"
)

func main() {
    logger := glog.New()
    
    // 不同级别的日志
    logger.Trace("trace message")
    logger.Debug("debug message")
    logger.Info("info message")
    logger.Warn("warn message")
    logger.Error("error message")
    
    // 格式化输出
    logger.Infof("User %s logged in", "John")
    logger.Errorf("Failed to connect: %v", err)
}
从配置初始化
package main

import (
    "github.com/snail007/gmc"
)

func main() {
    cfg := gmc.New.Config()
    cfg.SetConfigFile("app.toml")
    cfg.ReadInConfig()
    
    // 从配置初始化日志
    logger := gmc.New.Logger(cfg.Sub("log"))
    
    logger.Info("Application started")
}
异步日志
package main

import (
    "github.com/snail007/gmc/module/log"
)

func main() {
    logger := glog.New()
    logger.EnableAsync() // 启用异步
    
    defer logger.WaitAsyncDone() // 等待异步日志写入完成
    
    for i := 0; i < 1000; i++ {
        logger.Infof("Message %d", i)
    }
}
日志分组
package main

import (
    "github.com/snail007/gmc/module/log"
)

func main() {
    // 访问日志
    accessLog := glog.NewLogger("access")
    accessLog.Info("User visited homepage")
    
    // 错误日志
    errorLog := glog.NewLogger("error")
    errorLog.Error("Database connection failed")
    
    // 业务日志
    bizLog := glog.NewLogger("business")
    bizLog.Info("Order created")
}

配置文件

app.toml 日志配置
[log]
# 日志输出: stdout, stderr, file
output = "stdout"

# 日志级别: trace, debug, info, warn, error, panic, fatal
level = "info"

# 日志格式: text, json
format = "text"

# 启用异步日志
async = false

# 文件输出配置
[[log.file]]
name = "app"
level = "info"
# 日志文件路径
path = "./logs/app.log"
# 最大大小(MB)
maxsize = 100
# 保留文件数
maxbackups = 10
# 保留天数
maxage = 30
# 是否压缩
compress = true

# 错误日志文件
[[log.file]]
name = "error"
level = "error"
path = "./logs/error.log"
maxsize = 100
maxbackups = 10
maxage = 90
compress = true

API 参考

创建 Logger
// 创建新 Logger
func New() gcore.Logger

// 创建命名 Logger
func NewLogger(name string) gcore.Logger

// 从配置创建
func NewFromConfig(cfg gcore.Config, prefix string) gcore.Logger
日志方法
// 基本日志方法
Trace(args ...interface{})
Debug(args ...interface{})
Info(args ...interface{})
Warn(args ...interface{})
Error(args ...interface{})
Panic(args ...interface{})
Fatal(args ...interface{})

// 格式化日志方法
Tracef(format string, args ...interface{})
Debugf(format string, args ...interface{})
Infof(format string, args ...interface{})
Warnf(format string, args ...interface{})
Errorf(format string, args ...interface{})
Panicf(format string, args ...interface{})
Fatalf(format string, args ...interface{})

// 带字段的日志
WithFields(fields map[string]interface{}) gcore.Logger
配置方法
// 设置日志级别
SetLevel(level string)

// 启用/禁用异步
EnableAsync()
DisableAsync()

// 是否异步
Async() bool

// 等待异步日志完成
WaitAsyncDone()

// 设置输出
SetOutput(w io.Writer)

// 设置格式
SetFormat(format string) // "text" or "json"

使用场景

  1. 应用日志:记录应用运行状态
  2. 访问日志:记录 HTTP 请求
  3. 错误日志:记录错误和异常
  4. 审计日志:记录关键操作
  5. 调试日志:开发调试

最佳实践

1. 结构化日志
logger.WithFields(map[string]interface{}{
    "user_id": 123,
    "action":  "login",
    "ip":      "192.168.1.1",
}).Info("User logged in")
2. 错误日志带上下文
if err != nil {
    logger.WithFields(map[string]interface{}{
        "error":  err.Error(),
        "method": "ProcessOrder",
        "order_id": orderId,
    }).Error("Failed to process order")
}
3. 使用不同日志级别
// 开发环境
logger.SetLevel("debug")

// 生产环境
logger.SetLevel("info")

// 仅错误
logger.SetLevel("error")
4. 异步日志提升性能
logger := glog.New()
logger.EnableAsync()

// 确保程序退出前日志写入完成
defer logger.WaitAsyncDone()

性能考虑

  • 异步日志:高并发场景使用异步日志
  • 日志级别:生产环境设置为 info 或 warn
  • 日志轮转:及时清理旧日志文件
  • JSON 格式:结构化日志便于分析但性能稍差

注意事项

  1. Fatal 和 Panic:会导致程序终止或 panic
  2. 异步日志:程序退出前需调用 WaitAsyncDone()
  3. 文件权限:确保对日志目录有写权限
  4. 日志大小:注意日志文件大小,及时轮转

相关链接

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	DiscardLogger = New()
)
View Source
var ErrShortWrite = errors.New("short write")

Functions

func AddLevelWriter

func AddLevelWriter(writer io.Writer, level gcore.LogLevel) gcore.Logger

func AddLevelsWriter

func AddLevelsWriter(writer io.Writer, levels ...gcore.LogLevel) gcore.Logger

func AddWriter

func AddWriter(writer gcore.LoggerWriter) gcore.Logger

func Async

func Async() bool

func Debug

func Debug(v ...interface{})

func Debugf

func Debugf(format string, v ...interface{})

func DefaultLogger

func DefaultLogger() gcore.Logger

func EnableAsync

func EnableAsync()

func Error

func Error(v ...interface{})

func Errorf

func Errorf(format string, v ...interface{})

func ExitCode

func ExitCode() int

func ExitFunc

func ExitFunc() func(int)

func Fatal

func Fatal(v ...interface{})

func Fatalf

func Fatalf(format string, v ...interface{})

func Info

func Info(v ...interface{})

func Infof

func Infof(format string, v ...interface{})

func Level

func Level() gcore.LogLevel

func Namespace

func Namespace() string

func New

func New(prefix ...string) gcore.Logger

func NewFromConfig

func NewFromConfig(c gcore.Config, prefix ...string) (l gcore.Logger)

func NewIOWriter

func NewIOWriter(w gcore.LoggerWriter) io.Writer

func NewLoggerWriter

func NewLoggerWriter(w io.Writer) gcore.LoggerWriter

func Panic

func Panic(v ...interface{})

func Panicf

func Panicf(format string, v ...interface{})

func SetAsyncBufferSize

func SetAsyncBufferSize(size int)

func SetErrHandler

func SetErrHandler(h func(err error))

func SetExitCode

func SetExitCode(code int)

func SetExitFunc

func SetExitFunc(exitFunc func(int))

func SetFlag

func SetFlag(f gcore.LogFlag)

func SetLevel

func SetLevel(level gcore.LogLevel)

func SetOutput

func SetOutput(w gcore.LoggerWriter)

func SetRateCallback

func SetRateCallback(cb func(msg string)) gcore.Logger

func SetTimeLayout

func SetTimeLayout(layout string)

func Trace

func Trace(v ...interface{})

func Tracef

func Tracef(format string, v ...interface{})

func WaitAsyncDone

func WaitAsyncDone()

func Warn

func Warn(v ...interface{})

func Warnf

func Warnf(format string, v ...interface{})

func With

func With(name string) gcore.Logger

func WithRate

func WithRate(duration time.Duration) gcore.Logger

func Write

func Write(s string, level gcore.LogLevel)

func WriteRaw

func WriteRaw(s string, level gcore.LogLevel)

func Writer

func Writer() gcore.LoggerWriter

Types

type ConsoleWriter

type ConsoleWriter struct {
	// contains filtered or unexported fields
}

func NewConsoleWriter

func NewConsoleWriter() *ConsoleWriter

func (*ConsoleWriter) Write

func (s *ConsoleWriter) Write(p []byte, level gcore.LogLevel) (n int, err error)

type FileWriter

type FileWriter struct {
	// contains filtered or unexported fields
}

func NewFileWriter

func NewFileWriter(opt *FileWriterOption) (w *FileWriter)

func NewFileWriterE

func NewFileWriterE(opt *FileWriterOption) (w *FileWriter, err error)

func (*FileWriter) ToWriter

func (s *FileWriter) ToWriter() io.Writer

func (*FileWriter) Write

func (s *FileWriter) Write(p []byte, _ gcore.LogLevel) (n int, err error)

type FileWriterOption

type FileWriterOption struct {
	// Filename log file name, if AliasFilename is empty,
	// this will also be used as the current log file name.
	Filename string
	// LogsDir sets the log files store in
	LogsDir string
	// ArchiveDir sets the backups directory in the LogsDir
	ArchiveDir string
	// IsGzip sets if compress the backups
	IsGzip bool
	// AliasFilename current log file name
	AliasFilename string
	// MaxSize  max size of log file, example: 1M, 2G, empty no limit.
	MaxSize string
	// MaxBackups max backups of log files, 0 no limit
	MaxBackups int
	// contains filtered or unexported fields
}

FileWriterOption 1. the current log file final path is: LogsDir/Filename 2. the current backup log file final path is: LogsDir/ArchiveDir/Filename ArchiveDir and Filename can contain: %Y: represents the year, will be replaced such as: 2012 %m: represents the month, will be replaced such as: 12 %d: represents the day of month, will be replaced such as: 31 %h: represents the hour, will be replaced such as: 23 %i: represents the minute, will be replaced such as: 36 %s: represents the second, will be replaced such as: 00 Example of ArchiveDir: "%Y%m%d", ArchiveDir will be split by day. ArchiveDir can't contain: / Example of Filename: "access_log_%Y%m%d%h.log", logfile will be split by hour.

type IOWriter

type IOWriter struct {
	// contains filtered or unexported fields
}

func (*IOWriter) Write

func (s *IOWriter) Write(p []byte) (n int, err error)

type JSONLogger

type JSONLogger struct {
	// contains filtered or unexported fields
}

func (*JSONLogger) Any

func (l *JSONLogger) Any(key string, value interface{}) *JSONLogger

func (*JSONLogger) Bool

func (l *JSONLogger) Bool(key string, value bool) *JSONLogger

func (*JSONLogger) Debugf

func (l *JSONLogger) Debugf(format string, values ...interface{}) string

func (*JSONLogger) Duration

func (l *JSONLogger) Duration(key string, value time.Duration) *JSONLogger

func (*JSONLogger) Errorf

func (l *JSONLogger) Errorf(format string, values ...interface{}) string

func (*JSONLogger) Fatalf

func (l *JSONLogger) Fatalf(format string, values ...interface{})

func (*JSONLogger) Float32

func (l *JSONLogger) Float32(key string, value float32) *JSONLogger

func (*JSONLogger) Float64

func (l *JSONLogger) Float64(key string, value float64) *JSONLogger

func (*JSONLogger) Infof

func (l *JSONLogger) Infof(format string, values ...interface{}) string

func (*JSONLogger) Int

func (l *JSONLogger) Int(key string, value int) *JSONLogger

func (*JSONLogger) Int32

func (l *JSONLogger) Int32(key string, value int32) *JSONLogger

func (*JSONLogger) Int64

func (l *JSONLogger) Int64(key string, value int64) *JSONLogger

func (*JSONLogger) Panic

func (l *JSONLogger) Panic(msg string)

func (*JSONLogger) Panicf

func (l *JSONLogger) Panicf(format string, values ...interface{})

func (*JSONLogger) String

func (l *JSONLogger) String(key string, value string) *JSONLogger

func (*JSONLogger) Time

func (l *JSONLogger) Time(key string, value time.Time) *JSONLogger

func (*JSONLogger) Tracef

func (l *JSONLogger) Tracef(format string, values ...interface{}) string

func (*JSONLogger) Uint

func (l *JSONLogger) Uint(key string, value uint) *JSONLogger

func (*JSONLogger) Uint8

func (l *JSONLogger) Uint8(key string, value uint8) *JSONLogger

func (*JSONLogger) Uint32

func (l *JSONLogger) Uint32(key string, value uint32) *JSONLogger

func (*JSONLogger) Uint64

func (l *JSONLogger) Uint64(key string, value uint64) *JSONLogger

func (*JSONLogger) Warnf

func (l *JSONLogger) Warnf(format string, values ...interface{}) string

type Logger

type Logger struct {
	// contains filtered or unexported fields
}

func NewLogger

func NewLogger(prefix ...string) *Logger

func (*Logger) AddLevelWriter

func (s *Logger) AddLevelWriter(w io.Writer, level gcore.LogLevel) gcore.Logger

AddLevelWriter add a writer logging "after and the level", info is after trace, all ordered levels: trace->debug->info->warn->error->panic->fatal->none

func (*Logger) AddLevelsWriter

func (s *Logger) AddLevelsWriter(w io.Writer, levels ...gcore.LogLevel) gcore.Logger

AddLevelsWriter add a writer only logging these levels

func (*Logger) AddWriter

func (s *Logger) AddWriter(w gcore.LoggerWriter) gcore.Logger

func (*Logger) Async

func (s *Logger) Async() bool

func (*Logger) CallerSkip

func (s *Logger) CallerSkip() int

func (*Logger) Debug

func (s *Logger) Debug(v ...interface{})

func (*Logger) Debugf

func (s *Logger) Debugf(format string, v ...interface{})

func (*Logger) EnableAsync

func (s *Logger) EnableAsync()

func (*Logger) Error

func (s *Logger) Error(v ...interface{})

func (*Logger) Errorf

func (s *Logger) Errorf(format string, v ...interface{})

func (*Logger) ExitCode

func (s *Logger) ExitCode() int

func (*Logger) ExitFunc

func (s *Logger) ExitFunc() func(int)

func (*Logger) Fatal

func (s *Logger) Fatal(v ...interface{})

func (*Logger) Fatalf

func (s *Logger) Fatalf(format string, v ...interface{})

func (*Logger) Info

func (s *Logger) Info(v ...interface{})

func (*Logger) Infof

func (s *Logger) Infof(format string, v ...interface{})

func (*Logger) JSON

func (s *Logger) JSON() *JSONLogger

func (*Logger) Level

func (s *Logger) Level() gcore.LogLevel

func (*Logger) Namespace

func (s *Logger) Namespace() string

func (*Logger) Panic

func (s *Logger) Panic(v ...interface{})

func (*Logger) Panicf

func (s *Logger) Panicf(format string, v ...interface{})

func (*Logger) SetAsyncBufferSize

func (s *Logger) SetAsyncBufferSize(asyncBufferSize int)

func (*Logger) SetCallerSkip

func (s *Logger) SetCallerSkip(callerSkip int)

func (*Logger) SetErrHandler

func (s *Logger) SetErrHandler(errHandler func(error))

func (*Logger) SetExitCode

func (s *Logger) SetExitCode(exitCode int)

func (*Logger) SetExitFunc

func (s *Logger) SetExitFunc(exitFunc func(int))

func (*Logger) SetFlag

func (s *Logger) SetFlag(f gcore.LogFlag)

func (*Logger) SetLevel

func (s *Logger) SetLevel(i gcore.LogLevel)

func (*Logger) SetOutput

func (s *Logger) SetOutput(w gcore.LoggerWriter)

func (*Logger) SetRateCallback

func (s *Logger) SetRateCallback(cb func(msg string)) gcore.Logger

func (*Logger) SetTimeLayout

func (s *Logger) SetTimeLayout(layout string)

func (*Logger) Trace

func (s *Logger) Trace(v ...interface{})

func (*Logger) Tracef

func (s *Logger) Tracef(format string, v ...interface{})

func (*Logger) WaitAsyncDone

func (s *Logger) WaitAsyncDone()

func (*Logger) Warn

func (s *Logger) Warn(v ...interface{})

func (*Logger) Warnf

func (s *Logger) Warnf(format string, v ...interface{})

func (*Logger) With

func (s *Logger) With(namespace string) gcore.Logger

func (*Logger) WithRate

func (s *Logger) WithRate(duration time.Duration) gcore.Logger

func (*Logger) Write

func (s *Logger) Write(msg string, level gcore.LogLevel)

func (*Logger) WriteRaw

func (s *Logger) WriteRaw(msg string, level gcore.LogLevel)

func (*Logger) Writer

func (s *Logger) Writer() gcore.LoggerWriter

type LoggerWriter

type LoggerWriter struct {
	// contains filtered or unexported fields
}

func (*LoggerWriter) Write

func (s *LoggerWriter) Write(p []byte, _ gcore.LogLevel) (n int, err error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL