ryujinx/Ryujinx/Ui/ConsoleLog.cs

107 lines
3.1 KiB
C#
Raw Normal View History

using Ryujinx.Common.Logging;
2018-04-24 18:57:39 +00:00
using System;
using System.Collections.Concurrent;
2018-04-24 18:57:39 +00:00
using System.Collections.Generic;
using System.Reflection;
using System.Text;
2018-04-24 18:57:39 +00:00
using System.Threading;
namespace Ryujinx
{
static class ConsoleLog
{
private static Thread _messageThread;
private static BlockingCollection<LogEventArgs> _messageQueue;
private static Dictionary<LogLevel, ConsoleColor> _logColors;
2018-04-24 18:57:39 +00:00
static ConsoleLog()
{
_logColors = new Dictionary<LogLevel, ConsoleColor>()
2018-04-24 18:57:39 +00:00
{
{ LogLevel.Stub, ConsoleColor.DarkGray },
{ LogLevel.Info, ConsoleColor.White },
{ LogLevel.Warning, ConsoleColor.Yellow },
{ LogLevel.Error, ConsoleColor.Red }
};
_messageQueue = new BlockingCollection<LogEventArgs>(10);
_messageThread = new Thread(() =>
{
while (!_messageQueue.IsCompleted)
{
try
{
PrintLog(_messageQueue.Take());
}
catch (InvalidOperationException)
{
// IOE means that Take() was called on a completed collection.
// Some other thread can call CompleteAdding after we pass the
// IsCompleted check but before we call Take.
// We can simply catch the exception since the loop will break
// on the next iteration.
}
}
});
_messageThread.IsBackground = true;
_messageThread.Start();
2018-04-24 18:57:39 +00:00
}
private static void PrintLog(LogEventArgs e)
2018-04-24 18:57:39 +00:00
{
StringBuilder sb = new StringBuilder();
2018-04-24 18:57:39 +00:00
sb.AppendFormat(@"{0:hh\:mm\:ss\.fff}", e.Time);
sb.Append(" | ");
sb.AppendFormat("{0:d4}", e.ThreadId);
sb.Append(' ');
sb.Append(e.Message);
if (e.Data != null)
2018-04-24 18:57:39 +00:00
{
PropertyInfo[] props = e.Data.GetType().GetProperties();
sb.Append(' ');
foreach (var prop in props)
2018-04-24 18:57:39 +00:00
{
sb.Append(prop.Name);
sb.Append(": ");
sb.Append(prop.GetValue(e.Data));
sb.Append(" - ");
}
2018-04-24 18:57:39 +00:00
// We remove the final '-' from the string
if (props.Length > 0)
{
sb.Remove(sb.Length - 3, 3);
2018-04-24 18:57:39 +00:00
}
}
if (_logColors.TryGetValue(e.Level, out ConsoleColor color))
{
Console.ForegroundColor = color;
Console.WriteLine(sb.ToString());
Console.ResetColor();
}
2018-04-24 18:57:39 +00:00
else
{
Console.WriteLine(sb.ToString());
2018-04-24 18:57:39 +00:00
}
}
public static void Log(object sender, LogEventArgs e)
{
if (!_messageQueue.IsAddingCompleted)
{
_messageQueue.Add(e);
}
}
2018-04-24 18:57:39 +00:00
}
}