From ea0550028c5e1a473b4e4547610812b8921e218f Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Fri, 4 Nov 2016 20:02:39 -0400 Subject: simplify log singleton management --- src/StardewModdingAPI/Framework/LogWriter.cs | 71 ++++++++++------------------ src/StardewModdingAPI/Log.cs | 2 +- 2 files changed, 25 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/StardewModdingAPI/Framework/LogWriter.cs b/src/StardewModdingAPI/Framework/LogWriter.cs index 2cabb8d5..64769d2e 100644 --- a/src/StardewModdingAPI/Framework/LogWriter.cs +++ b/src/StardewModdingAPI/Framework/LogWriter.cs @@ -6,64 +6,44 @@ using System.Linq; namespace StardewModdingAPI.Framework { /// A log writer which queues messages for output, and periodically flushes them to the console and log file. + /// Only one instance should be created. internal class LogWriter { /********* ** Properties *********/ - /// The singleton instance. - private static LogWriter _instance; - /// The queued messages to flush. - private static ConcurrentQueue Queue; + private readonly ConcurrentQueue Queue; /// The underlying file stream. - private static StreamWriter FileStream; + private readonly StreamWriter FileStream; /********* - ** Accessors + ** Public methods *********/ - /// The singleton instance. - internal static LogWriter Instance + /// Construct an instance. + /// The log path to write. + public LogWriter(string path) { - get - { - if (LogWriter._instance == null) - { - LogWriter._instance = new LogWriter(); - // Field cannot be used by anything else regardless, do not surround with lock { } - // ReSharper disable once InconsistentlySynchronizedField - LogWriter.Queue = new ConcurrentQueue(); - Console.WriteLine(Constants.LogPath); - - // If the ErrorLogs dir doesn't exist StreamWriter will throw an exception. - if (!Directory.Exists(Constants.LogDir)) - { - Directory.CreateDirectory(Constants.LogDir); - } + // create log directory (required for stream writer) + Directory.CreateDirectory(Path.GetDirectoryName(path)); - LogWriter.FileStream = new StreamWriter(Constants.LogPath, false); - Console.WriteLine("Created log instance"); - } - return LogWriter._instance; - } + // initialise + this.Queue = new ConcurrentQueue(); + this.FileStream = new StreamWriter(Constants.LogPath, false); } - - /********* - ** Public methods - *********/ /// Queue a message for output. /// The message to log. public void WriteToLog(string message) { - lock (LogWriter.Queue) + lock (this.Queue) { var logEntry = new LogInfo(message); - LogWriter.Queue.Enqueue(logEntry); + this.Queue.Enqueue(logEntry); - if (LogWriter.Queue.Any()) + if (this.Queue.Any()) this.FlushLog(); } } @@ -72,10 +52,10 @@ namespace StardewModdingAPI.Framework /// The message to log. public void WriteToLog(LogInfo message) { - lock (LogWriter.Queue) + lock (this.Queue) { - LogWriter.Queue.Enqueue(message); - if (LogWriter.Queue.Any()) + this.Queue.Enqueue(message); + if (this.Queue.Any()) this.FlushLog(); } } @@ -84,26 +64,23 @@ namespace StardewModdingAPI.Framework /********* ** Private methods *********/ - /// Construct an instance. - private LogWriter() { } - /// Flush the underlying queue to the console and file. private void FlushLog() { - lock (LogWriter.FileStream) + lock (this.FileStream) { LogInfo entry; - while (LogWriter.Queue.TryDequeue(out entry)) + while (this.Queue.TryDequeue(out entry)) { - string m = $"[{entry.LogTime}] {entry.Message}"; + string message = $"[{entry.LogTime}] {entry.Message}"; Console.ForegroundColor = entry.Colour; - Console.WriteLine(m); + Console.WriteLine(message); Console.ForegroundColor = ConsoleColor.Gray; - LogWriter.FileStream.WriteLine(m); + this.FileStream.WriteLine(message); } - LogWriter.FileStream.Flush(); + this.FileStream.Flush(); } } } diff --git a/src/StardewModdingAPI/Log.cs b/src/StardewModdingAPI/Log.cs index 2b814f91..9ac4bbf1 100644 --- a/src/StardewModdingAPI/Log.cs +++ b/src/StardewModdingAPI/Log.cs @@ -16,7 +16,7 @@ namespace StardewModdingAPI private static readonly Random Random = new Random(); /// The underlying log writer. - private static readonly LogWriter Writer = LogWriter.Instance; + private static readonly LogWriter Writer = new LogWriter(Constants.LogPath); /********* -- cgit