Skip to content

Commit

Permalink
Get rid of stream logger's exception logger
Browse files Browse the repository at this point in the history
In theory it should be monitored, and not being able to log is a pretty 
serious condition we'd want to watch for
  • Loading branch information
blowfishpro committed Jan 10, 2019
1 parent 7145003 commit ee9073b
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 100 deletions.
51 changes: 18 additions & 33 deletions ModuleManager/Logging/StreamLogger.cs
Expand Up @@ -8,42 +8,34 @@ public class StreamLogger : IBasicLogger, IDisposable
{
private readonly Stream stream;
private readonly StreamWriter streamWriter;
private readonly IBasicLogger exceptionLogger;
private bool disposed = false;

public StreamLogger(Stream stream, IBasicLogger exceptionLogger)
public StreamLogger(Stream stream)
{
this.stream = stream ?? throw new ArgumentNullException(nameof(stream));
if (!stream.CanWrite) throw new ArgumentException("must be writable", nameof(stream));
streamWriter = new StreamWriter(stream);
this.exceptionLogger = exceptionLogger ?? throw new ArgumentNullException(nameof(exceptionLogger));
}

public void Log(LogType logType, string message)
{
if (disposed) throw new InvalidOperationException("Object has already been disposed");
try
{
string prefix;
if (logType == LogType.Log)
prefix = "LOG";
else if (logType == LogType.Warning)
prefix = "WRN";
else if (logType == LogType.Error)
prefix = "ERR";
else if (logType == LogType.Assert)
prefix = "AST";
else if (logType == LogType.Exception)
prefix = "EXC";
else
prefix = "UNK";

streamWriter.WriteLine("[{0} {1}] {2}", prefix, DateTime.Now.ToString(), message);
}
catch (Exception e)
{
exceptionLogger.Exception("Exception while attempting to log to stream", e);
}
string prefix;
if (logType == LogType.Log)
prefix = "LOG";
else if (logType == LogType.Warning)
prefix = "WRN";
else if (logType == LogType.Error)
prefix = "ERR";
else if (logType == LogType.Assert)
prefix = "AST";
else if (logType == LogType.Exception)
prefix = "EXC";
else
prefix = "UNK";

streamWriter.WriteLine("[{0} {1}] {2}", prefix, DateTime.Now.ToString(), message);
}

public void Exception(string message, Exception exception)
Expand All @@ -53,15 +45,8 @@ public void Exception(string message, Exception exception)

public void Dispose()
{
try
{
// Flushes and closes the StreamWriter and the underlying stream
streamWriter.Close();
}
catch(Exception e)
{
exceptionLogger.Exception("Exception while attempting to close stream writer", e);
}
// Flushes and closes the StreamWriter and the underlying stream
streamWriter.Close();

disposed = true;
}
Expand Down
14 changes: 1 addition & 13 deletions ModuleManager/MMPatchLoader.cs
Expand Up @@ -84,13 +84,11 @@ public IEnumerable<IProtoUrlConfig> Run()
if (!useCache)
{
if (!Directory.Exists(logsDirPath)) Directory.CreateDirectory(logsDirPath);
MessageQueue<ILogMessage> externalLogQueue = new MessageQueue<ILogMessage>();
MessageQueue<ILogMessage> patchLogQueue = new MessageQueue<ILogMessage>();
bool logThreadExitFlag = false;
ITaskStatus loggingThreadStatus = BackgroundTask.Start(delegate
{
QueueLogger externalLogger = new QueueLogger(externalLogQueue);
using (StreamLogger streamLogger = new StreamLogger(new FileStream(patchLogPath, FileMode.Create), externalLogger))
using (StreamLogger streamLogger = new StreamLogger(new FileStream(patchLogPath, FileMode.Create)))
{
while (!logThreadExitFlag)
{
Expand All @@ -101,11 +99,6 @@ public IEnumerable<IProtoUrlConfig> Run()
message.LogTo(streamLogger);
}

foreach (ILogMessage message in externalLogQueue.TakeAll())
{
message.LogTo(logger);
}

float timeRemaining = waitTargetTime - Time.realtimeSinceStartup;
if (timeRemaining > 0)
System.Threading.Thread.Sleep((int)(timeRemaining * 1000));
Expand All @@ -116,11 +109,6 @@ public IEnumerable<IProtoUrlConfig> Run()
message.LogTo(streamLogger);
}

foreach (ILogMessage message in externalLogQueue.TakeAll())
{
message.LogTo(logger);
}

streamLogger.Info("Done!");
}
});
Expand Down
14 changes: 1 addition & 13 deletions ModuleManager/MMPatchRunner.cs
Expand Up @@ -34,13 +34,11 @@ public IEnumerator Run()

kspLogger.Info("Patching started on a new thread, all output will be directed to " + logPath);

MessageQueue<ILogMessage> kspLogQueue = new MessageQueue<ILogMessage>();
MessageQueue<ILogMessage> mmLogQueue = new MessageQueue<ILogMessage>();
bool logThreadExitFlag = false;
ITaskStatus loggingThreadStatus = BackgroundTask.Start(delegate
{
QueueLogger kspLogger = new QueueLogger(kspLogQueue);
using (StreamLogger streamLogger = new StreamLogger(new FileStream(logPath, FileMode.Create), kspLogger))
using (StreamLogger streamLogger = new StreamLogger(new FileStream(logPath, FileMode.Create)))
{
while (!logThreadExitFlag)
{
Expand Down Expand Up @@ -87,19 +85,9 @@ public IEnumerator Run()
Status = patchLoader.status;
Errors = patchLoader.errors;

foreach (ILogMessage message in kspLogQueue.TakeAll())
{
message.LogTo(kspLogger);
}

if (!patchingThreadStatus.IsRunning && !loggingThreadStatus.IsRunning) break;
}

foreach (ILogMessage message in kspLogQueue.TakeAll())
{
message.LogTo(kspLogger);
}

if (patchingThreadStatus.IsExitedWithError)
{
kspLogger.Exception("The patching thread threw an exception", patchingThreadStatus.Exception);
Expand Down
50 changes: 9 additions & 41 deletions ModuleManagerTests/Logging/StreamLoggerTest.cs
Expand Up @@ -14,7 +14,7 @@ public void TestConstructor__StreamNull()
{
ArgumentNullException ex = Assert.Throws<ArgumentNullException>(delegate
{
new StreamLogger(null, Substitute.For<IBasicLogger>());
new StreamLogger(null);
});

Assert.Equal("stream", ex.ParamName);
Expand All @@ -27,34 +27,20 @@ public void TestConstructor__CantWrite()
{
ArgumentException ex = Assert.Throws<ArgumentException>(delegate
{
new StreamLogger(stream, Substitute.For<IBasicLogger>());
new StreamLogger(stream);
});

Assert.Equal("stream", ex.ParamName);
Assert.Contains("must be writable", ex.Message);
}
}

[Fact]
public void TestConstructor__ExceptionLoggerNull()
{
using (MemoryStream stream = new MemoryStream(new byte[0], true))
{
ArgumentNullException ex = Assert.Throws<ArgumentNullException>(delegate
{
new StreamLogger(stream, null);
});

Assert.Equal("exceptionLogger", ex.ParamName);
}
}

[Fact]
public void TestLog__AlreadyDisposed()
{
using (MemoryStream stream = new MemoryStream(new byte[0], true))
{
StreamLogger streamLogger = new StreamLogger(stream, Substitute.For<IBasicLogger>());
StreamLogger streamLogger = new StreamLogger(stream);
streamLogger.Dispose();

InvalidOperationException ex = Assert.Throws<InvalidOperationException>(delegate
Expand All @@ -69,18 +55,15 @@ public void TestLog__AlreadyDisposed()
[Fact]
public void TestLog__Log()
{
IBasicLogger exceptionLogger = Substitute.For<IBasicLogger>();
byte[] bytes = new byte[50];
using (MemoryStream stream = new MemoryStream(bytes, true))
{
using (StreamLogger streamLogger = new StreamLogger(stream, exceptionLogger))
using (StreamLogger streamLogger = new StreamLogger(stream))
{
streamLogger.Log(LogType.Log, "a message");
}
}

exceptionLogger.DidNotReceiveWithAnyArgs().Exception(null, null);

using (MemoryStream stream = new MemoryStream(bytes, false))
{
using (StreamReader reader = new StreamReader(stream))
Expand All @@ -95,18 +78,15 @@ public void TestLog__Log()
[Fact]
public void TestLog__Assert()
{
IBasicLogger exceptionLogger = Substitute.For<IBasicLogger>();
byte[] bytes = new byte[50];
using (MemoryStream stream = new MemoryStream(bytes, true))
{
using (StreamLogger streamLogger = new StreamLogger(stream, exceptionLogger))
using (StreamLogger streamLogger = new StreamLogger(stream))
{
streamLogger.Log(LogType.Assert, "a message");
}
}

exceptionLogger.DidNotReceiveWithAnyArgs().Exception(null, null);

using (MemoryStream stream = new MemoryStream(bytes, false))
{
using (StreamReader reader = new StreamReader(stream))
Expand All @@ -121,18 +101,15 @@ public void TestLog__Assert()
[Fact]
public void TestLog__Warning()
{
IBasicLogger exceptionLogger = Substitute.For<IBasicLogger>();
byte[] bytes = new byte[50];
using (MemoryStream stream = new MemoryStream(bytes, true))
{
using (StreamLogger streamLogger = new StreamLogger(stream, exceptionLogger))
using (StreamLogger streamLogger = new StreamLogger(stream))
{
streamLogger.Log(LogType.Warning, "a message");
}
}

exceptionLogger.DidNotReceiveWithAnyArgs().Exception(null, null);

using (MemoryStream stream = new MemoryStream(bytes, false))
{
using (StreamReader reader = new StreamReader(stream))
Expand All @@ -147,18 +124,15 @@ public void TestLog__Warning()
[Fact]
public void TestLog__Error()
{
IBasicLogger exceptionLogger = Substitute.For<IBasicLogger>();
byte[] bytes = new byte[50];
using (MemoryStream stream = new MemoryStream(bytes, true))
{
using (StreamLogger streamLogger = new StreamLogger(stream, exceptionLogger))
using (StreamLogger streamLogger = new StreamLogger(stream))
{
streamLogger.Log(LogType.Error, "a message");
}
}

exceptionLogger.DidNotReceiveWithAnyArgs().Exception(null, null);

using (MemoryStream stream = new MemoryStream(bytes, false))
{
using (StreamReader reader = new StreamReader(stream))
Expand All @@ -173,18 +147,15 @@ public void TestLog__Error()
[Fact]
public void TestLog__Exception()
{
IBasicLogger exceptionLogger = Substitute.For<IBasicLogger>();
byte[] bytes = new byte[50];
using (MemoryStream stream = new MemoryStream(bytes, true))
{
using (StreamLogger streamLogger = new StreamLogger(stream, exceptionLogger))
using (StreamLogger streamLogger = new StreamLogger(stream))
{
streamLogger.Log(LogType.Exception, "a message");
}
}

exceptionLogger.DidNotReceiveWithAnyArgs().Exception(null, null);

using (MemoryStream stream = new MemoryStream(bytes, false))
{
using (StreamReader reader = new StreamReader(stream))
Expand All @@ -199,18 +170,15 @@ public void TestLog__Exception()
[Fact]
public void TestLog__Unknown()
{
IBasicLogger exceptionLogger = Substitute.For<IBasicLogger>();
byte[] bytes = new byte[50];
using (MemoryStream stream = new MemoryStream(bytes, true))
{
using (StreamLogger streamLogger = new StreamLogger(stream, exceptionLogger))
using (StreamLogger streamLogger = new StreamLogger(stream))
{
streamLogger.Log((LogType)1000, "a message");
}
}

exceptionLogger.DidNotReceiveWithAnyArgs().Exception(null, null);

using (MemoryStream stream = new MemoryStream(bytes, false))
{
using (StreamReader reader = new StreamReader(stream))
Expand Down

0 comments on commit ee9073b

Please sign in to comment.