LoggerModule.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using Ryujinx.Common;
  2. using Ryujinx.Common.Configuration;
  3. using Ryujinx.Common.Logging;
  4. using Ryujinx.Common.Logging.Targets;
  5. using System;
  6. using System.IO;
  7. namespace Ryujinx.Ui.Common.Configuration
  8. {
  9. public static class LoggerModule
  10. {
  11. public static string LogDirectoryPath { get; private set; }
  12. public static void Initialize()
  13. {
  14. ConfigurationState.Instance.Logger.EnableDebug.Event += ReloadEnableDebug;
  15. ConfigurationState.Instance.Logger.EnableStub.Event += ReloadEnableStub;
  16. ConfigurationState.Instance.Logger.EnableInfo.Event += ReloadEnableInfo;
  17. ConfigurationState.Instance.Logger.EnableWarn.Event += ReloadEnableWarning;
  18. ConfigurationState.Instance.Logger.EnableError.Event += ReloadEnableError;
  19. ConfigurationState.Instance.Logger.EnableTrace.Event += ReloadEnableTrace;
  20. ConfigurationState.Instance.Logger.EnableGuest.Event += ReloadEnableGuest;
  21. ConfigurationState.Instance.Logger.EnableFsAccessLog.Event += ReloadEnableFsAccessLog;
  22. ConfigurationState.Instance.Logger.FilteredClasses.Event += ReloadFilteredClasses;
  23. ConfigurationState.Instance.Logger.EnableFileLog.Event += ReloadFileLogger;
  24. }
  25. private static void ReloadEnableDebug(object sender, ReactiveEventArgs<bool> e)
  26. {
  27. Logger.SetEnable(LogLevel.Debug, e.NewValue);
  28. }
  29. private static void ReloadEnableStub(object sender, ReactiveEventArgs<bool> e)
  30. {
  31. Logger.SetEnable(LogLevel.Stub, e.NewValue);
  32. }
  33. private static void ReloadEnableInfo(object sender, ReactiveEventArgs<bool> e)
  34. {
  35. Logger.SetEnable(LogLevel.Info, e.NewValue);
  36. }
  37. private static void ReloadEnableWarning(object sender, ReactiveEventArgs<bool> e)
  38. {
  39. Logger.SetEnable(LogLevel.Warning, e.NewValue);
  40. }
  41. private static void ReloadEnableError(object sender, ReactiveEventArgs<bool> e)
  42. {
  43. Logger.SetEnable(LogLevel.Error, e.NewValue);
  44. }
  45. private static void ReloadEnableTrace(object sender, ReactiveEventArgs<bool> e)
  46. {
  47. Logger.SetEnable(LogLevel.Trace, e.NewValue);
  48. }
  49. private static void ReloadEnableGuest(object sender, ReactiveEventArgs<bool> e)
  50. {
  51. Logger.SetEnable(LogLevel.Guest, e.NewValue);
  52. }
  53. private static void ReloadEnableFsAccessLog(object sender, ReactiveEventArgs<bool> e)
  54. {
  55. Logger.SetEnable(LogLevel.AccessLog, e.NewValue);
  56. }
  57. private static void ReloadFilteredClasses(object sender, ReactiveEventArgs<LogClass[]> e)
  58. {
  59. bool noFilter = e.NewValue.Length == 0;
  60. foreach (var logClass in Enum.GetValues<LogClass>())
  61. {
  62. Logger.SetEnable(logClass, noFilter);
  63. }
  64. foreach (var logClass in e.NewValue)
  65. {
  66. Logger.SetEnable(logClass, true);
  67. }
  68. }
  69. private static void ReloadFileLogger(object sender, ReactiveEventArgs<bool> e)
  70. {
  71. if (e.NewValue)
  72. {
  73. string logDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs");
  74. FileStream logFile = FileLogTarget.PrepareLogFile(logDir);
  75. if (logFile == null)
  76. {
  77. logDir = Path.Combine(AppDataManager.BaseDirPath, "Logs");
  78. logFile = FileLogTarget.PrepareLogFile(logDir);
  79. if (logFile == null)
  80. {
  81. Logger.Error?.Print(LogClass.Application, "No writable log directory available. Make sure either the application directory or the Ryujinx directory is writable.");
  82. LogDirectoryPath = null;
  83. Logger.RemoveTarget("file");
  84. return;
  85. }
  86. }
  87. LogDirectoryPath = logDir;
  88. Logger.AddTarget(new AsyncLogTargetWrapper(
  89. new FileLogTarget("file", logFile),
  90. 1000,
  91. AsyncLogTargetOverflowAction.Block
  92. ));
  93. }
  94. else
  95. {
  96. Logger.RemoveTarget("file");
  97. }
  98. }
  99. }
  100. }