You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang简易日志实现进阶咨询:含slog、分级等需求的方案建议

基于Go 1.21+ slog的分级日志实现方案

核心设计思路

针对你的需求,直接用Go 1.21引入的slog标准库实现是当前最简洁高效的方案——它原生支持日志分级、结构化输出,还能轻松拆分为独立包。我们会明确区分通用消息日志和错误日志,同时封装成单独的logger包。

独立日志包实现示例

1. 包结构

your-project/
└── logger/
    ├── logger.go
    └── go.mod

2. logger.go 代码实现

package logger

import (
	"log/slog"
	"os"
)

// 全局日志实例,区分通用日志与错误日志
var (
	// 通用消息日志:输出到stdout,包含info/warn级别
	General *slog.Logger
	// 错误日志:输出到stderr,仅包含error级别
	Error *slog.Logger
)

func init() {
	// 通用日志配置
	generalHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
		Level: slog.LevelInfo,
	})
	General = slog.New(generalHandler)

	// 错误日志配置
	errorHandler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
		Level: slog.LevelError,
	})
	Error = slog.New(errorHandler)
}

// 封装快捷调用方法
func Info(msg string, args ...any) {
	General.Info(msg, args...)
}

func Warn(msg string, args ...any) {
	General.Warn(msg, args...)
}

func Error(msg string, args ...any) {
	Error.Error(msg, args...)
}

// 支持结构化字段扩展
func With(args ...any) *slog.Logger {
	return General.With(args...)
}

项目中调用示例

package main

import "your-project/logger"

func main() {
	// 通用info级日志
	logger.Info("服务启动完成", "port", 8080, "env", "production")

	// 警告级日志
	logger.Warn("可选配置缺失", "key", "LOG_ROTATE_SIZE")

	// 错误级日志(输出到stderr)
	logger.Error("数据库连接失败", "err", "connection refused")

	// 带结构化字段的日志
	userLogger := logger.With("user_id", 1001)
	userLogger.Info("用户登录成功")
}

额外优化建议

  • 自定义级别扩展:如果需要Debug级日志,只需将HandlerOptions.Level改为slog.LevelDebug,并添加Debug快捷方法即可。
  • 日志持久化与轮转:若需将日志写入文件并自动轮转,可配合lumberjack这类库,替换slog.NewTextHandler的输出目标为轮转文件实例即可。
  • JSON格式输出:把slog.NewTextHandler替换为slog.NewJSONHandler,就能输出JSON格式日志,方便日志分析系统解析。
  • 环境动态适配:通过读取环境变量(如LOG_LEVEL),在init函数中动态设置日志级别,实现开发环境输出Debug、生产环境仅输出Info及以上的适配。

内容的提问来源于stack exchange,提问作者oleh babinskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:22:14