Files
agentic-coding-workflow/internal/infra/logger/logger.go
T

67 lines
1.9 KiB
Go

// Package logger 提供基于标准库 log/slog 的结构化日志器封装:
// 统一的 Format / Level 选项,以及按环境区分默认值的 FromEnv 便利函数。
package logger
import (
"io"
"log/slog"
"os"
)
// Format 表示日志输出格式。
type Format string
// 支持的输出格式。
const (
FormatJSON Format = "json"
FormatText Format = "text"
)
// Level 是 slog.Level 的类型别名,方便外部直接使用本包常量而无需引入 log/slog。
type Level = slog.Level
// 常用日志级别(与 slog 同名常量等价)。
const (
LevelDebug = slog.LevelDebug
LevelInfo = slog.LevelInfo
LevelWarn = slog.LevelWarn
LevelError = slog.LevelError
)
// Options 控制日志器的输出格式、最低级别、目标 Writer 与是否记录调用位置。
// Writer 留空时默认写入 os.Stdout。
// AddSource 为 true 时日志附带调用文件:行号;零值 false(开发环境噪声大,按需开启)。
type Options struct {
Format Format
Level Level
Writer io.Writer
AddSource bool
}
// New 按 Options 构造一个 *slog.Logger。Format 非 FormatText 时一律使用 JSON handler。
func New(opt Options) *slog.Logger {
w := opt.Writer
if w == nil {
w = os.Stdout
}
hopts := &slog.HandlerOptions{Level: opt.Level, AddSource: opt.AddSource}
var h slog.Handler
switch opt.Format {
case FormatText:
h = slog.NewTextHandler(w, hopts)
default:
h = slog.NewJSONHandler(w, hopts)
}
return slog.New(h)
}
// FromEnv 根据环境名返回合适默认:
// - development → text + debug,不含 source(开发噪声大)
// - 其他(production/staging/test)→ json + info,含 source(spec §8.2 caller 必填)
func FromEnv(env string, w io.Writer) *slog.Logger {
if env == "development" {
return New(Options{Format: FormatText, Level: LevelDebug, Writer: w})
}
return New(Options{Format: FormatJSON, Level: LevelInfo, Writer: w, AddSource: true})
}