DefaultLogFormatter.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Reflection;
  3. using System.Text;
  4. namespace Ryujinx.Common.Logging
  5. {
  6. internal class DefaultLogFormatter : ILogFormatter
  7. {
  8. private static readonly ObjectPool<StringBuilder> _stringBuilderPool = SharedPools.Default<StringBuilder>();
  9. public string Format(LogEventArgs args)
  10. {
  11. StringBuilder sb = _stringBuilderPool.Allocate();
  12. try
  13. {
  14. sb.Clear();
  15. sb.AppendFormat(@"{0:hh\:mm\:ss\.fff}", args.Time);
  16. sb.Append($" |{args.Level.ToString()[0]}| ");
  17. if (args.ThreadName != null)
  18. {
  19. sb.Append(args.ThreadName);
  20. sb.Append(' ');
  21. }
  22. sb.Append(args.Message);
  23. if (args.Data != null)
  24. {
  25. PropertyInfo[] props = args.Data.GetType().GetProperties();
  26. sb.Append(" {");
  27. foreach (var prop in props)
  28. {
  29. sb.Append(prop.Name);
  30. sb.Append(": ");
  31. if (typeof(Array).IsAssignableFrom(prop.PropertyType))
  32. {
  33. Array array = (Array)prop.GetValue(args.Data);
  34. foreach (var item in array)
  35. {
  36. sb.Append(item.ToString());
  37. sb.Append(", ");
  38. }
  39. if (array.Length > 0)
  40. {
  41. sb.Remove(sb.Length - 2, 2);
  42. }
  43. }
  44. else
  45. {
  46. sb.Append(prop.GetValue(args.Data));
  47. }
  48. sb.Append(" ; ");
  49. }
  50. // We remove the final ';' from the string
  51. if (props.Length > 0)
  52. {
  53. sb.Remove(sb.Length - 3, 3);
  54. }
  55. sb.Append('}');
  56. }
  57. return sb.ToString();
  58. }
  59. finally
  60. {
  61. _stringBuilderPool.Release(sb);
  62. }
  63. }
  64. }
  65. }