--- name: logger_with kind: function lang: go domain: infra version: "1.0.0" purity: pure signature: "func LoggerWith(logger *Logger, fields map[string]any) *Logger" description: "Retorna una copia del Logger con campos contextuales adicionales. No muta el logger original — los campos se apilan sobre los existentes y aparecen en cada entrada del nuevo logger." tags: [logging, log, slog, logger, context, pure, infra, pendiente-usar] uses_functions: [] uses_types: [Logger_go_infra] returns: [Logger_go_infra] returns_optional: false error_type: "" imports: [sort] params: - name: logger desc: "Logger base a clonar. Si es nil retorna nil" - name: fields desc: "mapa de campos key-value a anadir al logger (ej: {\"app\": \"api\", \"request_id\": \"abc\"})" output: "nuevo Logger con los fields combinados (los del parametro tienen precedencia sobre los del logger base)" tested: true tests: ["anade campos al logger", "no muta el logger original", "apila fields sobre un logger ya contextualizado", "retorna nil si recibe nil"] test_file_path: "functions/infra/logger_test.go" file_path: "functions/infra/logger_with.go" --- ## Ejemplo ```go base, _ := LoggerNew(LogLevelInfo, os.Stdout, "json") appLog := LoggerWith(base, map[string]any{"app": "sqlite_api", "version": "1.0.0"}) reqLog := LoggerWith(appLog, map[string]any{"request_id": "abc-123"}) LogInfo(reqLog, "evento") // {"...","msg":"evento","app":"sqlite_api","version":"1.0.0","request_id":"abc-123"} ``` ## Notas Funcion pura — no hace I/O, no muta estado. Internamente llama a `slog.Logger.With()` que ya retorna un nuevo logger. Los campos se pasan en orden alfabetico a `With()` para que el output sea determinista (util para tests). El campo `Fields` del `*Logger` mantiene la union combinada (base + nuevos) para permitir inspeccion programatica.