golang轻量级日志记录插件库logger的使用
golang轻量级日志记录插件库logger的使用
logger是一个Go语言的极简日志记录库。
主要特性
- 高级输出过滤器(按包和/或级别)
- 自定义属性
- 性能测量计时器
- 结构化JSON输出
- 编程式使用
- 钩子功能
- 自2014年起已在生产环境中使用
安装
$ go get github.com/azer/logger
快速开始
创建一个带有名称的logger实例:
import "github.com/azer/logger"
var log = logger.New("example-app")
每个logger有三个主要方法:Info
、Timer
和Error
。
log.Info("Running at %d", 8080)
err := DoSomething()
if err != nil {
log.Error("Failed: %s", err.Error())
}
运行程序时,需要通过LOG=*
环境变量启用日志输出(默认情况下日志是静默的):
$ LOG=* go run example-app.go
01:23:21.251 example-app Running at 8080
日志级别过滤
日志级别层次结构为:mute
、info
、timer
和error
。
$ LOG=*@timer go run example-app.go
上面的例子只显示timer
和error
级别的日志。
过滤器
启用所有日志:
$ LOG=* go run example-app.go
或者只显示特定包的日志:
$ LOG=images,users go run example-app.go
另一个例子:显示所有包的error日志,但隐藏database
包的日志:
$ LOG=*@error,database@mute go run example-app.go
计时器
可以使用计时器日志来测量程序性能:
timer := log.Timer()
image, err := PullImage("http://foo.com/bar.jpg")
timer.End("Fetched foo.com/bar.jpg")
结构化输出
当程序不在终端运行时,会输出JSON格式的日志:
{ "time":"2014-10-04 11:44:22.418595705 -0700 PDT", "package":"database", "level":"INFO", "msg":"Connecting to mysql://azer@localhost:9900/foobar" }
{ "time":"2014-10-04 11:44:22.418600851 -0700 PDT", "package":"images", "level":"INFO", "msg":"Requesting an image at foo/bar.jpg" }
{ "time":"2014-10-04 11:44:22.668645527 -0700 PDT", "package":"images", "level":"TIMER", "elapsed":"250032416", "msg":"Fetched foo/bar.jpg" }
{ "time":"2014-10-04 11:44:22.668665527 -0700 PDT", "package":"database", "level":"ERROR", "msg":"Fatal connection error." }
自定义属性
可以向结构化输出添加自定义属性:
log.Info("Sending an e-mail...", logger.Attrs{
"from": "foo@bar.com",
"to": "qux@corge.com",
})
在命令行中的显示效果:
编程式使用
可以自定义默认行为,实现自己的输出:
import (
"github.com/azer/logger"
)
type CustomWriter struct {}
func (cw CustomWriter) Write (log *logger.Log) {
fmt.Println("custom log -> ", log.Package, log.Level, log.Message, log.Attrs)
}
func main () {
logger.Hook(&CustomWriter{})
}
钩子
- Slack: 将日志流式传输到Slack频道
更多关于golang轻量级日志记录插件库logger的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang轻量级日志记录插件库logger的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang轻量级日志记录插件库Logger使用指南
在Go语言开发中,日志记录是一个非常重要的功能。下面我将介绍几个流行的轻量级日志库及其使用方法。
1. 标准库log
Go标准库自带了一个简单的日志记录器:
package main
import (
"log"
"os"
)
func main() {
// 基本使用
log.Println("这是一条普通日志")
// 设置前缀
log.SetPrefix("MyApp: ")
// 设置输出位置
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
defer file.Close()
log.SetOutput(file)
// 带格式的日志
log.Printf("用户 %s 登录成功", "张三")
// 致命错误(会调用os.Exit(1))
// log.Fatal("致命错误发生")
// 带调用栈的错误
// log.Panic("发生panic")
}
2. Zerolog - 高性能轻量级日志库
Zerolog是一个高性能、零分配的JSON日志库:
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"os"
"time"
)
func main() {
// 控制台输出(美化格式)
zerolog.TimeFieldFormat = time.RFC3339
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
// 基本日志
log.Info().Str("user", "张三").Msg("用户登录")
// 带多个字段
log.Debug().
Str("path", "/api/login").
Int("status", 200).
Dur("duration", time.Millisecond*120).
Msg("请求处理完成")
// 错误日志
err := someFunction()
if err != nil {
log.Error().Err(err).Msg("操作失败")
}
// 设置全局日志级别
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}
func someFunction() error {
return nil
}
3. Zap - Uber开源的日志库
Zap是Uber开发的高性能日志库:
package main
import (
"go.uber.org/zap"
"time"
)
func main() {
// 生产环境配置(JSON格式)
logger, _ := zap.NewProduction()
defer logger.Sync() // 刷新缓冲区
// 开发环境配置(控制台友好格式)
// logger, _ := zap.NewDevelopment()
// 基本使用
logger.Info("用户登录",
zap.String("username", "张三"),
zap.Int("attempt", 3),
zap.Duration("duration", time.Second),
)
// 带sugar的语法糖
sugar := logger.Sugar()
sugar.Infow("用户操作",
"user", "李四",
"action", "delete",
"itemID", 12345,
)
sugar.Infof("处理完成, 耗时: %v", time.Second)
}
4. Logrus - 结构化日志库
Logrus是另一个流行的结构化日志库:
package main
import (
"github.com/sirupsen/logrus"
"os"
)
func main() {
// 基本配置
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetOutput(os.Stdout)
logrus.SetLevel(logrus.InfoLevel)
// 添加字段
log := logrus.WithFields(logrus.Fields{
"app": "myapp",
"env": "production",
})
// 记录日志
log.Info("应用启动")
log.Warn("内存使用较高")
// 带额外字段
log.WithFields(logrus.Fields{
"user": "王五",
"ip": "192.168.1.1",
}).Error("登录失败")
}
5. 自定义轻量级日志器
如果需要极简方案,可以自己实现:
package main
import (
"fmt"
"io"
"os"
"sync"
"time"
)
type Logger struct {
out io.Writer
mu sync.Mutex
}
func NewLogger(out io.Writer) *Logger {
return &Logger{out: out}
}
func (l *Logger) Log(level, msg string) {
l.mu.Lock()
defer l.mu.Unlock()
timestamp := time.Now().Format("2006-01-02 15:04:05")
logEntry := fmt.Sprintf("[%s] %s: %s\n", timestamp, level, msg)
l.out.Write([]byte(logEntry))
}
func main() {
logger := NewLogger(os.Stdout)
logger.Log("INFO", "应用启动")
logger.Log("WARN", "配置未找到, 使用默认值")
logger.Log("ERROR", "数据库连接失败")
}
选择建议
- 需要高性能:选择Zerolog或Zap
- 需要结构化日志:Logrus或Zerolog
- 极简需求:标准库log或自定义实现
- 需要丰富的特性:Logrus
以上这些库都非常轻量级,可以根据项目需求选择合适的方案。大多数都支持日志级别、结构化输出、多种输出目标等核心功能。