LoggerAdapter.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using Avalonia.Logging;
  2. using Avalonia.Utilities;
  3. using Gommon;
  4. using Ryujinx.Common.Logging;
  5. using System;
  6. using System.Text;
  7. namespace Ryujinx.Ava.UI.Helpers
  8. {
  9. using AvaLogger = Avalonia.Logging.Logger;
  10. using AvaLogLevel = LogEventLevel;
  11. using RyuLogClass = LogClass;
  12. using RyuLogger = Ryujinx.Common.Logging.Logger;
  13. internal class LoggerAdapter : ILogSink
  14. {
  15. public static void Register()
  16. {
  17. AvaLogger.Sink = new LoggerAdapter();
  18. }
  19. private static RyuLogger.Log? GetLog(AvaLogLevel level, string area)
  20. {
  21. return level switch
  22. {
  23. AvaLogLevel.Verbose => RyuLogger.Debug,
  24. AvaLogLevel.Debug => RyuLogger.Debug,
  25. AvaLogLevel.Information => RyuLogger.Debug,
  26. AvaLogLevel.Warning => RyuLogger.Debug,
  27. AvaLogLevel.Error => area is "IME" ? RyuLogger.Debug : RyuLogger.Error,
  28. AvaLogLevel.Fatal => RyuLogger.Error,
  29. _ => throw new ArgumentOutOfRangeException(nameof(level), level, null),
  30. };
  31. }
  32. public bool IsEnabled(AvaLogLevel level, string area)
  33. {
  34. return GetLog(level, area) != null;
  35. }
  36. public void Log(AvaLogLevel level, string area, object source, string messageTemplate)
  37. {
  38. GetLog(level, area)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, null));
  39. }
  40. public void Log(AvaLogLevel level, string area, object source, string messageTemplate, params object[] propertyValues)
  41. {
  42. GetLog(level, area)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, propertyValues));
  43. }
  44. private static string Format(AvaLogLevel level, string area, string template, object source, object[] v)
  45. {
  46. StringBuilder result = new();
  47. CharacterReader r = new(template.AsSpan());
  48. int i = 0;
  49. result.Append('[');
  50. result.Append(level);
  51. result.Append("] ");
  52. result.Append('[');
  53. result.Append(area);
  54. result.Append("] ");
  55. while (!r.End)
  56. {
  57. char c = r.Take();
  58. if (c != '{')
  59. {
  60. result.Append(c);
  61. }
  62. else
  63. {
  64. if (r.Peek != '{')
  65. {
  66. result.Append('\'');
  67. result.Append(i < v.Length ? v[i++] : null);
  68. result.Append('\'');
  69. r.TakeUntil('}');
  70. r.Take();
  71. }
  72. else
  73. {
  74. result.Append('{');
  75. r.Take();
  76. }
  77. }
  78. }
  79. if (source != null)
  80. {
  81. result.Append(" (");
  82. result.Append(source.GetType().AsFullNamePrettyString());
  83. result.Append(" #");
  84. result.Append(source.GetHashCode());
  85. result.Append(')');
  86. }
  87. return result.ToString();
  88. }
  89. }
  90. }