diff --git a/Engine.Core/Debug/ConsoleLogger.cs b/Engine.Core/Debug/ConsoleLogger.cs new file mode 100644 index 0000000..242b818 --- /dev/null +++ b/Engine.Core/Debug/ConsoleLogger.cs @@ -0,0 +1,8 @@ +using System; + +namespace Syntriax.Engine.Core.Debug; + +public class ConsoleLogger : LoggerBase +{ + protected override void Write(string message) => Console.WriteLine(message); +} diff --git a/Engine.Core/Debug/FileLogger.cs b/Engine.Core/Debug/FileLogger.cs new file mode 100644 index 0000000..a7bc9c4 --- /dev/null +++ b/Engine.Core/Debug/FileLogger.cs @@ -0,0 +1,20 @@ +using System; +using System.IO; + +namespace Syntriax.Engine.Core.Debug; + +public class FileLogger : LoggerBase +{ + public readonly string FilePath; + + public FileLogger(string filePath) + { + FilePath = filePath; + File.Open(filePath, FileMode.Create).Close(); + } + + protected override void Write(string message) + { + File.AppendAllTextAsync(FilePath, $"{message}{Environment.NewLine}"); + } +} diff --git a/Engine.Core/Debug/ILogger.cs b/Engine.Core/Debug/ILogger.cs new file mode 100644 index 0000000..c1e78d2 --- /dev/null +++ b/Engine.Core/Debug/ILogger.cs @@ -0,0 +1,15 @@ +namespace Syntriax.Engine.Core.Debug; + +public interface ILogger +{ + Level FilterLevel { get; set; } + + void Log(string message, Level level = Level.Info, bool force = false); + + enum Level + { + Info, + Warning, + Error, + }; +} diff --git a/Engine.Core/Debug/LoggerBase.cs b/Engine.Core/Debug/LoggerBase.cs new file mode 100644 index 0000000..6b0439c --- /dev/null +++ b/Engine.Core/Debug/LoggerBase.cs @@ -0,0 +1,20 @@ +using System; + +namespace Syntriax.Engine.Core.Debug; + +public abstract class LoggerBase : ILogger +{ + public ILogger.Level FilterLevel { get; set; } = ILogger.Level.Info; + + public void Log(string message, ILogger.Level level = ILogger.Level.Info, bool force = false) + { + if (!force && level < FilterLevel) + return; + + string timestamp = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt"); + + Write($"[{timestamp}] [{level}] \t{message}"); + } + + protected abstract void Write(string message); +} diff --git a/Engine.Core/Debug/LoggerExtensions.cs b/Engine.Core/Debug/LoggerExtensions.cs new file mode 100644 index 0000000..ac8e44c --- /dev/null +++ b/Engine.Core/Debug/LoggerExtensions.cs @@ -0,0 +1,28 @@ +using System; +using System.Diagnostics; + +namespace Syntriax.Engine.Core.Debug; + +public static class LoggerExtensions +{ + public static void Log(this ILogger logger, T caller, string message, ILogger.Level level = ILogger.Level.Info, bool force = false) + { + string body = $"{caller?.GetType().Name ?? typeof(T).Name}: {message}"; + logger.Log(body, level, force); + } + + public static void LogWarning(this ILogger logger, T caller, string message, bool force = false) => Log(logger, caller, message, ILogger.Level.Info, force); + + public static void LogError(this ILogger logger, T caller, string message, bool force = false) + { + Log(logger, caller, message, ILogger.Level.Error, force); + Log(logger, caller, $"{nameof(StackTrace)}:{Environment.NewLine}{new StackTrace()}"); + } + + public static void LogException(this ILogger logger, T caller, Exception exception, bool force = false) + { + Log(logger, caller, $"Message: {exception.Message}", ILogger.Level.Error, force); + Log(logger, caller, $"InnerException: {exception.InnerException}", ILogger.Level.Error, force); + Log(logger, caller, $"{nameof(StackTrace)}:{Environment.NewLine}{exception.StackTrace}"); + } +}