feat(logger): slog-based logger with JSON and text handlers

This commit is contained in:
2026-04-28 13:53:02 +08:00
parent baf296abfb
commit b4933a6fd1
2 changed files with 122 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
package logger
import (
"bytes"
"encoding/json"
"strings"
"testing"
"github.com/stretchr/testify/require"
)
func TestNew_JSONHandler_WritesStructured(t *testing.T) {
var buf bytes.Buffer
log := New(Options{Format: FormatJSON, Level: LevelInfo, Writer: &buf})
log.Info("hello", "key", "value")
var got map[string]any
require.NoError(t, json.Unmarshal(buf.Bytes(), &got))
require.Equal(t, "hello", got["msg"])
require.Equal(t, "value", got["key"])
require.Equal(t, "INFO", got["level"])
}
func TestNew_TextHandler_HumanReadable(t *testing.T) {
var buf bytes.Buffer
log := New(Options{Format: FormatText, Level: LevelDebug, Writer: &buf})
log.Debug("dev message", "x", 1)
require.Contains(t, buf.String(), "dev message")
}
func TestNew_LevelFilter(t *testing.T) {
var buf bytes.Buffer
log := New(Options{Format: FormatJSON, Level: LevelWarn, Writer: &buf})
log.Info("should be filtered")
require.Empty(t, strings.TrimSpace(buf.String()))
}
func TestFromEnv_DevelopmentUsesText(t *testing.T) {
var buf bytes.Buffer
log := FromEnv("development", &buf)
log.Debug("dev", "k", "v")
out := buf.String()
require.Contains(t, out, "dev")
// text handler outputs key=value pairs (not JSON braces)
require.NotContains(t, out, `"msg":`)
}
func TestFromEnv_NonDevelopmentUsesJSON(t *testing.T) {
var buf bytes.Buffer
log := FromEnv("production", &buf)
// Debug should be filtered (JSON default level is Info)
log.Debug("filtered")
require.Empty(t, strings.TrimSpace(buf.String()))
log.Info("prod")
var got map[string]any
require.NoError(t, json.Unmarshal(buf.Bytes(), &got))
require.Equal(t, "prod", got["msg"])
}