golang轻量级日志记录插件库logger的使用

golang轻量级日志记录插件库logger的使用

logger是一个Go语言的极简日志记录库。

主要特性

  • 高级输出过滤器(按包和/或级别)
  • 自定义属性
  • 性能测量计时器
  • 结构化JSON输出
  • 编程式使用
  • 钩子功能
  • 自2014年起已在生产环境中使用

logger示例

安装

$ go get github.com/azer/logger

快速开始

创建一个带有名称的logger实例:

import "github.com/azer/logger"

var log = logger.New("example-app")

每个logger有三个主要方法:InfoTimerError

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

日志级别过滤

日志级别层次结构为:muteinfotimererror

$ LOG=*@timer go run example-app.go

上面的例子只显示timererror级别的日志。

过滤器

启用所有日志:

$ 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

1 回复

更多关于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", "数据库连接失败")
}

选择建议

  1. 需要高性能:选择Zerolog或Zap
  2. 需要结构化日志:Logrus或Zerolog
  3. 极简需求:标准库log或自定义实现
  4. 需要丰富的特性:Logrus

以上这些库都非常轻量级,可以根据项目需求选择合适的方案。大多数都支持日志级别、结构化输出、多种输出目标等核心功能。

回到顶部