topfans/backend/pkg/logger/README.md
2026-04-07 22:29:48 +08:00

203 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Logger 日志工具包
## 概述
统一的日志工具包,基于 [zap](https://github.com/uber-go/zap) 日志框架。所有微服务共享此包但每个服务独立初始化自己的logger实例。
## 特性
- ✅ 每个服务独立的logger实例
- ✅ 统一的日志格式和配置方式
- ✅ 支持开发和生产环境不同配置
- ✅ 自动添加服务名标识
- ✅ 结构化日志JSON格式生产环境
- ✅ 彩色控制台输出(开发环境)
- ✅ 支持日志文件输出(生产环境)
## 安装依赖
```bash
cd /Users/haihuizhu/infinite_matrix/top-fans/backend
go get go.uber.org/zap
go mod tidy
```
## 使用方法
### 1. 在服务中初始化
```go
package main
import (
"os"
"github.com/topfans/backend/pkg/logger"
)
func main() {
// 初始化日志(必须在最前面)
env := os.Getenv("ENV")
if env == "" {
env = "development"
}
if err := logger.Init(logger.Config{
ServiceName: "user-service", // 服务名称
Environment: env, // development 或 production
LogLevel: os.Getenv("LOG_LEVEL"), // debug, info, warn, error
LogPath: "", // 可选,默认为 "logs"
}); err != nil {
panic(fmt.Sprintf("Failed to initialize logger: %v", err))
}
defer logger.Sync() // 程序退出前刷新日志缓冲区
logger.Sugar.Info("Service started")
}
```
### 2. 使用Sugar API简单易用
```go
import "github.com/topfans/backend/pkg/logger"
// Info级别
logger.Sugar.Infof("User registered: mobile=%s, user_id=%d", mobile, userID)
// Error级别
logger.Sugar.Errorf("Failed to create user: %v", err)
// Debug级别
logger.Sugar.Debugf("Processing request: mobile=%s", mobile)
// Warn级别
logger.Sugar.Warnf("Token expired: user_id=%d", userID)
```
### 3. 使用结构化日志(推荐,性能更好)
```go
import (
"github.com/topfans/backend/pkg/logger"
"go.uber.org/zap"
)
// Info级别
logger.Logger.Info("User registered",
zap.String("mobile", mobile),
zap.Int64("user_id", userID),
zap.Int64("star_id", starID),
)
// Error级别
logger.Logger.Error("Failed to create user",
zap.String("mobile", mobile),
zap.Error(err),
)
// Debug级别
logger.Logger.Debug("Processing request",
zap.String("mobile", mobile),
)
```
## 环境变量配置
### 开发环境
```bash
export ENV=development
export LOG_LEVEL=debug
```
### 生产环境
```bash
export ENV=production
export LOG_LEVEL=info
export LOG_PATH=/var/log/user-service # 可选
```
## 日志格式
### 开发环境(控制台)
```
2024-01-01T10:00:00.000+0800 INFO service=user-service User registered {"mobile": "13800138000", "user_id": 123}
```
### 生产环境JSON格式
```json
{
"level": "info",
"ts": 1704067200.000,
"caller": "auth_service.go:45",
"msg": "User registered",
"service": "user-service",
"mobile": "13800138000",
"user_id": 123
}
```
## 日志文件
生产环境下,日志会同时输出到:
- `stdout` - 标准输出
- `logs/{service-name}.log` - 正常日志文件
- `logs/{service-name}-error.log` - 错误日志文件
日志目录会在初始化时自动创建。
## 最佳实践
1. **在main函数最开始初始化logger**
2. **使用结构化日志**`Logger.Info`而不是Sugar API生产环境
3. **不要记录敏感信息**密码、完整Token等
4. **记录关键操作**注册、登录、Token刷新等
5. **错误必须记录**,包含上下文信息
## API 文档
### Config
日志配置结构:
```go
type Config struct {
ServiceName string // 服务名称(必需)
Environment string // 环境development 或 production
LogLevel string // 日志级别debug, info, warn, error
LogPath string // 日志文件路径(可选)
}
```
### Init
初始化logger
```go
func Init(config Config) error
```
### Sync
刷新日志缓冲区(程序退出前调用):
```go
func Sync()
```
### GetLogger / GetSugar
获取logger实例用于依赖注入
```go
func GetLogger() *zap.Logger
func GetSugar() *zap.SugaredLogger
```
## 示例
完整示例请参考:`services/userService/main.go`