---
name: Logger
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type Logger struct {
      Level  LogLevel
      Output io.Writer
      Format string
      Fields map[string]any
      inner  *slog.Logger
  }
description: "Wrapper sobre slog.Logger con config del registry: nivel, destino (io.Writer), formato (json/text) y campos contextuales inmutables."
tags: [logging, log, slog, logger, infra]
uses_types: [LogLevel_go_infra]
file_path: "functions/infra/logger.go"
---

## Ejemplo

```go
logger, err := LoggerNew(LogLevelInfo, os.Stdout, "json")
if err != nil {
    log.Fatal(err)
}
appLog := LoggerWith(logger, map[string]any{"app": "sqlite_api"})
LogInfo(appLog, "server starting", "port", 8484)
```

## Notas

Tipo producto — los campos publicos describen la config y los fields contextuales. El campo privado `inner` es la instancia real de `slog.Logger` que escribe. Se construye con `LoggerNew` (impuro) y se clona con `LoggerWith` (puro). Nunca se muta despues de creado.
