c5b4ffda65
- logger_new (impuro): construye *Logger con handler JSON/text segun formato - logger_with (puro): clona el Logger anadiendo campos contextuales via slog.With Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package infra
|
|
|
|
import "sort"
|
|
|
|
// LoggerWith retorna una copia del Logger con campos adicionales.
|
|
// No muta el logger original — los campos se apilan sobre los ya existentes.
|
|
// Funcion pura: misma entrada produce siempre la misma salida sin I/O.
|
|
func LoggerWith(logger *Logger, fields map[string]any) *Logger {
|
|
if logger == nil {
|
|
return nil
|
|
}
|
|
|
|
// Combinar fields existentes + nuevos (los nuevos tienen precedencia)
|
|
combined := make(map[string]any, len(logger.Fields)+len(fields))
|
|
for k, v := range logger.Fields {
|
|
combined[k] = v
|
|
}
|
|
for k, v := range fields {
|
|
combined[k] = v
|
|
}
|
|
|
|
// Convertir a args key-value ordenados para slog.With (orden determinista)
|
|
keys := make([]string, 0, len(fields))
|
|
for k := range fields {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
|
|
args := make([]any, 0, len(keys)*2)
|
|
for _, k := range keys {
|
|
args = append(args, k, fields[k])
|
|
}
|
|
|
|
var inner = logger.inner
|
|
if inner != nil && len(args) > 0 {
|
|
inner = inner.With(args...)
|
|
}
|
|
|
|
return &Logger{
|
|
Level: logger.Level,
|
|
Output: logger.Output,
|
|
Format: logger.Format,
|
|
Fields: combined,
|
|
inner: inner,
|
|
}
|
|
}
|