using UnityEngine;
using System;
namespace RR.Common.Utility
{
///
/// Продвинутый пример использования системы логирования.
/// Демонстрирует различные сценарии использования FileLogger и CompositeLogger.
///
public class AdvancedLogging_Test : 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();
}
}
}