beasty-save-system / guides / logging.md
Logging
El save system te cuenta lo que hizo. Por defecto lo hace en el editor y en las builds de desarrollo, y se
calla en una build de release: un juego publicado no debería escribir una línea en player.log cada vez
que autoguarda.
El interruptor
Selecciona tu BeastySaveManager y mira Logging.

| Modo | Qué obtienes |
|---|---|
| Auto (por defecto) | Activo en el editor y en builds de desarrollo, apagado en builds de release. |
| On | Cada guardado, carga, borrado y restauración, en todas las builds. |
| Verbose | Lo anterior, más una línea por componente capturado o aplicado, la resolución de rutas, los sondeos, y qué convertidores y migraciones se registraron. |
| Off | Nada de nada, ni siquiera los errores. |
Mover el desplegable con el juego en marcha surte efecto al momento: sin reiniciar, sin recompilar. Ese es justo el objetivo — un bug se reproduce, cambias a Verbose y lo reproduces otra vez con el detalle puesto.
El manager acciona un único interruptor global, así que el modo que elijas gobierna todo el save system,
incluido el código que llama a BeastySave directamente. Si no hay manager en la escena, lo que tienes es
Auto.
Qué pinta tiene
En On:

[BeastySave] Saved 'slot1' — 4.2 KB, 8 ms, 12 saveables
[BeastySave] Loaded 'slot1' — 6 ms, 12 saveables
[BeastySave] Migrated 'slot1' data v1 → v2
[BeastySave] Deleted 'slot1'
[BeastySave] Restored 'slot1' from backup — 3 ms
Más los avisos y errores que siempre estuvieron ahí: una carga que falló, un campo omitido por una carga tolerante, un id de saveable usado dos veces, y el que más importa —
[BeastySave] 'slot1' failed its checksum; backup NOT rotated (any existing .bak is left untouched).
Esa línea significa que el slot en disco está dañado y que el sistema se negó a machacar con él el .bak.
Al jugador le queda un guardado para perder su partida y la copia de seguridad es lo único que le queda.
Ofrécele BeastySave.RestoreBackup; consulta backups-and-corruption.md.
En Verbose, súmale el detalle:
[BeastySave] Player/Transform captured
[BeastySave] Chest_02/Health captured
[BeastySave] Save 'slot1' — encryption on, backup on, data version 2
[BeastySave] Exists 'slot1' → True
Todas las líneas llevan la etiqueta [BeastySave], así que puedes filtrar la consola por ella.
Verbose también trae el diagnóstico de cargas: cada carga registra cuánto texto devolvió el backend y cuántos ids y entradas guardables contiene el documento, y cada operación en la nube registra el id de usuario resuelto — los datos que necesitas cuando una carga «funciona» pero el mundo no cambia. Una carga que no aplica nada ni siquiera necesita Verbose: avisa con todo el detalle en lugar de terminar bien en silencio. Con Firestore, Verbose dice además si una lectura vino del servidor o de la caché sin conexión del SDK — lo primero que comprobar cuando un dispositivo muestra datos de la nube desactualizados.
Desde código
El desplegable es una fachada para BeastySaveLog, que es público:
using Beasty_SaveSystemCore;
BeastySaveLog.Level = BeastySaveLogLevel.Verbose; // Off, Normal, Verbose
BeastySaveLog.Level = BeastySaveLog.DefaultLevel; // vuelve a lo que hace Auto
BeastySaveLog.EnableLogs sigue ahí y sigue funcionando: false es Off, true es Normal.
Si fijas el nivel desde código, el manager lo sobrescribirá la próxima vez que se ejecute su OnEnable o su
OnValidate — al entrar en modo Play, o al tocar tú su inspector. Si quieres que el nivel lo controle el
código, deja el manager en el modo que quieras y no lo toques más.
Mandar los logs a otro sitio
Asigna un sink y cada línea se va a donde tú quieras — tu propia consola, un archivo, un reportador de bugs:
public sealed class FileSink : IBeastySaveLogSink
{
public void Info(string message) => File.AppendAllText("save.log", message + "\n");
public void Warning(string message) => Info("WARN " + message);
public void Error(string message) => Info("ERROR " + message);
}
BeastySaveLog.Sink = new FileSink();
Las líneas de Verbose llegan a tu sink a través de Info.
Si no hay sink asignado, la primera línea de log elige uno: el asset Beasty Console si está en el
proyecto (lo detecta por reflexión — los dos assets se distribuyen por separado y ninguno necesita al otro),
y UnityEngine.Debug en caso contrario.
Rendimiento
El logging no cuesta nada medible en Auto dentro de una build de release: el nivel es Off y cada llamada
retorna antes de tocar un sink. Las líneas Verbose por componente están protegidas para que ni siquiera
construyan su mensaje a menos que Verbose esté activo.
Ver también
- Copias de seguridad y corrupción — el aviso del checksum de arriba, y qué hacer al respecto
- Componentes —
BeastySaveManager, el componente que aloja el desplegable Logging - Resultados y errores — los códigos de error detrás de los mensajes
- Solución de problemas