Danro/Assets/Scripts/Utilities/AdvancedLoggingExample.cs
Danil Iarosh 98d5285b46 feat(logging): add advanced logging example with file output
- Created AdvancedLoggingExample class demonstrating composite and file loggers
- Implemented multi-file logging setup with separate error and full logs
- Added game event and performance logging methods
- Included key input handling for log operations (flush, clear)
- Setup proper resource disposal on application quit
2025-11-07 14:12:50 +03:00

176 lines
6.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using System;
using RR.Common.Utility;
/// <summary>
/// Продвинутый пример использования системы логирования.
/// Демонстрирует различные сценарии использования FileLogger и CompositeLogger.
/// </summary>
public class AdvancedLoggingExample : MonoBehaviour
{
private CompositeLogger compositeLogger;
private FileLogger mainFileLogger;
private FileLogger errorFileLogger;
void Start()
{
SetupAdvancedLogging();
DemonstrateLogging();
}
/// <summary>
/// Настройка продвинутой системы логирования с несколькими выходными файлами
/// </summary>
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}");
}
/// <summary>
/// Демонстрация различных типов логирования
/// </summary>
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");
}
/// <summary>
/// Пример метода для логирования игровых событий
/// </summary>
public void LogGameEvent(string eventName, params object[] parameters)
{
string paramStr = string.Join(", ", parameters);
compositeLogger.Log("GAME_EVENT", $"{eventName}: {paramStr}");
}
/// <summary>
/// Пример метода для логирования производительности
/// </summary>
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}мс");
}
}
/// <summary>
/// Пример обёртки для измерения времени выполнения
/// </summary>
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();
}
}