using UnityEngine; using System; using RR.Common.Utility; /// /// Продвинутый пример использования системы логирования. /// Демонстрирует различные сценарии использования FileLogger и CompositeLogger. /// public class AdvancedLoggingExample : MonoBehaviour { private CompositeLogger compositeLogger; private FileLogger mainFileLogger; private FileLogger errorFileLogger; void Start() { SetupAdvancedLogging(); DemonstrateLogging(); } /// /// Настройка продвинутой системы логирования с несколькими выходными файлами /// private void SetupAdvancedLogging() { // Создаём композитный логгер compositeLogger = new CompositeLogger(); compositeLogger.Initialize(); // Главный файл - все логи mainFileLogger = new FileLogger( System.IO.Path.Combine(Application.persistentDataPath, "full_log.txt"), append: true ); mainFileLogger.filterLogType = LogType.Log; // Все типы сообщений // Отдельный файл только для ошибок и исключений errorFileLogger = new FileLogger( System.IO.Path.Combine(Application.persistentDataPath, "errors_only.txt"), append: true ); errorFileLogger.filterLogType = LogType.Warning; // Только Warning, Error, Exception // Добавляем оба логгера compositeLogger.AddLoggers(mainFileLogger, errorFileLogger); Debug.Log($"Логирование настроено. Файлы в: {Application.persistentDataPath}"); } /// /// Демонстрация различных типов логирования /// private void DemonstrateLogging() { // Простые сообщения compositeLogger.Log("=== Демонстрация системы логирования ==="); // Сообщения с тегами compositeLogger.Log("SYSTEM", "Игра инициализирована"); compositeLogger.LogWarning("AUDIO", "Громкость музыки установлена в 0.5"); // Форматированные сообщения string playerName = "Player1"; int score = 1000; compositeLogger.LogFormat(LogType.Log, "Игрок {0} набрал {1} очков", playerName, score); // Логирование с контекстом compositeLogger.Log("Объект создан", this.gameObject); // Имитация ошибки compositeLogger.LogError("ERROR", "Это тестовая ошибка - будет в обоих файлах!"); // Имитация исключения try { throw new InvalidOperationException("Тестовое исключение для демонстрации"); } catch (Exception ex) { compositeLogger.LogException(ex, this.gameObject); } // Информация о путях Debug.Log($"Полный лог: {Application.persistentDataPath}/full_log.txt"); Debug.Log($"Только ошибки: {Application.persistentDataPath}/errors_only.txt"); } /// /// Пример метода для логирования игровых событий /// public void LogGameEvent(string eventName, params object[] parameters) { string paramStr = string.Join(", ", parameters); compositeLogger.Log("GAME_EVENT", $"{eventName}: {paramStr}"); } /// /// Пример метода для логирования производительности /// public void LogPerformance(string operation, float duration) { if (duration > 0.016f) // Больше 16мс (60 FPS) { compositeLogger.LogWarning("PERFORMANCE", $"{operation} занял {duration * 1000:F2}мс"); } else { compositeLogger.Log("PERFORMANCE", $"{operation} выполнен за {duration * 1000:F2}мс"); } } /// /// Пример обёртки для измерения времени выполнения /// public void PerformOperationWithLogging(string operationName, Action operation) { float startTime = Time.realtimeSinceStartup; try { operation.Invoke(); float duration = Time.realtimeSinceStartup - startTime; LogPerformance(operationName, duration); } catch (Exception ex) { compositeLogger.LogException(ex); compositeLogger.LogError("OPERATION", $"Операция '{operationName}' завершилась с ошибкой"); } } void Update() { // Пример: логируем нажатия клавиш if (Input.GetKeyDown(KeyCode.L)) { LogGameEvent("KeyPress", "L", Time.time); } if (Input.GetKeyDown(KeyCode.F)) { // Принудительная запись на диск mainFileLogger.Flush(); errorFileLogger.Flush(); compositeLogger.Log("SYSTEM", "Логи принудительно сохранены на диск"); } if (Input.GetKeyDown(KeyCode.C)) { // Очистка логов mainFileLogger.Clear(); errorFileLogger.Clear(); compositeLogger.Log("SYSTEM", "Файлы логов очищены"); } } void OnApplicationQuit() { compositeLogger.Log("SYSTEM", "Приложение завершается..."); // Важно: освобождаем ресурсы mainFileLogger?.Dispose(); errorFileLogger?.Dispose(); Debug.Log("Файловые логгеры закрыты"); } void OnDestroy() { // На всякий случай mainFileLogger?.Dispose(); errorFileLogger?.Dispose(); } }