Moved logging system to separate repository.
This commit is contained in:
parent
f9cbd0871d
commit
0073efc9ac
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "SimpleLogger"]
|
||||||
|
path = SimpleLogger
|
||||||
|
url = https://systems.reslate.xyz/git/ydeng/SimpleLogger.git
|
1
SimpleLogger
Submodule
1
SimpleLogger
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit f9931eea4295353befffcf1880ea510cc259e9f2
|
@ -3,6 +3,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\GameServiceWarden.ModuleFramework\GameServiceWarden.ModuleFramework.csproj" />
|
<ProjectReference Include="..\GameServiceWarden.ModuleFramework\GameServiceWarden.ModuleFramework.csproj" />
|
||||||
<ProjectReference Include="..\GameServiceWarden.InteractionAPI\GameServiceWarden.InteractionAPI.csproj" />
|
<ProjectReference Include="..\GameServiceWarden.InteractionAPI\GameServiceWarden.InteractionAPI.csproj" />
|
||||||
|
<ProjectReference Include="..\..\SimpleLogger\SimpleLogger.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace GameServiceWarden.Core.Logging
|
|
||||||
{
|
|
||||||
public interface ILogReceiver
|
|
||||||
{
|
|
||||||
string Identifier { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The severity of the messages this log should receive.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The severity of the logs.</value>
|
|
||||||
LogLevel Level { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Logs the message.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">The message to be logged.</param>
|
|
||||||
/// <param name="time">The time at which this message was requested to be logged.</param>
|
|
||||||
/// <param name="level">The severity of this message.</param>
|
|
||||||
void LogMessage(string message, DateTime time, LogLevel level);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Called when this receiver should explicitly flush received messages.
|
|
||||||
/// </summary>
|
|
||||||
void Flush();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
namespace GameServiceWarden.Core.Logging
|
|
||||||
{
|
|
||||||
public enum LogLevel : int
|
|
||||||
{
|
|
||||||
FATAL,
|
|
||||||
INFO,
|
|
||||||
WARNING,
|
|
||||||
DEBUG,
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace GameServiceWarden.Core.Logging
|
|
||||||
{
|
|
||||||
public static class Logger {
|
|
||||||
private static readonly ConcurrentDictionary<string, ILogReceiver> listeners = new ConcurrentDictionary<string, ILogReceiver>();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Logs the message to listeners that are listening to the set severity of the message or greater.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">The message to log.</param>
|
|
||||||
/// <param name="level">The level of severity, by default, info.</param>
|
|
||||||
public static void Log(string message, LogLevel level = LogLevel.INFO) {
|
|
||||||
foreach (ILogReceiver listener in listeners.Values)
|
|
||||||
{
|
|
||||||
if (level <= listener.Level) {
|
|
||||||
listener.LogMessage(message, DateTime.Now, level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds a log listener.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="listener">The listener to add.</param>
|
|
||||||
public static void AddLogListener(ILogReceiver listener) {
|
|
||||||
listeners[listener.Identifier] = listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Removes a log listener.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="listener">The listener to remove.</param>
|
|
||||||
public static void RemoveLogListener(ILogReceiver listener) {
|
|
||||||
ILogReceiver receiver;
|
|
||||||
listeners.TryRemove(listener.Identifier, out receiver);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Called when all listeners should perform any flushing they need.
|
|
||||||
/// </summary>
|
|
||||||
public static void FlushListeners()
|
|
||||||
{
|
|
||||||
foreach (ILogReceiver listener in listeners.Values)
|
|
||||||
{
|
|
||||||
listener.Flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,7 +10,7 @@ using System.Text;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using GameServiceWarden.Core.Module.Exceptions;
|
using GameServiceWarden.Core.Module.Exceptions;
|
||||||
using GameServiceWarden.Core.Logging;
|
using SimpleLogger;
|
||||||
using GameServiceWarden.ModuleFramework;
|
using GameServiceWarden.ModuleFramework;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ namespace GameServiceWarden.Core.Module
|
|||||||
/// <exception cref="InvalidOperationException">Is thrown when the service is not running.</exception>
|
/// <exception cref="InvalidOperationException">Is thrown when the service is not running.</exception>
|
||||||
public void ExecuteCommand(string command)
|
public void ExecuteCommand(string command)
|
||||||
{
|
{
|
||||||
Logger.Log($"\"{ServiceName}\" is executing command \"{command}\".", LogLevel.DEBUG);
|
Logger.Log($"\"{ServiceName}\" is executing command \"{command}\".", LogLevel.Debug);
|
||||||
if (state != ServiceState.Running) throw new InvalidOperationException("Service instance not running.");
|
if (state != ServiceState.Running) throw new InvalidOperationException("Service instance not running.");
|
||||||
service.ExecuteCommand(command);
|
service.ExecuteCommand(command);
|
||||||
}
|
}
|
||||||
@ -145,7 +145,7 @@ namespace GameServiceWarden.Core.Module
|
|||||||
private void OnServiceStateChange(object sender, ServiceState state)
|
private void OnServiceStateChange(object sender, ServiceState state)
|
||||||
{
|
{
|
||||||
this.state = state;
|
this.state = state;
|
||||||
Logger.Log($"The service \"{ServiceName}\" is changing states to {this.state}.", LogLevel.DEBUG);
|
Logger.Log($"The service \"{ServiceName}\" is changing states to {this.state}.", LogLevel.Debug);
|
||||||
ServiceStateChangeEvent?.Invoke(this, this.state);
|
ServiceStateChangeEvent?.Invoke(this, this.state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ using System.Text.Json;
|
|||||||
using GameServiceWarden.InteractionAPI;
|
using GameServiceWarden.InteractionAPI;
|
||||||
using GameServiceWarden.InteractionAPI.Communicable.Requests;
|
using GameServiceWarden.InteractionAPI.Communicable.Requests;
|
||||||
using GameServiceWarden.Core.Module;
|
using GameServiceWarden.Core.Module;
|
||||||
using GameServiceWarden.Core.Logging;
|
using SimpleLogger;
|
||||||
|
|
||||||
namespace GameServiceWarden.Core.UI
|
namespace GameServiceWarden.Core.UI
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@ using System.Threading.Tasks;
|
|||||||
using GameServiceWarden.InteractionAPI;
|
using GameServiceWarden.InteractionAPI;
|
||||||
using GameServiceWarden.InteractionAPI.Communicable.Requests;
|
using GameServiceWarden.InteractionAPI.Communicable.Requests;
|
||||||
using GameServiceWarden.InteractionAPI.Communicable.Responses;
|
using GameServiceWarden.InteractionAPI.Communicable.Responses;
|
||||||
using GameServiceWarden.Core.Logging;
|
using SimpleLogger;
|
||||||
|
|
||||||
namespace GameServiceWarden.Core.UI
|
namespace GameServiceWarden.Core.UI
|
||||||
{
|
{
|
||||||
@ -41,7 +41,7 @@ namespace GameServiceWarden.Core.UI
|
|||||||
active = true;
|
active = true;
|
||||||
stopAcceptingToken = new CancellationTokenSource();
|
stopAcceptingToken = new CancellationTokenSource();
|
||||||
connectionTask = AcceptConnections();
|
connectionTask = AcceptConnections();
|
||||||
Logger.Log($"IPCMediator \"{name}\" has begun asynchronously accepting interfaces.", LogLevel.DEBUG);
|
Logger.Log($"IPCMediator \"{name}\" has begun asynchronously accepting interfaces.", LogLevel.Debug);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
@ -115,7 +115,7 @@ namespace GameServiceWarden.Core.UI
|
|||||||
while (active)
|
while (active)
|
||||||
{
|
{
|
||||||
connectingPipe = new NamedPipeServerStream(PipeName, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
|
connectingPipe = new NamedPipeServerStream(PipeName, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
|
||||||
Logger.Log("Waiting for connection.", LogLevel.DEBUG);
|
Logger.Log("Waiting for connection.", LogLevel.Debug);
|
||||||
await connectingPipe.WaitForConnectionAsync(stopAcceptingToken.Token);
|
await connectingPipe.WaitForConnectionAsync(stopAcceptingToken.Token);
|
||||||
connectionTasks.Add(OnConnection(connectingPipe));
|
connectionTasks.Add(OnConnection(connectingPipe));
|
||||||
for (int i = 0; i < connectionTasks.Count; i++)
|
for (int i = 0; i < connectionTasks.Count; i++)
|
||||||
@ -127,7 +127,7 @@ namespace GameServiceWarden.Core.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Logger.Log("Waiting for connection tasks.", LogLevel.DEBUG);
|
Logger.Log("Waiting for connection tasks.", LogLevel.Debug);
|
||||||
foreach (Task task in connectionTasks)
|
foreach (Task task in connectionTasks)
|
||||||
{
|
{
|
||||||
task.Wait();
|
task.Wait();
|
||||||
@ -137,7 +137,7 @@ namespace GameServiceWarden.Core.UI
|
|||||||
|
|
||||||
private async Task OnConnection(NamedPipeServerStream pipe)
|
private async Task OnConnection(NamedPipeServerStream pipe)
|
||||||
{
|
{
|
||||||
Logger.Log("Interface attempting to connect.", LogLevel.DEBUG);
|
Logger.Log("Interface attempting to connect.", LogLevel.Debug);
|
||||||
byte[] headerBuffer = new byte[sizeof(uint) * 2];
|
byte[] headerBuffer = new byte[sizeof(uint) * 2];
|
||||||
int headerFill = 0;
|
int headerFill = 0;
|
||||||
CancellationTokenSource headerCancel = new CancellationTokenSource(TIMEOUT);
|
CancellationTokenSource headerCancel = new CancellationTokenSource(TIMEOUT);
|
||||||
@ -153,13 +153,13 @@ namespace GameServiceWarden.Core.UI
|
|||||||
catch (AggregateException e)
|
catch (AggregateException e)
|
||||||
{
|
{
|
||||||
e.Handle((exception) => exception is TaskCanceledException);
|
e.Handle((exception) => exception is TaskCanceledException);
|
||||||
Logger.Log($"Interface did not send header data within {TIMEOUT}ms.", LogLevel.DEBUG);
|
Logger.Log($"Interface did not send header data within {TIMEOUT}ms.", LogLevel.Debug);
|
||||||
} finally {
|
} finally {
|
||||||
await pipe.DisposeAsync();
|
await pipe.DisposeAsync();
|
||||||
headerCancel.Dispose();
|
headerCancel.Dispose();
|
||||||
}
|
}
|
||||||
if (headerFill != headerBuffer.Length) {
|
if (headerFill != headerBuffer.Length) {
|
||||||
Logger.Log($"Interface failed to send header data.", LogLevel.DEBUG);
|
Logger.Log($"Interface failed to send header data.", LogLevel.Debug);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,13 +182,13 @@ namespace GameServiceWarden.Core.UI
|
|||||||
catch (AggregateException e)
|
catch (AggregateException e)
|
||||||
{
|
{
|
||||||
e.Handle((exception) => exception is TaskCanceledException);
|
e.Handle((exception) => exception is TaskCanceledException);
|
||||||
Logger.Log($"Interface failed to send body data within {TIMEOUT}.", LogLevel.DEBUG);
|
Logger.Log($"Interface failed to send body data within {TIMEOUT}.", LogLevel.Debug);
|
||||||
} finally {
|
} finally {
|
||||||
await pipe.DisposeAsync();
|
await pipe.DisposeAsync();
|
||||||
bodyCancel.Dispose();
|
bodyCancel.Dispose();
|
||||||
}
|
}
|
||||||
if (bodyFill != bodyBuffer.Length) {
|
if (bodyFill != bodyBuffer.Length) {
|
||||||
Logger.Log($"Interface failed to send body data.", LogLevel.DEBUG);
|
Logger.Log($"Interface failed to send body data.", LogLevel.Debug);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,12 +199,12 @@ namespace GameServiceWarden.Core.UI
|
|||||||
if (string.IsNullOrWhiteSpace(request.requestedIdentifier)) {
|
if (string.IsNullOrWhiteSpace(request.requestedIdentifier)) {
|
||||||
response.invalidName = true;
|
response.invalidName = true;
|
||||||
response.errorMsg = $"The requested identifier \"{request.requestedIdentifier}\" is null or whitespace.";
|
response.errorMsg = $"The requested identifier \"{request.requestedIdentifier}\" is null or whitespace.";
|
||||||
Logger.Log(response.errorMsg, LogLevel.DEBUG);
|
Logger.Log(response.errorMsg, LogLevel.Debug);
|
||||||
} else if (pipes.ContainsKey(request.requestedIdentifier)) {
|
} else if (pipes.ContainsKey(request.requestedIdentifier)) {
|
||||||
response.invalidName = true;
|
response.invalidName = true;
|
||||||
response.nameTaken = true;
|
response.nameTaken = true;
|
||||||
response.errorMsg = $"Interface requested identifier \"{request.requestedIdentifier}\" is taken.";
|
response.errorMsg = $"Interface requested identifier \"{request.requestedIdentifier}\" is taken.";
|
||||||
Logger.Log(response.errorMsg, LogLevel.DEBUG);
|
Logger.Log(response.errorMsg, LogLevel.Debug);
|
||||||
} else {
|
} else {
|
||||||
requestAccepted = true;
|
requestAccepted = true;
|
||||||
response.identifier = request.requestedIdentifier;
|
response.identifier = request.requestedIdentifier;
|
||||||
@ -217,7 +217,7 @@ namespace GameServiceWarden.Core.UI
|
|||||||
catch (AggregateException e)
|
catch (AggregateException e)
|
||||||
{
|
{
|
||||||
e.Handle((exception) => exception is TaskCanceledException);
|
e.Handle((exception) => exception is TaskCanceledException);
|
||||||
Logger.Log($"Interface did not receive response within {TIMEOUT}ms.", LogLevel.DEBUG);
|
Logger.Log($"Interface did not receive response within {TIMEOUT}ms.", LogLevel.Debug);
|
||||||
}
|
}
|
||||||
if (!requestAccepted) {
|
if (!requestAccepted) {
|
||||||
cancelResponse.Dispose();
|
cancelResponse.Dispose();
|
||||||
@ -232,7 +232,7 @@ namespace GameServiceWarden.Core.UI
|
|||||||
|
|
||||||
private async Task Listen(string identifier, NamedPipeServerStream pipe)
|
private async Task Listen(string identifier, NamedPipeServerStream pipe)
|
||||||
{
|
{
|
||||||
Logger.Log($"Started listening to interface \"{identifier}\".", LogLevel.DEBUG);
|
Logger.Log($"Started listening to interface \"{identifier}\".", LogLevel.Debug);
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
byte[] headerBuffer = new byte[sizeof(uint) * 2];
|
byte[] headerBuffer = new byte[sizeof(uint) * 2];
|
||||||
byte[] bodyBuffer = null;
|
byte[] bodyBuffer = null;
|
||||||
@ -274,11 +274,11 @@ namespace GameServiceWarden.Core.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Logger.Log($"Pipe for interface \"{identifier}\" has closed.", LogLevel.DEBUG);
|
Logger.Log($"Pipe for interface \"{identifier}\" has closed.", LogLevel.Debug);
|
||||||
(NamedPipeServerStream, Task) removedPipe;
|
(NamedPipeServerStream, Task) removedPipe;
|
||||||
pipes.TryRemove(identifier, out removedPipe);
|
pipes.TryRemove(identifier, out removedPipe);
|
||||||
await removedPipe.Item1.DisposeAsync();
|
await removedPipe.Item1.DisposeAsync();
|
||||||
Logger.Log($"Stopped listening to interface \"{identifier}\".", LogLevel.DEBUG);
|
Logger.Log($"Stopped listening to interface \"{identifier}\".", LogLevel.Debug);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,6 +16,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\GameServiceWarden.Core\GameServiceWarden.Core.csproj" />
|
<ProjectReference Include="..\..\src\GameServiceWarden.Core\GameServiceWarden.Core.csproj" />
|
||||||
<ProjectReference Include="..\..\src\GameServiceWarden.ModuleFramework\GameServiceWarden.ModuleFramework.csproj" />
|
<ProjectReference Include="..\..\src\GameServiceWarden.ModuleFramework\GameServiceWarden.ModuleFramework.csproj" />
|
||||||
|
<ProjectReference Include="..\..\SimpleLogger\SimpleLogger.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using GameServiceWarden.Core.Module;
|
using GameServiceWarden.Core.Module;
|
||||||
using GameServiceWarden.Core.Logging;
|
|
||||||
using GameServiceWarden.ModuleFramework;
|
using GameServiceWarden.ModuleFramework;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
using Xunit.Abstractions;
|
||||||
using System.Text;
|
using SimpleLogger;
|
||||||
|
|
||||||
namespace GameServiceWarden.Core.Tests.Modules
|
namespace GameServiceWarden.Core.Tests.Modules
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using GameServiceWarden.Core.Module;
|
using GameServiceWarden.Core.Module;
|
||||||
using GameServiceWarden.Core.Logging;
|
using SimpleLogger;
|
||||||
using GameServiceWarden.ModuleFramework;
|
using GameServiceWarden.ModuleFramework;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
using Xunit.Abstractions;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using GameServiceWarden.Core.Logging;
|
using SimpleLogger;
|
||||||
using GameServiceWarden.Core.UI;
|
using GameServiceWarden.Core.UI;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
using Xunit.Abstractions;
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
using System;
|
using System;
|
||||||
using GameServiceWarden.Core.Logging;
|
using SimpleLogger;
|
||||||
using Xunit.Abstractions;
|
using Xunit.Abstractions;
|
||||||
|
|
||||||
namespace GameServiceWarden.Core.Tests
|
namespace GameServiceWarden.Core.Tests
|
||||||
{
|
{
|
||||||
public class XUnitLogger : ILogReceiver
|
public class XUnitLogger : ILogReceiver
|
||||||
{
|
{
|
||||||
public LogLevel Level => LogLevel.DEBUG;
|
public LogLevel Level => LogLevel.Debug;
|
||||||
|
|
||||||
public string Identifier => GetType().Name;
|
public string Identifier => GetType().Name;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user