go-logging

Use when choosing a logging approach, configuring slog, writing structured log statements, or deciding log levels in Go. Also use when setting up production logging, adding request-scoped context to logs, or migrating from log to slog, even if the user doesn't explicitly mention logging. Does not co

By cxuu · 887 installs

npx skills add cxuu/golang-skills --skill go-logging

Source repository · Upstream listing

Go Logging Compatibility: log/slog requires Go 1.21+; testing/slogtest requires Go 1.22+. Resource Routing references/LEVELS AND CONTEXT.md Read when choosing log levels, deciding logger in context versus explicit parameters, or excluding sensitive fields. references/LOGGING PATTERNS.md Read when configuring slog handlers, logging HTTP requests, testing handlers, or migrating from log.Printf . Core Principle Logs are for operators , not developers. Every log line should help someone diagnose a production issue. If it doesn't serve that purpose, it's noise. Choosing a Logger Normative : Use log/slog for new Go code. slog is structured, leveled, and in the standard library (Go 1.21+). It covers the vast majority of production logging needs. Do not introduce a third party logging library unless profiling shows slog is a bottleneck in your hot path. When you do, keep the same structured key value style. Structured Logging Normative : Always use key value pairs. Never interpolate values into the message string. The message is a static description of what happened. Dynamic data goes in key value attributes: Key Naming Advisory : Use snake case for log attribute keys. Keys should be lowercase, underscore separated, and consistent across the codebase: user id , request id , elapsed ms . Typed Attributes For performance critical paths, use typed constructors to avoid allocations: Log Levels Advisory : Follow these level semantics consistently. Level When to use Production default Debug Developer only diagnostics, tracing internal state Disabled Info Notable lifecycle events: startup, shutdown, config loaded Enabled Warn Unexpected but recoverable: deprecated feature used, retry succeeded Enabled Error Operation failed, requires operator attention Enabled Rules of thumb : If nobody should act on it, it's not Error — use Warn or Info If it's only useful with a debugger attached, it's Debug slog.Error should always include an "err" attribute Request Scoped Logging Advisory : Derive loggers from context to carry request scoped fields. Use middleware to enrich a logger with request ID, user ID, or trace ID, then pass the enriched logger downstream via context or as an explicit parameter. Keep the full context key and middleware implementation in the logging patterns reference so request scoped logging has one owner. Log or Return, Not Both The handle once rule belongs to [go error handling](../go error handling/SKILL.md). In logging work, apply it by choosing either a local log and recover path or a return path with context, not both for the same error. Exception : HTTP handlers and other top of stack boundaries may log detailed errors server side while returning a sanitized message to the client: See [go error handling](../go error handling/SKILL.md) for the full handle once pattern and error wrapping guidance. What NOT to Log Normative : Never log secrets, credentials, PII, or high cardinality unbounded data. Passwords, API keys, tokens, session IDs Full credit card numbers, SSNs Request/response bodies that may contain user data Entire slices or maps of unbounded size Quick Reference Do Don't slog.Info("msg", "key", val) log.Printf("msg %v", val) Static message + structured fields fmt.Sprintf in message snake case keys camelCase or inconsistent keys Log OR return errors Log AND return the same error Derive logger from context Create a new logger per call Use slog.Error with "err" attr slog.Info for errors Pre check Enabled() on hot paths Always allocate log args Related Skills Error handling : See [go error handling](../go error handling/SKILL.md) when deciding whether to log or return an error, or for the handle once pattern Context propagation : See [go context](../go context/SKILL.md) when passing request scoped values (including loggers) through context Performance : See [go performance](../go performance/SKILL.md) when optimizing hot path logging or reducing allocations in log calls Code review : See [go code review](../go code review/SKILL.md) when reviewing logging practices in Go PRs