beasty-debug-logger / guides / release-builds.md
Builds de lanzamiento
Lo que te cuesta el logging en un juego lanzado, y qué hace y qué no hace el interruptor maestro. Lee esta página antes de esparcir mil llamadas de log por tu proyecto.
El interruptor maestro
BeastyDebugLogger.IsEnabled = false;
Eso silencia todos los niveles en tiempo de ejecución. Ningún nivel imprime nada mientras sea false, incluyendo warnings, errors y exceptions.
Lo que no hace
Advertencia Los métodos de logging no se eliminan (stripped) de una build de lanzamiento. No hay un atributo
[Conditional]en ellos. PonerIsEnabled = falsedetiene la salida; no elimina la llamada.
Dos consecuencias, y ambas duelen.
1. El argumento se construye antes de que se lea el interruptor. Esta línea sigue asignando un string y
sigue llamando al método en cada frame, incluso con IsEnabled en false:
// El string interpolado se construye ANTES de verificar IsEnabled.
BeastyDebugLogger.LogTrace($"Path recalculated for {agent.name}, {path.corners.Length} corners");
Lo mismo aplica para canPrint: es un parámetro, así que se evalúa en el sitio de la llamada, y el mensaje
ya está construido para cuando el método lo revisa. canPrint filtra la salida; no te ahorra el costo de
producir el mensaje.
2. IsEnabled se restablece a true al inicio de cada corrida. El paquete lo restablece durante la
inicialización en tiempo de ejecución de Unity, así que vuelve a true cada vez que entras en Play Mode, y
de nuevo cada vez que inicia una build. No puedes apagarlo desde un script de editor, o desde una sesión
anterior, y esperar que se mantenga.
Qué hacer en su lugar
Configúralo desde un script de arranque (bootstrap), al inicio. Ponlo en un objeto de tu primera
escena, o en un RuntimeInitializeOnLoadMethod, para que corra después del reinicio:
using UnityEngine;
using BeastyDebugLoggerConsole;
public class LoggingBootstrap : MonoBehaviour
{
private void Awake()
{
#if !UNITY_EDITOR && !DEVELOPMENT_BUILD
BeastyDebugLogger.IsEnabled = false;
#endif
}
}
Protege tú mismo los mensajes costosos. Si construir el mensaje cuesta algo — interpolación de strings
en un bucle crítico (hot loop), un ToString() sobre una estructura grande, una consulta LINQ — envuelve la
llamada:
if (debugPathfinding)
BeastyDebugLogger.LogTrace($"Path: {string.Join(" -> ", path.corners)}");
Un string constante es barato. Uno calculado no lo es, y ningún interruptor dentro del método puede deshacer un trabajo que ya se hizo fuera de él.
Usa canPrint para interruptores por sistema, no para rendimiento. Es la herramienta correcta para
“solo imprimir esto cuando el flag de debug de pathfinding está activo”, y mantiene el sitio de la llamada
en una línea. Es la herramienta incorrecta para “esto no debe costar nada en una build de lanzamiento”.
Consulta Logging.
O elimínalos por compilación. Si los logs de un sistema no deben existir en absoluto en una build de
lanzamiento, pon las llamadas detrás de tus propios bloques #if DEVELOPMENT_BUILD || UNITY_EDITOR. Eso es
lo único que realmente los elimina.
El paquete nunca escribe un archivo
Beasty Debug Logger no abre un archivo, no rota un log, y no sube nada. Llama a UnityEngine.Debug. La
persistencia es la que Unity ya te da: en una build de escritorio, eso es Player.log. Si necesitas tu
propio archivo de log, escribe uno desde tu propio código.
Por eso también una build etiqueta sus líneas en ASCII en lugar de emoji — Player.log se lee como texto
plano. Consulta Logging.