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
虽然简单易用,但在高性能场景下可能不够高效,因为:
- 每次日志调用都会获取锁
- 缺乏日志级别控制
- 不支持结构化日志
对于高性能或更复杂的需求,可以考虑zerolog、zap或logrus等第三方日志库。
总结
Go标准库log
包提供了:
- 简单易用的日志功能
- 基本的格式化和前缀控制
- 并发安全支持
- 输出重定向能力
虽然功能相对基础,但对于小型应用或简单日志需求已经足够。对于更复杂的日志需求,建议考虑功能更丰富的第三方日志库。