---
name: test_capture_logs
kind: function
lang: go
domain: core
version: "1.0.0"
purity: impure
signature: "func TestCaptureLogs(t *testing.T) (*bytes.Buffer, func() []string)"
description: "Redirige log.SetOutput a un buffer para capturar logs durante un test. Retorna el buffer y una funcion que restaura el writer original y devuelve las lineas capturadas como slice. Registra t.Cleanup automaticamente."
tags: [testing, logging, capture, test_helper, log]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["bytes", "log", "strings", "testing"]
params:
  - name: t
    desc: "testing.T del test actual; usado para t.Helper() y registrar t.Cleanup"
output: "(*bytes.Buffer, func() []string) — buffer con el output crudo de log, y funcion flush que restaura el writer y retorna las lineas capturadas"
tested: true
tests:
  - "log.Print capturado en el buffer"
  - "flush retorna lineas separadas"
  - "sin logs flush retorna nil"
  - "log restaurado al original tras flush"
test_file_path: "functions/core/test_capture_logs_test.go"
file_path: "functions/core/test_capture_logs.go"
---

## Ejemplo

```go
buf, flush := TestCaptureLogs(t)

log.Print("starting process")
log.Print("done")

lines := flush()
// lines == ["starting process", "done"]
// buf.String() == "starting process\ndone\n"
```

## Notas

Funcion impura — modifica el estado global de log.SetOutput.
No es segura para tests paralelos.
Setea log.SetFlags(0) para eliminar timestamps y facilitar asserts exactos.
La funcion flush puede llamarse multiples veces — siempre retorna las mismas lineas del buffer acumulado.
