DSL de Logging
En esta página
Una familia de macros pequeños puede formar una mini-DSL — un
vocabulario específico de dominio sin necesidad de un framework externo.
Cada nivel (INFO, WARN, ERROR) se convierte en un macro dedicado
que prefija el mensaje automáticamente. El argumento es cualquier
expresión de cadena, incluidas las interpolaciones.
El macro log_at! agrega un campo de hora, mostrando cómo componer
macros con aridad variable para enriquecer el contexto:
log_info!, log_warn!, log_error! y log_at! formando una DSL de log concisa.
// Feature: Mini logging DSL with macros
// Syntax: several small macros that prefix messages with a level
// When to use: standardize log format without needing a framework;
// makes the level visually obvious in code.
macro log_info(msg) {
print("[INFO ] {$msg}")
}
macro log_warn(msg) {
print("[WARN ] {$msg}")
}
macro log_error(msg) {
print("[ERROR] {$msg}")
}
// Direct usage.
log_info!("server started")
log_warn!("slow connection")
log_error!("database timeout")
// expected:
// [INFO ] server started
// [WARN ] slow connection
// [ERROR] database timeout
// Combined with interpolation — the argument is any expr.
let user = "alice"
let attempts = 3
log_warn!("user {user} tried {attempts} times")
// expected: [WARN ] user alice tried 3 times
// Composed macro: log with simulated timestamp.
macro log_at(when, level, msg) {
print("[{$when}][{$level}] {$msg}")
}
log_at!("12:00:01", "INFO", "boot complete")
// expected: [12:00:01][INFO] boot complete
Desafío
Agrega un macro log_debug!(msg) que imprima "[DEBUG] msg", pero solo
cuando una variable let debug_mode = true esté definida en el ámbito.
Usa pick! del capítulo de múltiples parámetros para condicionar la
impresión.
Consulta también