diff --git a/osu.Desktop/Program.cs b/osu.Desktop/Program.cs index 19ceade644..db77427f96 100644 --- a/osu.Desktop/Program.cs +++ b/osu.Desktop/Program.cs @@ -62,9 +62,11 @@ namespace osu.Desktop { bool continueExecution = Interlocked.Decrement(ref allowableExceptions) >= 0; - Logger.Log($"Unhandled exception has been {(continueExecution ? "allowed" : "denied")} with {allowableExceptions} more allowable exceptions."); + Logger.Log($"Unhandled exception has been {(continueExecution ? "allowed with {allowableExceptions} more allowable exceptions" : "denied")} ."); + // restore the stock of allowable exceptions after a short delay. Task.Delay(1000).ContinueWith(_ => Interlocked.Increment(ref allowableExceptions)); + return continueExecution; } } diff --git a/osu.Game/Utils/RavenLogger.cs b/osu.Game/Utils/RavenLogger.cs index 761bd51672..70080fefa8 100644 --- a/osu.Game/Utils/RavenLogger.cs +++ b/osu.Game/Utils/RavenLogger.cs @@ -19,18 +19,30 @@ namespace osu.Game.Utils private readonly List tasks = new List(); + private Exception lastException; + public RavenLogger(OsuGame game) { raven.Release = game.Version; - if (!game.IsDeployedBuild) return; - Logger.NewEntry += entry => { if (entry.Level < LogLevel.Verbose) return; - if (entry.Exception != null) - queuePendingTask(raven.CaptureAsync(new SentryEvent(entry.Exception))); + var exception = entry.Exception; + + if (exception != null) + { + // since we let unhandled exceptions go ignored at times, we want to ensure they don't get submitted on subsequent reports. + if (lastException != null && + lastException.Message == exception.Message && exception.StackTrace.StartsWith(lastException.StackTrace)) + { + return; + } + + lastException = exception; + queuePendingTask(raven.CaptureAsync(new SentryEvent(exception))); + } else raven.AddTrail(new Breadcrumb(entry.Target.ToString(), BreadcrumbType.Navigation) { Message = entry.Message }); };