diff --git a/Moonlight/App/Extensions/JSRuntimeExtensions.cs b/Moonlight/App/Extensions/JSRuntimeExtensions.cs new file mode 100644 index 00000000..7d6f4511 --- /dev/null +++ b/Moonlight/App/Extensions/JSRuntimeExtensions.cs @@ -0,0 +1,30 @@ +using Microsoft.JSInterop; + +namespace Moonlight.App.Extensions; + +public static class JSRuntimeExtensions +{ + public static async Task InvokeVoidSafeAsync(this IJSRuntime jsRuntime, string method, params object[] args) + { + try + { + await jsRuntime.InvokeVoidAsync(method, args); + } + catch (Exception) + { + // ignored + } + } + + public static void InvokeVoidSafe(this IJSRuntime jsRuntime, string method, params object[] args) + { + try + { + jsRuntime.InvokeVoidAsync(method, args); + } + catch (Exception) + { + // ignored + } + } +} \ No newline at end of file diff --git a/Moonlight/App/LogMigrator/LogMigrator.cs b/Moonlight/App/LogMigrator/LogMigrator.cs index d7644dfb..0837ff3d 100644 --- a/Moonlight/App/LogMigrator/LogMigrator.cs +++ b/Moonlight/App/LogMigrator/LogMigrator.cs @@ -27,19 +27,39 @@ public class LogMigrator : ILogger switch (logLevel) { case LogLevel.Critical: - Logger.Fatal($"[{Name}] {formatter(state, exception)}"); + Logger.Fatal(formatter(state, exception)); + + if(exception != null) + Logger.Fatal(exception); + break; case LogLevel.Warning: - Logger.Warn($"[{Name}] {formatter(state, exception)}"); + Logger.Warn(formatter(state, exception)); + + if(exception != null) + Logger.Warn(exception); + break; case LogLevel.Debug: - Logger.Debug($"[{Name}] {formatter(state, exception)}"); + Logger.Debug(formatter(state, exception)); + + if(exception != null) + Logger.Debug(exception); + break; case LogLevel.Error: - Logger.Error($"[{Name}] {formatter(state, exception)}"); + Logger.Error(formatter(state, exception)); + + if(exception != null) + Logger.Error(exception); + break; case LogLevel.Information: - Logger.Info($"[{Name}] {formatter(state, exception)}"); + Logger.Info(formatter(state, exception)); + + if(exception != null) + Logger.Info(exception); + break; } } diff --git a/Moonlight/App/LogMigrator/SentryDiagnosticsLogger.cs b/Moonlight/App/LogMigrator/SentryDiagnosticsLogger.cs new file mode 100644 index 00000000..a042a88b --- /dev/null +++ b/Moonlight/App/LogMigrator/SentryDiagnosticsLogger.cs @@ -0,0 +1,71 @@ +using Moonlight.App.Helpers; +using Sentry; +using Sentry.Extensibility; + +namespace Moonlight.App.LogMigrator; + +public class SentryDiagnosticsLogger : IDiagnosticLogger +{ + private readonly SentryLevel Level; + + public SentryDiagnosticsLogger(SentryLevel level) + { + Level = level; + } + + public bool IsEnabled(SentryLevel level) + { + if ((int)level >= (int)Level) + { + return true; + } + + return false; + } + + public void Log(SentryLevel logLevel, string message, Exception? exception = null, params object?[] args) + { + switch (logLevel) + { + case SentryLevel.Debug: + Logger.Debug(string.Format(message, args)); + + if(exception != null) + Logger.Debug(exception); + + break; + + case SentryLevel.Info: + Logger.Info(string.Format(message, args)); + + if(exception != null) + Logger.Info(exception); + + break; + + case SentryLevel.Warning: + Logger.Warn(string.Format(message, args)); + + if(exception != null) + Logger.Warn(exception); + + break; + + case SentryLevel.Error: + Logger.Error(string.Format(message, args)); + + if(exception != null) + Logger.Error(exception); + + break; + + case SentryLevel.Fatal: + Logger.Fatal(string.Format(message, args)); + + if(exception != null) + Logger.Fatal(exception); + + break; + } + } +} \ No newline at end of file diff --git a/Moonlight/App/Services/Files/StorageService.cs b/Moonlight/App/Services/Files/StorageService.cs index e1b32aad..9d05c692 100644 --- a/Moonlight/App/Services/Files/StorageService.cs +++ b/Moonlight/App/Services/Files/StorageService.cs @@ -15,6 +15,7 @@ public class StorageService Directory.CreateDirectory(PathBuilder.Dir("storage", "configs")); Directory.CreateDirectory(PathBuilder.Dir("storage", "resources")); Directory.CreateDirectory(PathBuilder.Dir("storage", "backups")); + Directory.CreateDirectory(PathBuilder.Dir("storage", "logs")); if(IsEmpty(PathBuilder.Dir("storage", "resources"))) { diff --git a/Moonlight/Moonlight.csproj b/Moonlight/Moonlight.csproj index dec7a172..3a697212 100644 --- a/Moonlight/Moonlight.csproj +++ b/Moonlight/Moonlight.csproj @@ -49,6 +49,7 @@ + diff --git a/Moonlight/Program.cs b/Moonlight/Program.cs index d706fd97..608c1f75 100644 --- a/Moonlight/Program.cs +++ b/Moonlight/Program.cs @@ -56,6 +56,7 @@ namespace Moonlight .Enrich.FromLogContext() .WriteTo.Console( outputTemplate: "{Timestamp:HH:mm:ss} [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}") + .WriteTo.File(PathBuilder.File("storage", "logs", $"{DateTime.UtcNow:yyyy-MM-dd}.log")) .WriteTo.Sentry(options => { options.MinimumBreadcrumbLevel = LogEventLevel.Debug; @@ -70,6 +71,7 @@ namespace Moonlight .Enrich.FromLogContext() .WriteTo.Console( outputTemplate: "{Timestamp:HH:mm:ss} [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}") + .WriteTo.File(PathBuilder.File("storage", "logs", $"{DateTime.UtcNow:yyyy-MM-dd}.log")) .CreateLogger(); } } @@ -87,6 +89,7 @@ namespace Moonlight options.MinimumBreadcrumbLevel = LogEventLevel.Information; options.MinimumEventLevel = LogEventLevel.Warning; }) + .WriteTo.File(PathBuilder.File("storage", "logs", $"{DateTime.UtcNow:yyyy-MM-dd}.log")) .CreateLogger(); } else @@ -96,6 +99,7 @@ namespace Moonlight .Enrich.FromLogContext() .WriteTo.Console( outputTemplate: "{Timestamp:HH:mm:ss} [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}") + .WriteTo.File(PathBuilder.File("storage", "logs", $"{DateTime.UtcNow:yyyy-MM-dd}.log")) .CreateLogger(); } } @@ -111,8 +115,8 @@ namespace Moonlight // Switch to logging.net injection // TODO: Enable in production - //builder.Logging.ClearProviders(); - //builder.Logging.AddProvider(new LogMigratorProvider()); + builder.Logging.ClearProviders(); + builder.Logging.AddProvider(new LogMigratorProvider()); // Add services to the container. builder.Services.AddRazorPages(); @@ -141,6 +145,9 @@ namespace Moonlight options.Debug = configService.DebugMode; options.DiagnosticLevel = SentryLevel.Warning; + options.TracesSampleRate = 1.0; + + options.DiagnosticLogger = new SentryDiagnosticsLogger(SentryLevel.Warning); }); } diff --git a/Moonlight/Shared/Components/Navigations/AdminSystemNavigation.razor b/Moonlight/Shared/Components/Navigations/AdminSystemNavigation.razor index d282f343..f4dcab1f 100644 --- a/Moonlight/Shared/Components/Navigations/AdminSystemNavigation.razor +++ b/Moonlight/Shared/Components/Navigations/AdminSystemNavigation.razor @@ -10,8 +10,8 @@