К основному содержанию
скилл CX Codex

go-logging — скилл для Claude Code: логирование в Go через slog

Скилл для ИИ-агента, который подсказывает, как писать логи в Go: уровни, структурные поля, контекст запроса. Пригодится, когда проект на Go обрастает логами и надо навести порядок.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add cxuu/golang-skills --skill go-logging -a claude-code
Открыть на GitHub

Что делает go-logging

Скилл задаёт агенту правила логирования в Go. Новый код — только log/slog из стандартной библиотеки. Сторонние библиотеки вроде zerolog или zap скилл советует брать лишь после бенчмарка, если профилирование показало узкое место в горячем пути.

Сообщение — статичное описание события, данные идут парами ключ-значение: slog.Info("order placed", "order_id", orderID, "total", total). Ключи в snake_case, для горячих путей есть типизированные конструкторы вроде slog.String и slog.Int, чтобы не тратить аллокации. Уровни расписаны по смыслу: Debug выключен в продакшене, Info для старта и остановки, Warn для восстановимых сбоев, Error — когда операция упала и нужен человек. У slog.Error всегда должен быть атрибут "err".

Внутри два справочника: references/LEVELS-AND-CONTEXT.md про выбор уровней и передачу логгера, references/LOGGING-PATTERNS.md про настройку хендлеров, логирование HTTP-запросов и переезд с log.Printf. Для log/slog нужен Go 1.21+, а testing/slogtest требует Go 1.22+. Скилл не разбирает стратегию обработки ошибок — это отдельный go-error-handling, и правило «логируй или возвращай, но не то и другое сразу» живёт там.

Какие задачи решает

  • выбрать логгер для нового сервиса на Go
  • переписать log.Printf на структурные логи
  • разложить события по уровням без лишнего шума
  • добавить request_id и user_id в логи через контекст
  • убрать из логов токены, пароли и тела запросов

Примеры запросов агенту

  • Настрой логирование в этом Go-сервисе на slog
  • Переведи эти вызовы log.Printf на структурные логи
  • Проверь уровни логирования в этом хендлере — не многовато ли Error

Как установить go-logging

1Через Skills CLI (Vercel)

npx skills add cxuu/golang-skills --skill go-logging -a claude-code

2Вручную: положить файлы

~/.claude/skills/go-logging/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/go-logging/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора19

go-naming Скилл следит за именами в Go: пакеты, типы, функции, константы, получатели. Пригодится, когда агент создаёт новые типы или экспортируемое API. CX Codex +1 1 200установок go-context Задаёт правила работы с context.Context в Go: от сигнатур функций и таймаутов до разделения данных запроса и параметров. CX Codex +1 1 200установок go-style-core Скилл задаёт базовые правила оформления Go-кода: отступы, вложенность, naked returns, точки с запятой. Пригодится, когда агент пишет или правит код на Go. CX Codex +1 1 200установок go-performance Скилл для оптимизации Go: подсказывает, где заменить fmt на strconv, как задать ёмкость слайса и когда хватит strings.Builder. CX Codex +1 1 200установок go-interfaces Направляет агента при проектировании интерфейсов в Go, композиции типов и проверке контрактов. Помогает избежать преждевременных абстракций в публичном API. CX Codex +1 1 200установок go-declarations Скилл для ИИ-агента, который подсказывает, как объявлять переменные, константы, структуры и мапы в Go. Пригодится, когда пишете новый struct или блок const. CX Codex +1 1 000установок go-generics Скилл подсказывает, когда в Go стоит брать дженерики, а когда хватит конкретных типов или интерфейса. Полезен, если пишете утилиту под несколько типов. CX Codex +1 1 000установок go-functions Скилл задаёт правила порядка функций в файле Go, оформления сигнатур и форматирования строк. Пригодится при написании или рефакторинге методов. CX Codex +1 1 000установок

Похожие

logging-best-practices Mindrally Скилл задаёт правила логирования: структурный JSON, уровни, общие поля и работа с контекстом запроса. Пригодится, когда логи в проекте пишут кто как хочет. CX Codex +1 791установок golang-samber-slog samber Помогает проектировать пайплайны структурированного логирования на Go с пакетами samber/slog-*. Настраивает фильтрацию, семплирование и отправку логов в разные бэкенды. CX Codex +1 38 300установок golang-samber-oops samber Скилл добавляет в Claude Code, Cursor и другие IDE знание о samber/oops — библиотеке для структурированной обработки ошибок в Go с контекстом, стек-трейсами, кодами ошибок и сообщениями для пользователя. CX Codex +1 38 200установок logging codewithmukesh Скилл про наблюдаемость в .NET 10: разводит liveness и readiness, прокидывает correlation ID и задаёт уровни логов. CX Codex +1 2 800установок review-logging-patterns HugoRCD Скилл разбирает логирование в TypeScript-проекте: находит console.log-спам, ошибки без контекста и предлагает перейти на evlog. CX Codex +1 750установок sentry-instrument-logging getsentry Добавляет в приложение структурные логи Sentry: агент сам находит сервисы в репозитории и расставляет сообщения по общим правилам. CX Codex +1 533установок

Рядом в теме «Языки программирования»

Все скиллы по теме «Языки программирования» →

Вопросы о go-logging

Как установить go-logging в Claude?

Выполните npx skills add cxuu/golang-skills --skill go-logging -a claude-code. Скилл появится по пути ~/.claude/skills/go-logging/SKILL.md.

Что делает go-logging?

Подсказывает агенту, как писать логи в Go: какой логгер взять, как оформлять поля, какие уровни использовать и что в логи класть нельзя.

Какая версия Go нужна?

Для log/slog — Go 1.21 и выше, для testing/slogtest — Go 1.22 и выше.

Исходный текст

SKILL.md · Apache-2.0
---
name: go-logging
description: 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 cover error handling strategy (see go-error-handling).
---

# 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.

```
Which logger?
├─ New production code      → log/slog
├─ Trivial CLI / one-off    → log (standard)
└─ Measured perf bottleneck → zerolog or zap (benchmark first)
```

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:

```go
// Good: static message, structured fields
slog.Info("order placed", "order_id", orderID, "total", total)

// Bad: dynamic data baked into the message string
slog.Info(fmt.Sprintf("order %d placed for $%.2f", orderID, total))
```

### 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:

```go
slog.LogAttrs(ctx, slog.LevelInfo, "request handled",
    slog.String("method", r.Method),
    slog.Int("status", code),
    slog.Duration("elapsed", elapsed),
)
```

---

## 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

```go
slog.Error("payment failed", "err", err, "order_id", id)
slog.Warn("retry succeeded", "attempt", n, "endpoint", url)
slog.Info("server started", "addr", addr)
slog.Debug("cache lookup", "key", key, "hit", hit)
```

---

## 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:

```go
if err != nil {
    slog.Error("checkout failed", "err", err, "user_id", uid)
    http.Error(w, "internal error", http.StatusInternalServerError)
    return
}
```

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

© cxuu · Apache-2.0 · cxuu/golang-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой