diff --git a/DTLib.Tests/Program.cs b/DTLib.Tests/Program.cs index aedf62c..94aaa0b 100644 --- a/DTLib.Tests/Program.cs +++ b/DTLib.Tests/Program.cs @@ -17,7 +17,7 @@ namespace DTLib.Tests; public static class Program { - public static readonly DefaultLogger Info = new(); + public static readonly ConsoleLogger Info = new(); public static void Main() { Info.Enable(); diff --git a/DTLib/Loggers/AsyncLogger.cs b/DTLib/Loggers/AsyncLogger.cs deleted file mode 100644 index fd0d112..0000000 --- a/DTLib/Loggers/AsyncLogger.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Globalization; - -namespace DTLib.Loggers; - -// вывод лога в консоль и файл -public class AsyncLogger : BaseLogger -{ - public AsyncLogger(string logfile) : base(logfile) { } - - public AsyncLogger(string dir, string programName) : base(dir, programName) { } - - readonly object consolelocker = new(); - public override void Log(params string[] msg) - { - lock (statelocker) if (!IsEnabled) return; - // добавление даты - if (msg.Length == 1) msg[0] = "[" + DateTime.Now.ToString(CultureInfo.InvariantCulture) + "]: " + msg[0]; - else msg[1] = "[" + DateTime.Now.ToString(CultureInfo.InvariantCulture) + "]: " + msg[1]; - // перенос строки - msg[msg.Length - 1] += '\n'; - // вывод в консоль - lock (consolelocker) - ColoredConsole.Write(msg); - // вывод в файл - if (msg.Length == 1) - lock (Logfile) File.AppendAllText(Logfile, msg[0]); - else - { - StringBuilder strB = new(); - for (ushort i = 0; i < msg.Length; i++) - strB.Append(msg[++i]); - lock (Logfile) File.AppendAllText(Logfile, strB.ToString()); - } - } - public void LogAsync(params string[] msg) => Task.Run(() => Log(msg)); -} diff --git a/DTLib/Loggers/BaseLogger.cs b/DTLib/Loggers/BaseLogger.cs index a0f7039..717c937 100644 --- a/DTLib/Loggers/BaseLogger.cs +++ b/DTLib/Loggers/BaseLogger.cs @@ -1,14 +1,24 @@ -namespace DTLib.Loggers; +using System.IO; +using File = DTLib.Filesystem.File; -public abstract class BaseLogger +namespace DTLib.Loggers; + +public abstract class BaseLogger : IDisposable { public BaseLogger() { } - public BaseLogger(string logfile) => (Logfile, WriteToFile) = (logfile,true); + public BaseLogger(string logfile) + { + WriteToFile=true; + LogfileName = logfile; + LogfileStream = File.OpenWrite(logfile); + } + public BaseLogger(string dir, string programName) : this($"{dir}\\{programName}_{DateTime.Now}.log".Replace(':', '-').Replace(' ', '_')) { } - public string Logfile { get; init; } + public string LogfileName; + public FileStream LogfileStream { get; init; } public bool IsEnabled { get; private set; } = false; public bool WriteToFile { get; private set; } = false; protected readonly object statelocker = new(); @@ -16,4 +26,12 @@ public abstract class BaseLogger public void Enable() { lock (statelocker) IsEnabled = true; } public abstract void Log(params string[] msg); + + public virtual void Dispose() + { + LogfileStream?.Flush(); + LogfileStream?.Close(); + } + + ~BaseLogger() => Dispose(); } diff --git a/DTLib/Loggers/DefaultLogger.cs b/DTLib/Loggers/ConsoleLogger.cs similarity index 58% rename from DTLib/Loggers/DefaultLogger.cs rename to DTLib/Loggers/ConsoleLogger.cs index d955750..f87919e 100644 --- a/DTLib/Loggers/DefaultLogger.cs +++ b/DTLib/Loggers/ConsoleLogger.cs @@ -3,13 +3,13 @@ namespace DTLib.Loggers; // вывод лога в консоль и файл -public class DefaultLogger : BaseLogger +public class ConsoleLogger : BaseLogger { - public DefaultLogger() => Logfile = ""; - public DefaultLogger(string logfile) : base(logfile) { } - - public DefaultLogger(string dir, string programName) : base(dir, programName) { } + public ConsoleLogger() : base() {} + public ConsoleLogger(string logfile) : base(logfile){} + public ConsoleLogger(string dir, string programName) : base(dir, programName) {} + public override void Log(params string[] msg) { lock (statelocker) if (!IsEnabled) return; @@ -18,22 +18,28 @@ public class DefaultLogger : BaseLogger LogNoTime(msg); } + + readonly object consolelocker = new(); + public void LogNoTime(params string[] msg) { lock (statelocker) if (!IsEnabled) return; msg[msg.Length - 1] += '\n'; - ColoredConsole.Write(msg); + lock (consolelocker) + ColoredConsole.Write(msg); if (WriteToFile) { if (msg.Length == 1) - lock (Logfile) File.AppendAllText(Logfile, msg[0]); + lock (LogfileStream) LogfileStream.Write(msg[0].ToBytes()); else { StringBuilder strB = new(); for (ushort i = 0; i < msg.Length; i++) strB.Append(msg[++i]); - lock (Logfile) File.AppendAllText(Logfile, strB.ToString()); + lock (LogfileStream) LogfileStream.Write(strB.ToString().ToBytes()); } } } + + public void LogAsync(params string[] msg) => Task.Run(() => Log(msg)); }