beasty-debug-logger / guides / logging.md
Logging
Cómo llamar a la API, y — la parte que importa — qué nivel elegir, para que los niveles todavía signifiquen algo seis meses después de iniciado un proyecto.
La llamada
Todo está en una sola clase estática. Agrega el namespace una vez por archivo:
using BeastyDebugLoggerConsole;
BeastyDebugLogger.LogInfo("Scene initialization complete.");
Cada método de nivel toma los mismos tres argumentos: el mensaje, un flag opcional canPrint, y un objeto
opcional context.
BeastyDebugLogger.LogWarning("Missing AudioClip on SoundManager.", true, gameObject);
Los niveles, y cuándo usar cada uno
Elige el nivel desde el punto de vista del lector: ¿qué necesita saber alguien que está revisando la consola con esta línea?
Log — sin nivel, sin etiqueta. Un mensaje que no clasificaste.
BeastyDebugLogger.Log("Reached the end of the tutorial.");
LogInfo — el estado normal del mundo. Algo se completó, y todo está bien. Úsalo para los eventos que
querrías ver en una corrida limpia: una escena cargada, una config leída, un jugador conectado.
BeastyDebugLogger.LogInfo("Config file loaded.");
LogVerbose — el detalle detrás de una línea de info. El mismo evento, pero con el payload. Úsalo
cuando la línea de info dice “player data serialized” y a veces necesitas ver qué contenía.
BeastyDebugLogger.LogVerbose("Serializing player data: { id=42, level=7 }");
LogTrace — flujo de control. Qué método se ejecutó, qué corrutina inició, a qué estado se movió la
máquina. Úsalo cuando el bug es “nunca llegó ahí”, no “el valor estaba mal”.
BeastyDebugLogger.LogTrace("EnterState() called on StateMachine.");
LogDebug — valores. El contenido de una variable en un momento que te importa. Este es el nivel que
usas sin parar mientras cazas un bug y que apagas después.
BeastyDebugLogger.LogDebug("Inventory slots: 24, used: 7");
LogNotice — un evento que no es un problema pero que no quieres que se te pase de largo. Un hito: se
alcanzó el límite de nivel, se desbloqueó un logro, un nuevo puntaje máximo.
BeastyDebugLogger.LogNotice("Player reached level cap (50).");
LogHighlight — énfasis visual, nada más. Úsalo para que una línea resalte en una corrida larga: el
momento en que empieza una pelea contra un jefe, la rama que tomó un playtest.
BeastyDebugLogger.LogHighlight("Cutscene triggered: Ending A");
LogCaution — una alerta suave. Algo no está bien, pero nada se rompió: un frame tardó demasiado, la
memoria está subiendo, un asset no estaba en caché y hubo que descargarlo. Úsalo para las cosas que quieres
notar sin tratarlas como advertencias.
BeastyDebugLogger.LogCaution("Frame budget exceeded: 18ms (target 16ms).");
LogSuccess — la confirmación al final de una operación que podía haber fallado. Se escribió un save,
se completó un handshake, un paso de build pasó.
BeastyDebugLogger.LogSuccess("Save file written.");
LogWarning — algo está mal y un humano debería mirarlo, pero el juego sigue funcionando. Una
referencia faltante, una llamada obsoleta, una clave de config que cayó a un valor por defecto.
BeastyDebugLogger.LogWarning("Config key 'volume' not found, using default.");
LogError — una operación falló. El save no cargó, el request expiró (timeout). El juego puede
continuar, pero algo que el jugador pidió no ocurrió.
BeastyDebugLogger.LogError("Failed to load save slot 2: file corrupted.");
LogException — capturaste una excepción y quieres el stack trace. Este toma una Exception, no un
string.
try { LoadProfile(); }
catch (System.Exception e) { BeastyDebugLogger.LogException(e); }
Solo tres niveles elevan la severidad de Unity
Grábate esto antes de crear un hábito alrededor de LogCaution:
Advertencia Solo
LogWarning,LogErroryLogExceptionelevan la severidad de Unity. Todo lo demás — incluyendoLogCaution— es unDebug.Lognormal.
LogCaution es una alerta suave. Está coloreada, está etiquetada, y la Beasty Console le da su propio
filtro y contador. Pero para Unity es un log ordinario, así que:
- no dispara Error Pause;
- no aparece como una advertencia en la propia Consola de Unity;
- no hace fallar una build.
Si necesitas que Unity trate el mensaje como una advertencia, llama a LogWarning.
El objeto context
El tercer argumento es un UnityEngine.Object. Pasa uno y la entrada de log se vuelve clicable: al
seleccionarla resalta (ping) el objeto en la Jerarquía, así que pasas de una línea de texto al GameObject
exacto que la produjo.
BeastyDebugLogger.LogError("No collider on this interactable.", true, gameObject);
Pasa el componente (this) o el GameObject — cualquier cosa que derive de UnityEngine.Object.
El flag canPrint
canPrint: false silencia una llamada sin tocar el interruptor maestro. Úsalo para un log que pertenece a
un sistema con su propio flag de debug:
public bool debugPathfinding;
BeastyDebugLogger.LogTrace($"Path recalculated: {node.name}", debugPathfinding);
La línea se imprime solo cuando debugPathfinding es true. Este es un filtro por llamada; el interruptor
maestro IsEnabled es aparte, y silencia todo. Consulta Builds de lanzamiento.
Nota
canPrintse verifica dentro del método, así que el string igual se construye antes de la llamada. Si el mensaje es costoso de construir, protege el sitio de la llamada con unifen su lugar.
Color sin un nivel
La segunda sobrecarga de Log toma un LogColor y colorea el mensaje sin adoptar la etiqueta de ningún
nivel:
BeastyDebugLogger.Log("Wave 4 spawned.", BeastyDebugLogger.LogColor.Notice);
Los valores son Default, Info, Verbose, Trace, Debug, Notice, Highlight, Caution, Success
y Plain. El color se aplica solo en el editor; una build loguea texto plano.
Mensajes muy largos
La consola de Unity trunca una línea muy larga, lo que la vuelve inútil para volcar un payload JSON o un
archivo de save. PrintLongMessage divide el string en fragmentos y loguea cada uno por separado, con
prefijo de su offset y una etiqueta opcional:
BeastyDebugLogger.PrintLongMessage(json, 4000, true, "save-slot-1");
Advertencia
chunkSizedebe ser mayor que cero. Pasar 0 o un número negativo cuelga el editor: el loop que recorre el string nunca avanza.
Emoji en el editor, ASCII en una build
La misma llamada produce una etiqueta distinta según dónde se ejecute. En el editor, LogInfo antepone al
mensaje un glifo emoji y lo envuelve en una etiqueta de color rich-text. En una build, antepone [INFO] y
no agrega color.
Eso es deliberado. La Beasty Console clasifica una entrada por el glifo o color que la abre, y esa ventana
solo existe en el editor. El Player.log de un jugador es un archivo de texto plano, abierto en un editor
de texto plano — un emoji ahí es mojibake, y una etiqueta rich-text es ruido. Por eso una build etiqueta sus
líneas en ASCII.
El mapeo completo está en la referencia de la API.