diff --git a/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs b/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs new file mode 100644 index 0000000000..0c4396e7f2 --- /dev/null +++ b/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs @@ -0,0 +1,53 @@ +using System.Reflection; +using System.Text; + +namespace Ryujinx.Common.Logging +{ + internal class DefaultLogFormatter : ILogFormatter + { + private static readonly ObjectPool _stringBuilderPool = SharedPools.Default(); + + public string Format(LogEventArgs args) + { + StringBuilder sb = _stringBuilderPool.Allocate(); + + try + { + sb.Clear(); + + sb.AppendFormat(@"{0:hh\:mm\:ss\.fff}", args.Time); + sb.Append(" | "); + sb.AppendFormat("{0:d4}", args.ThreadId); + sb.Append(' '); + sb.Append(args.Message); + + if (args.Data != null) + { + PropertyInfo[] props = args.Data.GetType().GetProperties(); + + sb.Append(' '); + + foreach (var prop in props) + { + sb.Append(prop.Name); + sb.Append(": "); + sb.Append(prop.GetValue(args.Data)); + sb.Append(" - "); + } + + // We remove the final '-' from the string + if (props.Length > 0) + { + sb.Remove(sb.Length - 3, 3); + } + } + + return sb.ToString(); + } + finally + { + _stringBuilderPool.Release(sb); + } + } + } +} diff --git a/Ryujinx.Common/Logging/Formatters/ILogFormatter.cs b/Ryujinx.Common/Logging/Formatters/ILogFormatter.cs new file mode 100644 index 0000000000..9a55bc6b0d --- /dev/null +++ b/Ryujinx.Common/Logging/Formatters/ILogFormatter.cs @@ -0,0 +1,7 @@ +namespace Ryujinx.Common.Logging +{ + interface ILogFormatter + { + string Format(LogEventArgs args); + } +} diff --git a/Ryujinx.Common/Logging/Targets/ConsoleLogTarget.cs b/Ryujinx.Common/Logging/Targets/ConsoleLogTarget.cs index 0d90d3f140..871076a41a 100644 --- a/Ryujinx.Common/Logging/Targets/ConsoleLogTarget.cs +++ b/Ryujinx.Common/Logging/Targets/ConsoleLogTarget.cs @@ -1,17 +1,14 @@ using System; using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Reflection; -using System.Text; namespace Ryujinx.Common.Logging { public class ConsoleLogTarget : ILogTarget { - private static readonly ObjectPool _stringBuilderPool = SharedPools.Default(); - private static readonly ConcurrentDictionary _logColors; + private readonly ILogFormatter _formatter; + static ConsoleLogTarget() { _logColors = new ConcurrentDictionary { @@ -22,57 +19,24 @@ namespace Ryujinx.Common.Logging }; } - public void Log(object sender, LogEventArgs e) + public ConsoleLogTarget() { - StringBuilder sb = _stringBuilderPool.Allocate(); + _formatter = new DefaultLogFormatter(); + } - try + public void Log(object sender, LogEventArgs args) + { + if (_logColors.TryGetValue(args.Level, out ConsoleColor color)) { - sb.Clear(); + Console.ForegroundColor = color; - sb.AppendFormat(@"{0:hh\:mm\:ss\.fff}", e.Time); - sb.Append(" | "); - sb.AppendFormat("{0:d4}", e.ThreadId); - sb.Append(' '); - sb.Append(e.Message); + Console.WriteLine(_formatter.Format(args)); - if (e.Data != null) - { - PropertyInfo[] props = e.Data.GetType().GetProperties(); - - sb.Append(' '); - - foreach (var prop in props) - { - sb.Append(prop.Name); - sb.Append(": "); - sb.Append(prop.GetValue(e.Data)); - sb.Append(" - "); - } - - // We remove the final '-' from the string - if (props.Length > 0) - { - sb.Remove(sb.Length - 3, 3); - } - } - - if (_logColors.TryGetValue(e.Level, out ConsoleColor color)) - { - Console.ForegroundColor = color; - - Console.WriteLine(sb.ToString()); - - Console.ResetColor(); - } - else - { - Console.WriteLine(sb.ToString()); - } + Console.ResetColor(); } - finally + else { - _stringBuilderPool.Release(sb); + Console.WriteLine(_formatter.Format(args)); } } diff --git a/Ryujinx.Common/Logging/Targets/FileLogTarget.cs b/Ryujinx.Common/Logging/Targets/FileLogTarget.cs index cba61edb9c..85dc82497a 100644 --- a/Ryujinx.Common/Logging/Targets/FileLogTarget.cs +++ b/Ryujinx.Common/Logging/Targets/FileLogTarget.cs @@ -1,5 +1,4 @@ using System.IO; -using System.Reflection; using System.Text; namespace Ryujinx.Common.Logging @@ -8,7 +7,8 @@ namespace Ryujinx.Common.Logging { private static readonly ObjectPool _stringBuilderPool = SharedPools.Default(); - private readonly StreamWriter _logWriter; + private readonly StreamWriter _logWriter; + private readonly ILogFormatter _formatter; public FileLogTarget(string path) : this(path, FileShare.Read, FileMode.Append) @@ -17,50 +17,13 @@ namespace Ryujinx.Common.Logging public FileLogTarget(string path, FileShare fileShare, FileMode fileMode) { _logWriter = new StreamWriter(File.Open(path, fileMode, FileAccess.Write, fileShare)); + _formatter = new DefaultLogFormatter(); } - public void Log(object sender, LogEventArgs e) + public void Log(object sender, LogEventArgs args) { - StringBuilder sb = _stringBuilderPool.Allocate(); - - try - { - sb.Clear(); - - 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) - { - PropertyInfo[] props = e.Data.GetType().GetProperties(); - - sb.Append(' '); - - foreach (var prop in props) - { - sb.Append(prop.Name); - sb.Append(": "); - sb.Append(prop.GetValue(e.Data)); - sb.Append(" - "); - } - - // We remove the final '-' from the string - if (props.Length > 0) - { - sb.Remove(sb.Length - 3, 3); - } - } - - _logWriter.WriteLine(sb.ToString()); - _logWriter.Flush(); - } - finally - { - _stringBuilderPool.Release(sb); - } + _logWriter.WriteLine(_formatter.Format(args)); + _logWriter.Flush(); } public void Dispose() diff --git a/Ryujinx.Common/Logging/Targets/ILogTarget.cs b/Ryujinx.Common/Logging/Targets/ILogTarget.cs index 6143b2bf93..261c5e64b2 100644 --- a/Ryujinx.Common/Logging/Targets/ILogTarget.cs +++ b/Ryujinx.Common/Logging/Targets/ILogTarget.cs @@ -4,6 +4,6 @@ namespace Ryujinx.Common.Logging { public interface ILogTarget : IDisposable { - void Log(object sender, LogEventArgs e); + void Log(object sender, LogEventArgs args); } } diff --git a/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs b/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs index 800560b6a3..e8b2a7de56 100644 --- a/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs +++ b/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs @@ -1,5 +1,4 @@ -using System; -using System.IO; +using System.IO; using Utf8Json; namespace Ryujinx.Common.Logging