From 0299a0724e5b1be4c9c95c4fb7a26fe23c9a9224 Mon Sep 17 00:00:00 2001 From: dnesov Date: Sat, 20 Jan 2024 17:38:12 +0100 Subject: [PATCH] Add file logging to Logger. --- .gitignore | 3 ++ DaggerFramework/Source/Utils/Logger.cs | 47 +++++++++++++++++++------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 9ecacbf..0e8d1ee 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,9 @@ msbuild.wrn # Visual Studio 2015 .vs/ +# Dagger log files +*.log + # FMOD binaries (I cannot distribute them) DaggerFramework.Fmod/*.nupkg diff --git a/DaggerFramework/Source/Utils/Logger.cs b/DaggerFramework/Source/Utils/Logger.cs index 0a50aaf..d14c834 100644 --- a/DaggerFramework/Source/Utils/Logger.cs +++ b/DaggerFramework/Source/Utils/Logger.cs @@ -13,11 +13,24 @@ namespace DaggerFramework.Utils /// Specifies the logging level. In release builds, the log level is Error. In debug, the log level is Echo. /// public static LogLevel LogLevel = LogLevel.Error; + /// + /// Specifies if the logger should write to file. + /// + public static bool WriteToFile = true; public Logger(string className) { _className = className; + if (WriteToFile && !_logCreated) + { + Directory.CreateDirectory(LogPath); + string logName = $"dagger-{DateFormat}-{TimeFormat}.log".Replace(':', '.'); + _fileStream = File.Create(Path.Combine(LogPath, logName)); + _fileWriter = new StreamWriter(_fileStream); + _logCreated = true; + } + #if DEBUG LogLevel = LogLevel.Echo; #endif @@ -25,54 +38,52 @@ namespace DaggerFramework.Utils public void Echo(string what) { - if (LogLevel < LogLevel.Echo) return; - - string message = string.Format(EchoFormat, DateFormat, what); + string message = string.Format(EchoFormat, TimeFormat, what); + LogFile(message); LogConsole(what, LogLevel.Echo); OnLog?.Invoke(what, LogLevel.Echo); } public void Info(string what, [CallerMemberName] string method = "") { - if (LogLevel < LogLevel.Info) return; - LogLevel logType = LogLevel.Info; - string message = string.Format(LogFormat, DateFormat, logType.ToString(), _className, method, what); + string message = string.Format(LogFormat, TimeFormat, logType.ToString(), _className, method, what); + LogFile(message); LogConsole(message, logType); OnLog?.Invoke(message, logType); } public void Warn(string what, [CallerMemberName] string method = "") { - if (LogLevel < LogLevel.Warn) return; - LogLevel logType = LogLevel.Warn; - string message = string.Format(LogFormat, DateFormat, logType.ToString(), _className, method, what); + string message = string.Format(LogFormat, TimeFormat, logType.ToString(), _className, method, what); + LogFile(message); LogConsole(message, logType); OnLog?.Invoke(message, logType); } public void Error(string what, [CallerMemberName] string method = "") { - if (LogLevel < LogLevel.Error) return; - LogLevel logType = LogLevel.Error; - string message = string.Format(LogFormat, DateFormat, logType.ToString(), _className, method, what); + string message = string.Format(LogFormat, TimeFormat, logType.ToString(), _className, method, what); + LogFile(message); LogConsole(message, logType); OnLog?.Invoke(message, logType); } - private static string DateFormat => $"{DateTime.Now:HH:mm:ffff}"; + private static string TimeFormat => $"{DateTime.Now:HH:mm:ffff}"; + private static string DateFormat => $"{DateTime.Now:d:M:yyyy:}"; private static string LogFormat => "({0}) [{1}/{2}/{3}] {4}"; private static string EchoFormat => "({0}) {1}"; private static void LogConsole(string what, LogLevel logType) { + if (LogLevel < logType) return; Console.ForegroundColor = ConsoleColorForLog(logType); Console.WriteLine(what); Console.ForegroundColor = ConsoleColor.White; @@ -99,7 +110,17 @@ namespace DaggerFramework.Utils return color; } + private void LogFile(string message) + { + if (!WriteToFile || _fileWriter is null) return; + _fileWriter.WriteLine(message); + _fileWriter.Flush(); + } + private readonly string _className; + private static bool _logCreated; + private static FileStream? _fileStream; + private static StreamWriter? _fileWriter; } public enum LogLevel