第三方日志库

除了 Go 标准库的 logslog,还有许多功能强大且灵活的第三方日志库。这些库通常提供更丰富的功能,如结构化日志、日志级别、钩子机制等,适合复杂的日志需求。

1. logrus

1.1 安装与基本使用
go get github.com/sirupsen/logrus
package main

import (
	"github.com/sirupsen/logrus"
)

func main() {
	logger := logrus.New()
	logger.Info("This is an info message")
	logger.Warn("This is a warning message")
	logger.Error("This is an error message")
}
1.2 日志级别和钩子
logger.SetLevel(logrus.WarnLevel)

logger.Info("This will not be logged")
logger.Warn("This will be logged")

logger.AddHook(&CustomHook{})
1.3 自定义格式化器和输出
logger.SetFormatter(&logrus.JSONFormatter{})

file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY, 0666)
if err == nil {
	logger.SetOutput(file)
} else {
	logger.Info("Failed to log to file, using default stderr")
}
1.4 实践案例
package main

import (
	"github.com/sirupsen/logrus"
	"os"
)

func main() {
	logger := logrus.New()

	logger.SetFormatter(&logrus.JSONFormatter{})
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY, 0666)
	if err == nil {
		logger.SetOutput(file)
	} else {
		logger.Info("Failed to log to file, using default stderr")
	}

	logger.WithFields(logrus.Fields{
		"event": "event",
		"topic": "topic",
		"key":   "value",
	}).Info("This is a structured log message")
}

2. zap

2.1 安装与基本使用
go get go.uber.org/zap
package main

import (
	"go.uber.org/zap"
)

func main() {
	logger, _ := zap.NewProduction()
	defer logger.Sync()

	logger.Info("This is an info message")
	logger.Warn("This is a warning message")
	logger.Error("This is an error message")
}
2.2 性能优化
logger, _ := zap.NewProduction(zap.WithCaller(false))
2.3 结构化日志
logger.Info("This is a structured log message",
	zap.String("key1", "value1"),
	zap.Int("key2", 123))
2.4 配置与示例
config := zap.NewProductionConfig()
config.OutputPaths = []string{"stdout", "app.log"}
logger, _ := config.Build()

logger.Info("This is an info message with custom configuration")
2.5 实践案例
package main

import (
	"go.uber.org/zap"
)

func main() {
	logger, _ := zap.NewProduction()
	defer logger.Sync()

	sugar := logger.Sugar()
	sugar.Infow("This is a structured log message",
		"key1", "value1",
		"key2", 123)
}

3. zerolog

3.1 安装与基本使用
go get github.com/rs/zerolog/log
package main

import (
	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
	"os"
)

func main() {
	log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})

	log.Info().Msg("This is an info message")
	log.Warn().Msg("This is a warning message")
	log.Error().Msg("This is an error message")
}
3.2 最小开销和高效日志
log.Info().Str("key1", "value1").Int("key2", 123).Msg("This is a structured log message")
3.3 使用 JSON 格式记录日志
log.Logger = log.Output(os.Stdout)
log.Info().Msg("This is a log message in JSON format")
3.4 实践案例
package main

import (
	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
	"os"
)

func main() {
	log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})

	log.Info().Str("key1", "value1").Int("key2", 123).Msg("This is a structured log message")
}

4. 比较与选择

4.1 不同日志库的比较
  • logrus:功能全面,支持钩子、自定义格式化器和输出,但性能相对较低。
  • zap:高性能,支持结构化日志,适合需要高效日志记录的应用。
  • zerolog:最小开销,高效日志,采用 JSON 格式,适合需要高性能和低开销的场景。
4.2 选择合适的日志库
  • 根据应用的性能要求和功能需求选择合适的日志库。
  • 考虑日志库的易用性和可扩展性。
  • 在高并发和高性能场景下,优先选择 zapzerolog