diff options
Diffstat (limited to 'Ryujinx.Common/Logging')
| -rw-r--r-- | Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs | 54 | ||||
| -rw-r--r-- | Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs | 84 | ||||
| -rw-r--r-- | Ryujinx.Common/Logging/LogClass.cs | 4 | ||||
| -rw-r--r-- | Ryujinx.Common/Logging/LogEventArgs.cs | 10 | ||||
| -rw-r--r-- | Ryujinx.Common/Logging/LogEventArgsJson.cs | 30 | ||||
| -rw-r--r-- | Ryujinx.Common/Logging/LogEventJsonSerializerContext.cs | 9 | ||||
| -rw-r--r-- | Ryujinx.Common/Logging/LogLevel.cs | 4 | ||||
| -rw-r--r-- | Ryujinx.Common/Logging/Targets/JsonLogTarget.cs | 12 |
8 files changed, 144 insertions, 63 deletions
diff --git a/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs b/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs index b9a08323..28a7d546 100644 --- a/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs +++ b/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs @@ -1,22 +1,20 @@ -using System; -using System.Reflection; -using System.Text; +using System.Text; namespace Ryujinx.Common.Logging { internal class DefaultLogFormatter : ILogFormatter { - private static readonly ObjectPool<StringBuilder> _stringBuilderPool = SharedPools.Default<StringBuilder>(); + private static readonly ObjectPool<StringBuilder> StringBuilderPool = SharedPools.Default<StringBuilder>(); public string Format(LogEventArgs args) { - StringBuilder sb = _stringBuilderPool.Allocate(); + StringBuilder sb = StringBuilderPool.Allocate(); try { sb.Clear(); - sb.AppendFormat(@"{0:hh\:mm\:ss\.fff}", args.Time); + sb.Append($@"{args.Time:hh\:mm\:ss\.fff}"); sb.Append($" |{args.Level.ToString()[0]}| "); if (args.ThreadName != null) @@ -27,53 +25,17 @@ namespace Ryujinx.Common.Logging sb.Append(args.Message); - if (args.Data != null) + if (args.Data is not null) { - PropertyInfo[] props = args.Data.GetType().GetProperties(); - - sb.Append(" {"); - - foreach (var prop in props) - { - sb.Append(prop.Name); - sb.Append(": "); - - if (typeof(Array).IsAssignableFrom(prop.PropertyType)) - { - Array array = (Array)prop.GetValue(args.Data); - foreach (var item in array) - { - sb.Append(item.ToString()); - sb.Append(", "); - } - - if (array.Length > 0) - { - sb.Remove(sb.Length - 2, 2); - } - } - else - { - 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); - } - - sb.Append('}'); + sb.Append(' '); + DynamicObjectFormatter.Format(sb, args.Data); } return sb.ToString(); } finally { - _stringBuilderPool.Release(sb); + StringBuilderPool.Release(sb); } } } diff --git a/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs b/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs new file mode 100644 index 00000000..5f15cc2a --- /dev/null +++ b/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs @@ -0,0 +1,84 @@ +#nullable enable +using System; +using System.Reflection; +using System.Text; + +namespace Ryujinx.Common.Logging +{ + internal class DynamicObjectFormatter + { + private static readonly ObjectPool<StringBuilder> StringBuilderPool = SharedPools.Default<StringBuilder>(); + + public static string? Format(object? dynamicObject) + { + if (dynamicObject is null) + { + return null; + } + + StringBuilder sb = StringBuilderPool.Allocate(); + + try + { + Format(sb, dynamicObject); + + return sb.ToString(); + } + finally + { + StringBuilderPool.Release(sb); + } + } + + public static void Format(StringBuilder sb, object? dynamicObject) + { + if (dynamicObject is null) + { + return; + } + + PropertyInfo[] props = dynamicObject.GetType().GetProperties(); + + sb.Append('{'); + + foreach (var prop in props) + { + sb.Append(prop.Name); + sb.Append(": "); + + if (typeof(Array).IsAssignableFrom(prop.PropertyType)) + { + Array? array = (Array?) prop.GetValue(dynamicObject); + + if (array is not null) + { + foreach (var item in array) + { + sb.Append(item); + sb.Append(", "); + } + + if (array.Length > 0) + { + sb.Remove(sb.Length - 2, 2); + } + } + } + else + { + sb.Append(prop.GetValue(dynamicObject)); + } + + sb.Append(" ; "); + } + + // We remove the final ';' from the string + if (props.Length > 0) + { + sb.Remove(sb.Length - 3, 3); + } + + sb.Append('}'); + } + } +}
\ No newline at end of file diff --git a/Ryujinx.Common/Logging/LogClass.cs b/Ryujinx.Common/Logging/LogClass.cs index 7e53c972..e62676cd 100644 --- a/Ryujinx.Common/Logging/LogClass.cs +++ b/Ryujinx.Common/Logging/LogClass.cs @@ -1,5 +1,9 @@ +using Ryujinx.Common.Utilities; +using System.Text.Json.Serialization; + namespace Ryujinx.Common.Logging { + [JsonConverter(typeof(TypedStringEnumConverter<LogClass>))] public enum LogClass { Application, diff --git a/Ryujinx.Common/Logging/LogEventArgs.cs b/Ryujinx.Common/Logging/LogEventArgs.cs index 511c8e6e..a27af780 100644 --- a/Ryujinx.Common/Logging/LogEventArgs.cs +++ b/Ryujinx.Common/Logging/LogEventArgs.cs @@ -11,15 +11,7 @@ namespace Ryujinx.Common.Logging public readonly string Message; public readonly object Data; - public LogEventArgs(LogLevel level, TimeSpan time, string threadName, string message) - { - Level = level; - Time = time; - ThreadName = threadName; - Message = message; - } - - public LogEventArgs(LogLevel level, TimeSpan time, string threadName, string message, object data) + public LogEventArgs(LogLevel level, TimeSpan time, string threadName, string message, object data = null) { Level = level; Time = time; diff --git a/Ryujinx.Common/Logging/LogEventArgsJson.cs b/Ryujinx.Common/Logging/LogEventArgsJson.cs new file mode 100644 index 00000000..425b9766 --- /dev/null +++ b/Ryujinx.Common/Logging/LogEventArgsJson.cs @@ -0,0 +1,30 @@ +using System; +using System.Text.Json.Serialization; + +namespace Ryujinx.Common.Logging +{ + internal class LogEventArgsJson + { + public LogLevel Level { get; } + public TimeSpan Time { get; } + public string ThreadName { get; } + + public string Message { get; } + public string Data { get; } + + [JsonConstructor] + public LogEventArgsJson(LogLevel level, TimeSpan time, string threadName, string message, string data = null) + { + Level = level; + Time = time; + ThreadName = threadName; + Message = message; + Data = data; + } + + public static LogEventArgsJson FromLogEventArgs(LogEventArgs args) + { + return new LogEventArgsJson(args.Level, args.Time, args.ThreadName, args.Message, DynamicObjectFormatter.Format(args.Data)); + } + } +}
\ No newline at end of file diff --git a/Ryujinx.Common/Logging/LogEventJsonSerializerContext.cs b/Ryujinx.Common/Logging/LogEventJsonSerializerContext.cs new file mode 100644 index 00000000..da21f11e --- /dev/null +++ b/Ryujinx.Common/Logging/LogEventJsonSerializerContext.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Ryujinx.Common.Logging +{ + [JsonSerializable(typeof(LogEventArgsJson))] + internal partial class LogEventJsonSerializerContext : JsonSerializerContext + { + } +}
\ No newline at end of file diff --git a/Ryujinx.Common/Logging/LogLevel.cs b/Ryujinx.Common/Logging/LogLevel.cs index 8857fb45..3786c756 100644 --- a/Ryujinx.Common/Logging/LogLevel.cs +++ b/Ryujinx.Common/Logging/LogLevel.cs @@ -1,5 +1,9 @@ +using Ryujinx.Common.Utilities; +using System.Text.Json.Serialization; + namespace Ryujinx.Common.Logging { + [JsonConverter(typeof(TypedStringEnumConverter<LogLevel>))] public enum LogLevel { Debug, diff --git a/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs b/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs index 95f96576..06976433 100644 --- a/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs +++ b/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs @@ -1,5 +1,5 @@ -using System.IO; -using System.Text.Json; +using Ryujinx.Common.Utilities; +using System.IO; namespace Ryujinx.Common.Logging { @@ -25,12 +25,8 @@ namespace Ryujinx.Common.Logging public void Log(object sender, LogEventArgs e) { - string text = JsonSerializer.Serialize(e); - - using (BinaryWriter writer = new BinaryWriter(_stream)) - { - writer.Write(text); - } + var logEventArgsJson = LogEventArgsJson.FromLogEventArgs(e); + JsonHelper.SerializeToStream(_stream, logEventArgsJson, LogEventJsonSerializerContext.Default.LogEventArgsJson); } public void Dispose() |
