Logger.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Diagnostics;
  3. using System.Runtime.CompilerServices;
  4. namespace Ryujinx.HLE.Logging
  5. {
  6. public class Logger
  7. {
  8. private bool[] EnabledLevels;
  9. private bool[] EnabledClasses;
  10. public event EventHandler<LogEventArgs> Updated;
  11. private Stopwatch Time;
  12. public Logger()
  13. {
  14. EnabledLevels = new bool[Enum.GetNames(typeof(LogLevel)).Length];
  15. EnabledClasses = new bool[Enum.GetNames(typeof(LogClass)).Length];
  16. EnabledLevels[(int)LogLevel.Stub] = true;
  17. EnabledLevels[(int)LogLevel.Info] = true;
  18. EnabledLevels[(int)LogLevel.Warning] = true;
  19. EnabledLevels[(int)LogLevel.Error] = true;
  20. for (int Index = 0; Index < EnabledClasses.Length; Index++)
  21. {
  22. EnabledClasses[Index] = true;
  23. }
  24. Time = new Stopwatch();
  25. Time.Start();
  26. }
  27. public void SetEnable(LogLevel Level, bool Enabled)
  28. {
  29. EnabledLevels[(int)Level] = Enabled;
  30. }
  31. public void SetEnable(LogClass Class, bool Enabled)
  32. {
  33. EnabledClasses[(int)Class] = Enabled;
  34. }
  35. internal void PrintDebug(LogClass Class, string Message, [CallerMemberName] string Caller = "")
  36. {
  37. Print(LogLevel.Debug, Class, GetFormattedMessage(Class, Message, Caller));
  38. }
  39. internal void PrintStub(LogClass Class, string Message, [CallerMemberName] string Caller = "")
  40. {
  41. Print(LogLevel.Stub, Class, GetFormattedMessage(Class, Message, Caller));
  42. }
  43. internal void PrintInfo(LogClass Class, string Message, [CallerMemberName] string Caller = "")
  44. {
  45. Print(LogLevel.Info, Class, GetFormattedMessage(Class, Message, Caller));
  46. }
  47. internal void PrintWarning(LogClass Class, string Message, [CallerMemberName] string Caller = "")
  48. {
  49. Print(LogLevel.Warning, Class, GetFormattedMessage(Class, Message, Caller));
  50. }
  51. internal void PrintError(LogClass Class, string Message, [CallerMemberName] string Caller = "")
  52. {
  53. Print(LogLevel.Error, Class, GetFormattedMessage(Class, Message, Caller));
  54. }
  55. private void Print(LogLevel Level, LogClass Class, string Message)
  56. {
  57. if (EnabledLevels[(int)Level] && EnabledClasses[(int)Class])
  58. {
  59. Updated?.Invoke(this, new LogEventArgs(Level, Time.Elapsed, Message));
  60. }
  61. }
  62. private string GetFormattedMessage(LogClass Class, string Message, string Caller)
  63. {
  64. return $"{Class} {Caller}: {Message}";
  65. }
  66. }
  67. }