golang开箱即用的简单日志记录框架插件库log的使用

golang开箱即用的简单日志记录框架插件库log的使用

安装

go get -u github.com/no-src/log

快速开始

当前支持以下日志记录器:

  • 空日志记录器
  • 控制台日志记录器
  • 文件日志记录器
  • 多重日志记录器
  • 采样日志记录器

例如,初始化一个控制台日志记录器来写入日志:

package main

import (
	"errors"

	"github.com/no-src/log"
	"github.com/no-src/log/level"
)

func main() {
	// 初始化控制台日志记录器作为默认日志记录器
	// 可以用你需要的任何日志记录器替换这行代码
	log.InitDefaultLogger(log.NewConsoleLogger(level.DebugLevel))

	defer log.Close()

	text := "hello world"
	// 使用默认日志记录器写入日志
	log.Debug("%s, test debug log", text)
	log.Info("%s, test info log", text)
	log.Warn("%s, test warn log", text)
	log.Error(errors.New("log err"), "%s, test error log", text)
	log.ErrorIf(errors.New("log err"), "%s, test error log", text)
	log.Log("%s, test log log", text)
}

日志记录器

空日志记录器

初始化空日志记录器作为默认日志记录器。

log.InitDefaultLogger(log.NewEmptyLogger())

控制台日志记录器

初始化控制台日志记录器作为默认日志记录器。

log.InitDefaultLogger(log.NewConsoleLogger(level.DebugLevel))

文件日志记录器

初始化文件日志记录器作为默认日志记录器。

if logger, err := log.NewFileLogger(level.DebugLevel, "./logs", "default_"); err == nil {
    log.InitDefaultLogger(logger)
} else {
    log.Error(err, "init file logger error")
}

多重日志记录器

初始化多重日志记录器作为默认日志记录器。

if logger, err := log.NewFileLogger(level.DebugLevel, "./logs", "multi_"); err == nil {
    log.InitDefaultLogger(log.NewMultiLogger(log.NewConsoleLogger(level.DebugLevel), logger))
} else {
    log.Error(err, "init file logger error")
}

采样日志记录器

初始化控制台日志记录器作为默认日志记录器并设置采样率,默认为1。

log.InitDefaultLoggerWithSample(log.NewConsoleLogger(level.DebugLevel), 0.6)

使用默认日志记录器通过随机采样写入日志。

text := "hello world"
log.DebugSample("[sample] %s, test debug log", text)
log.InfoSample("[sample] %s, test info log", text)
log.WarnSample("[sample] %s, test warn log", text)
log.ErrorSample(errors.New("log err"), "[sample] %s, test error log", text)
log.ErrorIfSample(errors.New("log err from ErrorIfSample"), "[sample] %s, test error log", text)

更多关于golang开箱即用的简单日志记录框架插件库log的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang开箱即用的简单日志记录框架插件库log的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go语言标准库log使用指南

Go语言标准库中的log包提供了一个简单但功能完备的日志记录系统,适合大多数基本日志需求。下面详细介绍其使用方法。

基本使用

package main

import (
	"log"
	"os"
)

func main() {
	// 最简单的日志输出
	log.Println("这是一条普通日志")

	// 带格式的日志输出
	log.Printf("这是一条格式化日志: %s", "format example")

	// 致命错误日志(会调用os.Exit(1))
	// log.Fatalln("这是一条致命错误日志")

	// 异常日志(会抛出panic)
	// log.Panicln("这是一条异常日志")
}

日志配置

package main

import (
	"log"
	"os"
)

func main() {
	// 创建自定义logger
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal("打开日志文件失败:", err)
	}
	defer file.Close()

	// 自定义logger
	customLogger := log.New(file, "APP: ", log.Ldate|log.Ltime|log.Lshortfile)

	// 使用自定义logger
	customLogger.Println("这是一条自定义日志")
	customLogger.Printf("这是一条带格式的自定义日志: %d", 123)
}

日志标志位

log包提供了多种标志位来定制日志前缀格式:

const (
	Ldate         = 1 << iota     // 日期: 2009/01/23
	Ltime                         // 时间: 01:23:23
	Lmicroseconds                 // 微秒级时间: 01:23:23.123123
	Llongfile                     // 完整文件名和行号: /a/b/c/d.go:23
	Lshortfile                    // 简短文件名和行号: d.go:23
	LUTC                          // 使用UTC时间
	Lmsgprefix                    // 将前缀从消息开头移动到消息之前
	LstdFlags     = Ldate | Ltime // 标准logger的初始值
)

使用示例:

package main

import "log"

func main() {
	// 设置全局logger的标志
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
	log.Println("这是一条带日期、时间和文件位置的日志")
}

日志前缀

可以自定义日志前缀:

package main

import "log"

func main() {
	// 设置全局logger的前缀
	log.SetPrefix("MYAPP: ")
	log.Println("这是一条带自定义前缀的日志")
}

输出重定向

可以将日志输出重定向到其他io.Writer

package main

import (
	"bytes"
	"log"
	"os"
)

func main() {
	var buf bytes.Buffer
	
	// 设置日志输出到buffer
	log.SetOutput(&buf)
	log.Println("这条日志会写入buffer")
	
	// 恢复默认输出到stderr
	log.SetOutput(os.Stderr)
	
	// 输出buffer内容
	os.Stdout.Write(buf.Bytes())
}

并发安全

标准库的log是并发安全的,可以在多个goroutine中安全使用:

package main

import (
	"log"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(n int) {
			defer wg.Done()
			log.Printf("来自goroutine %d的日志", n)
		}(i)
	}
	
	wg.Wait()
	log.Println("所有goroutine完成")
}

性能考虑

标准库log虽然简单易用,但在高性能场景下可能不够高效,因为:

  1. 每次日志调用都会获取锁
  2. 缺乏日志级别控制
  3. 不支持结构化日志

对于高性能或更复杂的需求,可以考虑zerolog、zap或logrus等第三方日志库。

总结

Go标准库log包提供了:

  • 简单易用的日志功能
  • 基本的格式化和前缀控制
  • 并发安全支持
  • 输出重定向能力

虽然功能相对基础,但对于小型应用或简单日志需求已经足够。对于更复杂的日志需求,建议考虑功能更丰富的第三方日志库。

回到顶部