Una sola línea de tiempo
Los registros del core y los del frontend cuentan medias historias. Cómo se juntan en una sola secuencia y qué revela poder leerla entera.
El problema
La solución: un identificador por operación
Lo que resuelve el emparejamiento y es sorprendentemente barato:
#[tauri::command]async fn guardar_proyecto(id: ProyectoId, datos: Datos) -> Result<(), Error> { let op = Uuid::new_v4(); // o un contador log::info!(op = %op, "guardar_proyecto: inicio id={id}"); let r = repo.guardar(id, datos).await; log::info!(op = %op, "guardar_proyecto: fin {:?}", r.is_ok()); r}Y en el frontend, el mismo identificador — generado allí y pasado como argumento, o devuelto por el core y registrado.
Con eso, buscar el identificador en los dos registros da la historia completa de una operación, aunque hubiera diez en vuelo.
Juntar las dos salidas
Tres formas, de más simple a mejor:
La segunda es la que más rinde a largo plazo porque es la que sirve para diagnosticar a distancia: un usuario manda un fichero y ahí está todo.
Y hay que tener cuidado con el bucle: si el frontend manda sus mensajes al core y el core devuelve los suyos a la consola, un mensaje puede dar vueltas. Uno de los dos sentidos, no los dos a la vez.
Qué registrar
Lo que revela poder leerla entera
Y es la razón de hacer este trabajo:
- Cuántas llamadas hace de verdad una acción del usuario. Casi siempre más de las que uno cree.
- Dónde se va el tiempo. El nivel 42.5 con datos en vez de sospechas.
- Qué ocurre en el arranque, en orden, que es el nivel 57.
- Y las operaciones que se solapan de formas que no habías previsto.
El primer punto suele ser el más revelador: una acción que uno cree que hace una consulta resulta hacer nueve, tres de ellas idénticas.