2018-10-17 19:15:50 +02:00
|
|
|
using Ryujinx.Common.Logging;
|
2018-04-24 20:57:39 +02:00
|
|
|
using System;
|
2018-09-04 02:15:41 +02:00
|
|
|
using System.Collections.Concurrent;
|
2018-04-24 20:57:39 +02:00
|
|
|
using System.Collections.Generic;
|
2019-01-11 01:11:46 +01:00
|
|
|
using System.Reflection;
|
|
|
|
using System.Text;
|
2018-04-24 20:57:39 +02:00
|
|
|
using System.Threading;
|
|
|
|
|
|
|
|
namespace Ryujinx
|
|
|
|
{
|
|
|
|
static class ConsoleLog
|
|
|
|
{
|
2018-10-31 02:43:02 +01:00
|
|
|
private static Thread _messageThread;
|
2018-09-04 02:15:41 +02:00
|
|
|
|
2018-10-31 02:43:02 +01:00
|
|
|
private static BlockingCollection<LogEventArgs> _messageQueue;
|
2018-09-04 02:15:41 +02:00
|
|
|
|
2018-10-31 02:43:02 +01:00
|
|
|
private static Dictionary<LogLevel, ConsoleColor> _logColors;
|
2018-04-24 20:57:39 +02:00
|
|
|
|
|
|
|
static ConsoleLog()
|
|
|
|
{
|
2018-10-31 02:43:02 +01:00
|
|
|
_logColors = new Dictionary<LogLevel, ConsoleColor>()
|
2018-04-24 20:57:39 +02:00
|
|
|
{
|
|
|
|
{ LogLevel.Stub, ConsoleColor.DarkGray },
|
|
|
|
{ LogLevel.Info, ConsoleColor.White },
|
|
|
|
{ LogLevel.Warning, ConsoleColor.Yellow },
|
|
|
|
{ LogLevel.Error, ConsoleColor.Red }
|
|
|
|
};
|
|
|
|
|
2018-11-28 23:18:09 +01:00
|
|
|
_messageQueue = new BlockingCollection<LogEventArgs>(10);
|
2018-09-04 02:15:41 +02:00
|
|
|
|
2018-10-31 02:43:02 +01:00
|
|
|
_messageThread = new Thread(() =>
|
2018-09-04 02:15:41 +02:00
|
|
|
{
|
2018-10-31 02:43:02 +01:00
|
|
|
while (!_messageQueue.IsCompleted)
|
2018-09-04 02:15:41 +02:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2018-10-31 02:43:02 +01:00
|
|
|
PrintLog(_messageQueue.Take());
|
2018-09-04 02:15:41 +02:00
|
|
|
}
|
|
|
|
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.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2018-10-31 02:43:02 +01:00
|
|
|
_messageThread.IsBackground = true;
|
|
|
|
_messageThread.Start();
|
2018-04-24 20:57:39 +02:00
|
|
|
}
|
|
|
|
|
2018-09-04 02:15:41 +02:00
|
|
|
private static void PrintLog(LogEventArgs e)
|
2018-04-24 20:57:39 +02:00
|
|
|
{
|
2019-01-11 01:11:46 +01:00
|
|
|
StringBuilder sb = new StringBuilder();
|
2018-04-24 20:57:39 +02:00
|
|
|
|
2019-01-11 01:11:46 +01:00
|
|
|
sb.AppendFormat(@"{0:hh\:mm\:ss\.fff}", e.Time);
|
|
|
|
sb.Append(" | ");
|
|
|
|
sb.AppendFormat("{0:d4}", e.ThreadId);
|
|
|
|
sb.Append(' ');
|
|
|
|
sb.Append(e.Message);
|
2018-11-28 23:18:09 +01:00
|
|
|
|
2019-01-11 01:11:46 +01:00
|
|
|
if (e.Data != null)
|
2018-04-24 20:57:39 +02:00
|
|
|
{
|
2019-01-11 01:11:46 +01:00
|
|
|
PropertyInfo[] props = e.Data.GetType().GetProperties();
|
|
|
|
|
|
|
|
sb.Append(' ');
|
|
|
|
|
|
|
|
foreach (var prop in props)
|
2018-04-24 20:57:39 +02:00
|
|
|
{
|
2019-01-11 01:11:46 +01:00
|
|
|
sb.Append(prop.Name);
|
|
|
|
sb.Append(": ");
|
|
|
|
sb.Append(prop.GetValue(e.Data));
|
|
|
|
sb.Append(" - ");
|
|
|
|
}
|
2018-04-24 20:57:39 +02:00
|
|
|
|
2019-01-11 01:11:46 +01:00
|
|
|
// We remove the final '-' from the string
|
|
|
|
if (props.Length > 0)
|
|
|
|
{
|
|
|
|
sb.Remove(sb.Length - 3, 3);
|
2018-04-24 20:57:39 +02:00
|
|
|
}
|
|
|
|
}
|
2019-01-11 01:11:46 +01:00
|
|
|
|
|
|
|
if (_logColors.TryGetValue(e.Level, out ConsoleColor color))
|
|
|
|
{
|
|
|
|
Console.ForegroundColor = color;
|
|
|
|
|
|
|
|
Console.WriteLine(sb.ToString());
|
|
|
|
|
|
|
|
Console.ResetColor();
|
|
|
|
}
|
2018-04-24 20:57:39 +02:00
|
|
|
else
|
|
|
|
{
|
2019-01-11 01:11:46 +01:00
|
|
|
Console.WriteLine(sb.ToString());
|
2018-04-24 20:57:39 +02:00
|
|
|
}
|
|
|
|
}
|
2018-09-04 02:15:41 +02:00
|
|
|
|
|
|
|
public static void Log(object sender, LogEventArgs e)
|
|
|
|
{
|
2018-10-31 02:43:02 +01:00
|
|
|
if (!_messageQueue.IsAddingCompleted)
|
2018-09-04 02:15:41 +02:00
|
|
|
{
|
2018-10-31 02:43:02 +01:00
|
|
|
_messageQueue.Add(e);
|
2018-09-04 02:15:41 +02:00
|
|
|
}
|
|
|
|
}
|
2018-04-24 20:57:39 +02:00
|
|
|
}
|
|
|
|
}
|