Fixed: Improve Logging, Slowdown startup if non-recoverable errors

pull/4092/head
Qstick 5 years ago
parent 01b0365884
commit f0ef6c3601

@ -95,11 +95,11 @@ namespace NzbDrone.Api.Indexers
}
catch (NotImplementedException ex)
{
_logger.Error(ex, "One or more indexer you selected does not support movie search yet: " + ex.Message);
_logger.Error(ex, "One or more indexer you selected does not support movie search yet: {0}", ex.Message);
}
catch (Exception ex)
{
_logger.Error(ex, "Movie search failed: " + ex.Message);
_logger.Error(ex, "Movie search failed: {0}", ex.Message);
}
return new List<ReleaseResource>();

@ -1,8 +1,9 @@
using System;
using System;
using System.Security.AccessControl;
using System.Security.Principal;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Exceptions;
using NzbDrone.Common.Instrumentation;
namespace NzbDrone.Common.EnvironmentInfo
@ -27,12 +28,24 @@ namespace NzbDrone.Common.EnvironmentInfo
public void Register()
{
_diskProvider.EnsureFolder(_appFolderInfo.AppDataFolder);
try
{
_diskProvider.EnsureFolder(_appFolderInfo.AppDataFolder);
}
catch (UnauthorizedAccessException)
{
throw new RadarrStartupException("Cannot create AppFolder, Access to the path {0} is denied", _appFolderInfo.AppDataFolder);
}
if (OsInfo.IsWindows)
{
SetPermissions();
}
if (!_diskProvider.FolderWritable(_appFolderInfo.AppDataFolder))
{
throw new RadarrStartupException("AppFolder {0} is not writable", _appFolderInfo.AppDataFolder);
}
}
private void SetPermissions()

@ -0,0 +1,37 @@
using System;
namespace NzbDrone.Common.Exceptions
{
public class RadarrStartupException : NzbDroneException
{
public RadarrStartupException(string message, params object[] args)
: base("Radarr failed to start: " + string.Format(message, args))
{
}
public RadarrStartupException(string message)
: base("Radarr failed to start: " + message)
{
}
public RadarrStartupException()
: base("Radarr failed to start")
{
}
public RadarrStartupException(Exception innerException, string message, params object[] args)
: base("Radarr failed to start: " + string.Format(message, args), innerException)
{
}
public RadarrStartupException(Exception innerException, string message)
: base("Radarr failed to start: " + message, innerException)
{
}
public RadarrStartupException(Exception innerException)
: base("Radarr failed to start: " + innerException.Message)
{
}
}
}

@ -19,7 +19,7 @@ namespace NzbDrone.Common.Instrumentation
var exception = e.Exception;
Console.WriteLine("Task Error: {0}", exception);
Logger.Error(exception, "Task Error: " + exception.Message);
Logger.Error(exception, "Task Error");
}
private static void HandleAppDomainException(object sender, UnhandledExceptionEventArgs e)
@ -48,7 +48,7 @@ namespace NzbDrone.Common.Instrumentation
Console.WriteLine(exception.StackTrace);
Console.WriteLine("EPIC FAIL: {0}", exception);
Logger.Fatal(exception, "EPIC FAIL: " + exception.Message);
Logger.Fatal(exception, "EPIC FAIL.");
}
}
}

@ -69,7 +69,7 @@ namespace NzbDrone.Common.Instrumentation
else
{
dsn = RuntimeInfo.IsProduction
? "https://ef145e92efdd4155a0771c11c099695e@sentry.radarr.video/2"
? "https://a8e4c507c1f84578b55a841759a99dfb@sentry.radarr.video/2"
: "https://dee5b3fe26844368ac4458faa7d00a1f@sentry.radarr.video/9";
}

@ -14,6 +14,8 @@ namespace NzbDrone.Common.Instrumentation.Sentry
{
DefaultValueHandling = DefaultValueHandling.Ignore
};
Breadcrumbs = @event.Breadcrumbs;
}
public override string ToString(Formatting formatting)

@ -1,4 +1,7 @@
using Newtonsoft.Json.Linq;
using SharpRaven.Data;
using System;
using System.Linq;
namespace NzbDrone.Common.Instrumentation.Sentry
{
@ -22,6 +25,29 @@ namespace NzbDrone.Common.Instrumentation.Sentry
new CleansingJsonVisitor().Visit(target);
packet.Extra = target;
}
if (packet.Breadcrumbs != null)
{
for (var i = 0; i < packet.Breadcrumbs.Count; i++)
{
packet.Breadcrumbs[i] = CleanseBreadcrumb(packet.Breadcrumbs[i]);
}
}
}
private static Breadcrumb CleanseBreadcrumb(Breadcrumb b)
{
try
{
var message = CleanseLogMessage.Cleanse(b.Message);
var data = b.Data?.ToDictionary(x => x.Key, y => CleanseLogMessage.Cleanse(y.Value));
return new Breadcrumb(b.Category) { Message = message, Type = b.Type, Data = data, Level = b.Level };
}
catch (Exception)
{
}
return b;
}
}
}

@ -76,6 +76,16 @@ namespace NzbDrone.Common.Instrumentation.Sentry
{LogLevel.Warn, ErrorLevel.Warning},
};
private static readonly IDictionary<LogLevel, BreadcrumbLevel> BreadcrumbLevelMap = new Dictionary<LogLevel, BreadcrumbLevel>
{
{ LogLevel.Debug, BreadcrumbLevel.Debug },
{ LogLevel.Error, BreadcrumbLevel.Error },
{ LogLevel.Fatal, BreadcrumbLevel.Critical },
{ LogLevel.Info, BreadcrumbLevel.Info },
{ LogLevel.Trace, BreadcrumbLevel.Debug },
{ LogLevel.Warn, BreadcrumbLevel.Warning },
};
private readonly SentryDebounce _debounce;
private bool _unauthorized;
@ -199,6 +209,8 @@ namespace NzbDrone.Common.Instrumentation.Sentry
try
{
_client.AddTrail(new Breadcrumb(logEvent.LoggerName) { Level = BreadcrumbLevelMap[logEvent.Level], Message = logEvent.FormattedMessage });
// don't report non-critical events without exceptions
if (!IsSentryMessage(logEvent))
{
@ -249,12 +261,8 @@ namespace NzbDrone.Common.Instrumentation.Sentry
Array.ForEach((string[])logEvent.Properties["Sentry"], sentryEvent.Fingerprint.Add);
}
var osName = Environment.GetEnvironmentVariable("OS_NAME");
var osVersion = Environment.GetEnvironmentVariable("OS_VERSION");
var runTimeVersion = Environment.GetEnvironmentVariable("RUNTIME_VERSION");
sentryEvent.Tags.Add("os_name", osName);
sentryEvent.Tags.Add("os_version", $"{osName} {osVersion}");
sentryEvent.Tags.Add("runtime_version", $"{PlatformInfo.PlatformName} {runTimeVersion}");
_client.Capture(sentryEvent);

@ -103,6 +103,7 @@
<Compile Include="EnvironmentInfo\IOsVersionAdapter.cs" />
<Compile Include="EnvironmentInfo\IPlatformInfo.cs" />
<Compile Include="EnvironmentInfo\OsVersionModel.cs" />
<Compile Include="Exceptions\RadarrStartupException.cs" />
<Compile Include="Extensions\DictionaryExtensions.cs" />
<Compile Include="Disk\GdiPlusInterop.cs" />
<Compile Include="Disk\OsPath.cs" />

@ -1,7 +1,8 @@
using System;
using System;
using System.IO;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Exceptions;
namespace NzbDrone.Common.Processes
{
@ -37,8 +38,8 @@ namespace NzbDrone.Common.Processes
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to write PID file: " + filename);
throw;
_logger.Error(ex, "Unable to write PID file: {0}", filename);
throw new RadarrStartupException(ex, "Unable to write PID file {0}", filename);
}
}
}

@ -2,6 +2,7 @@ using System;
using System.Net.Sockets;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Exceptions;
using NzbDrone.Common.Instrumentation;
using Radarr.Host;
@ -15,7 +16,8 @@ namespace NzbDrone.Console
{
Normal = 0,
UnknownFailure = 1,
RecoverableFailure = 2
RecoverableFailure = 2,
NonRecoverableFailure = 3
}
public static void Main(string[] args)
@ -34,6 +36,13 @@ namespace NzbDrone.Console
}
Bootstrap.Start(startupArgs, new ConsoleAlerts());
}
catch (RadarrStartupException ex)
{
System.Console.WriteLine("");
System.Console.WriteLine("");
Logger.Fatal(ex, "EPIC FAIL!");
Exit(ExitCodes.NonRecoverableFailure);
}
catch (SocketException e)
{
System.Console.WriteLine("");
@ -53,7 +62,6 @@ namespace NzbDrone.Console
Exit(ExitCodes.Normal);
}
private static void Exit(ExitCodes exitCode)
{
LogManager.Shutdown();
@ -64,6 +72,19 @@ namespace NzbDrone.Console
System.Threading.Thread.Sleep(1000);
if (exitCode == ExitCodes.NonRecoverableFailure)
{
System.Console.WriteLine("Non-recoverable failure, waiting for user intervention...");
for (int i = 0; i < 3600; i++)
{
System.Threading.Thread.Sleep(1000);
if (System.Console.KeyAvailable)
{
break;
}
}
}
// Please note that ReadLine silently succeeds if there is no console, KeyAvailable does not.
System.Console.ReadLine();
}

@ -1,9 +1,9 @@
using System;
using System;
using NzbDrone.Common.Exceptions;
namespace NzbDrone.Core.Datastore
{
public class CorruptDatabaseException : NzbDroneException
public class CorruptDatabaseException : RadarrStartupException
{
public CorruptDatabaseException(string message, params object[] args) : base(message, args)
{

@ -1,4 +1,4 @@
using System;
using System;
using System.Data.SQLite;
using Marr.Data;
using Marr.Data.Reflection;
@ -6,6 +6,7 @@ using NLog;
using NzbDrone.Common.Composition;
using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Exceptions;
using NzbDrone.Common.Instrumentation;
using NzbDrone.Core.Datastore.Migration.Framework;
@ -116,6 +117,10 @@ namespace NzbDrone.Core.Datastore
throw new CorruptDatabaseException("Database file: {0} is corrupt, restore from backup if available. See: https://github.com/Radarr/Radarr/wiki/FAQ#i-am-getting-an-error-database-disk-image-is-malformed", ex, fileName);
}
}
catch (Exception e)
{
throw new RadarrStartupException(e, "Error creating main or log database");
}
var db = new Database(migrationContext.MigrationType.ToString(), () =>
{

@ -206,7 +206,7 @@ namespace NzbDrone.Core.DecisionEngine
{
e.Data.Add("report", remoteMovie.Release.ToJson());
e.Data.Add("parsed", remoteMovie.ParsedMovieInfo.ToJson());
_logger.Error(e, "Couldn't evaluate decision on " + remoteMovie.Release.Title + ", with spec: " + spec.GetType().Name);
_logger.Error(e, "Couldn't evaluate decision on {0}, with spec: {1}", remoteMovie.Release.Title, spec.GetType().Name);
return new Rejection(string.Format("{0}: {1}", spec.GetType().Name, e.Message));//TODO UPDATE SPECS!
}

@ -1,4 +1,4 @@
using System;
using System;
using NLog;
using NzbDrone.Common.Messaging;
using NzbDrone.Core.Configuration;
@ -74,8 +74,8 @@ namespace NzbDrone.Core.Download
}
catch (Exception e)
{
_logger.Error(e, "Couldn't remove item from client " + trackedDownload.DownloadItem.Title);
_logger.Error(e, "Couldn't remove item {0} from client {1}", trackedDownload.DownloadItem.Title, downloadClient.Name);
}
}
}
}
}

@ -54,7 +54,7 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
}
catch (Exception e)
{
_logger.Error(e, "Couldn't validate image " + image.RelativePath);
_logger.Error(e, "Couldn't validate image {0}", image.RelativePath);
}
}
}

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using NLog;
using NzbDrone.Core.Messaging.Commands;
@ -34,7 +34,7 @@ namespace NzbDrone.Core.Housekeeping
}
catch (Exception ex)
{
_logger.Error(ex, "Error running housekeeping task: " + housekeeper.GetType().Name);
_logger.Error(ex, "Error running housekeeping task: {0}", housekeeper.GetType().Name);
}
}

@ -90,7 +90,7 @@ namespace NzbDrone.Core.IndexerSearch
}
catch (Exception e)
{
_logger.Error(e, "Error while searching for " + criteriaBase);
_logger.Error(e, "Error while searching for {0}", criteriaBase);
}
}).LogExceptions());
}

@ -244,11 +244,11 @@ namespace NzbDrone.Core.Indexers
var message = string.Format("{0} - {1}", ex.Message, url);
_logger.Warn(ex, message);
}
catch (Exception feedEx)
catch (Exception ex)
{
_indexerStatusService.RecordFailure(Definition.Id);
feedEx.Data.Add("FeedUrl", url);
_logger.Error(feedEx, "An error occurred while processing feed. " + url);
ex.Data.Add("FeedUrl", url);
_logger.Error(ex, "An error occurred while processing feed. {0}", url);
}
return CleanupReleases(releases);

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
@ -66,7 +66,7 @@ namespace NzbDrone.Core.Indexers
catch (Exception itemEx)
{
itemEx.Data.Add("Item", item.Title());
_logger.Error(itemEx, "An error occurred while processing feed item from " + indexerResponse.Request.Url);
_logger.Error(itemEx, "An error occurred while processing feed item from {0}", indexerResponse.Request.Url);
}
}

@ -130,7 +130,7 @@ namespace NzbDrone.Core.MediaCover
}
catch (Exception e)
{
_logger.Error(e, "Couldn't download media cover for " + movie);
_logger.Error(e, "Couldn't download media cover for {0}", movie);
}
EnsureResizedCovers(movie, cover, !alreadyExists);

@ -224,7 +224,7 @@ namespace NzbDrone.Core.MediaFiles
}
catch (IOException ex)
{
_logger.Error(ex, "Unable to create directory: " + directoryName);
_logger.Error(ex, "Unable to create directory: {0}", directoryName);
}
_mediaFileAttributeService.SetFolderPermissions(directoryName);

@ -169,7 +169,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport
}
catch (Exception e)
{
_logger.Error(e, "Couldn't import file. " + file);
_logger.Error(e, "Couldn't import file. {0}", file);
var localMovie = new LocalMovie { Path = file };
decision = new ImportDecision(localMovie, new Rejection("Unexpected error processing file"));
@ -210,7 +210,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport
{
//e.Data.Add("report", remoteEpisode.Report.ToJson());
//e.Data.Add("parsed", remoteEpisode.ParsedEpisodeInfo.ToJson());
_logger.Error(e, "Couldn't evaluate decision on " + localMovie.Path);
_logger.Error(e, "Couldn't evaluate decision on {0}", localMovie.Path);
return new Rejection(string.Format("{0}: {1}", spec.GetType().Name, e.Message));
}

@ -55,11 +55,11 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Specifications
}
catch (DirectoryNotFoundException ex)
{
_logger.Error("Unable to check free disk space while importing. " + ex.Message);
_logger.Error(ex, "Unable to check free disk space while importing.");
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to check free disk space while importing: " + localMovie.Path);
_logger.Error(ex, "Unable to check free disk space while importing: {0}", localMovie.Path);
}
return Decision.Accept();

@ -126,7 +126,7 @@ namespace NzbDrone.Core.MediaFiles
}
catch (Exception ex)
{
_logger.Error(ex, "Failed to rename file: " + oldMovieFilePath);
_logger.Error(ex, "Failed to rename file: {0}", oldMovieFilePath);
}
}

@ -44,18 +44,18 @@ namespace NzbDrone.Core.Messaging.Commands
}
catch (Exception ex)
{
_logger.Error(ex, "Error occurred while executing task " + command.Name);
_logger.Error(ex, "Error occurred while executing task {0}", command.Name);
}
}
}
catch (ThreadAbortException ex)
{
_logger.Error(ex, "Thread aborted: " + ex.Message);
_logger.Error(ex, "Thread aborted");
Thread.ResetAbort();
}
catch (Exception ex)
{
_logger.Error(ex, "Unknown error in thread: " + ex.Message);
_logger.Error(ex, "Unknown error in thread");
}
}

@ -180,7 +180,7 @@ namespace NzbDrone.Core.Movies
}
catch (Exception e)
{
_logger.Error(e, "Couldn't refresh info for {0}".Inject(movie));
_logger.Error(e, "Couldn't refresh info for {0}", movie);
}
}
@ -194,7 +194,7 @@ namespace NzbDrone.Core.Movies
}
catch (Exception e)
{
_logger.Error(e, "Couldn't rescan movie {0}".Inject(movie));
_logger.Error(e, "Couldn't rescan movie {0}", movie);
}
}
}

@ -102,7 +102,7 @@ namespace NzbDrone.Core.NetImport
{
anyFailure = true;
feedEx.Data.Add("FeedUrl", url);
_logger.Error(feedEx, "An error occurred while processing feed. " + url);
_logger.Error(feedEx, "An error occurred while processing feed. {0}", url);
}
return new NetImportFetchResult {Movies = movies, AnyFailure = anyFailure};

@ -54,7 +54,7 @@ namespace NzbDrone.Core.NetImport.RSSImport
catch (Exception itemEx)
{
//itemEx.Data.Add("Item", item.Title());
_logger.Error(itemEx, "An error occurred while processing feed item from " + importResponse.Request.Url);
_logger.Error(itemEx, "An error occurred while processing feed item from {0}", importResponse.Request.Url);
}
}

@ -52,16 +52,16 @@ namespace NzbDrone.Core.Notifications.Boxcar
{
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
{
_logger.Error(ex, "Access Token is invalid: " + ex.Message);
_logger.Error(ex, "Access Token is invalid: {0}", ex.Message);
return new ValidationFailure("Token", "Access Token is invalid");
}
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("Token", "Unable to send test message");
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("", "Unable to send test message");
}
}
@ -84,7 +84,7 @@ namespace NzbDrone.Core.Notifications.Boxcar
{
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
{
_logger.Error(ex, "Access Token is invalid: " + ex.Message);
_logger.Error(ex, "Access Token is invalid: {0}", ex.Message);
throw;
}

@ -68,7 +68,7 @@ namespace NzbDrone.Core.Notifications.Email
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test email: " + ex.Message);
_logger.Error(ex, "Unable to send test email: {0}", ex.Message);
return new ValidationFailure("Server", "Unable to send test email");
}

@ -151,7 +151,7 @@ namespace NzbDrone.Core.Notifications.Growl
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("Host", "Unable to send test message");
}

@ -53,7 +53,7 @@ namespace NzbDrone.Core.Notifications.MediaBrowser
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("Host", "Unable to send test message: " + ex.Message);
}

@ -87,7 +87,7 @@ namespace NzbDrone.Core.Notifications
catch (Exception ex)
{
_logger.Error(ex, "Unable to send OnGrab notification to: " + notification.Definition.Name);
_logger.Error(ex, "Unable to send OnGrab notification to: {0}", notification.Definition.Name);
}
}
}

@ -75,7 +75,7 @@ namespace NzbDrone.Core.Notifications.NotifyMyAndroid
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("ApiKey", "Unable to send test message");
}

@ -63,7 +63,7 @@ namespace NzbDrone.Core.Notifications.Plex
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("Host", "Unable to send test message");
}

@ -175,12 +175,12 @@ namespace NzbDrone.Core.Notifications.Plex
}
catch(PlexAuthenticationException ex)
{
_logger.Error(ex, "Unable to connect to Plex Server: " + ex.Message);
_logger.Error(ex, "Unable to connect to Plex Server: {0}", ex.Message);
return new ValidationFailure("Username", "Incorrect username or password");
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to connect to Plex Server: " + ex.Message);
_logger.Error(ex, "Unable to connect to Plex Server: {0}", ex.Message);
return new ValidationFailure("Host", "Unable to connect to Plex Server");
}

@ -94,7 +94,7 @@ namespace NzbDrone.Core.Notifications.Prowl
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("ApiKey", "Unable to send test message");
}

@ -42,7 +42,7 @@ namespace NzbDrone.Core.Notifications.PushBullet
}
catch (PushBulletException ex)
{
_logger.Error(ex, "Unable to send test message to: " + channelTag);
_logger.Error(ex, "Unable to send test message to: {0}", channelTag);
error = true;
}
}
@ -61,7 +61,7 @@ namespace NzbDrone.Core.Notifications.PushBullet
}
catch (PushBulletException ex)
{
_logger.Error(ex, "Unable to send test message to: " + deviceId);
_logger.Error(ex, "Unable to send test message to: {0}", deviceId);
error = true;
}
}
@ -101,16 +101,16 @@ namespace NzbDrone.Core.Notifications.PushBullet
{
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
{
_logger.Error(ex, "API Key is invalid: " + ex.Message);
_logger.Error(ex, "API Key is invalid: {0}", ex.Message);
return new ValidationFailure("ApiKey", "API Key is invalid");
}
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("ApiKey", "Unable to send test message");
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("", "Unable to send test message");
}
@ -165,7 +165,7 @@ namespace NzbDrone.Core.Notifications.PushBullet
{
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
{
_logger.Error(ex, "API Key is invalid: " + ex.Message);
_logger.Error(ex, "API Key is invalid: {0}", ex.Message);
throw;
}

@ -73,30 +73,30 @@ namespace NzbDrone.Core.Notifications.Pushalot
{
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
{
_logger.Error(ex, "Authentication Token is invalid: " + ex.Message);
_logger.Error(ex, "Authentication Token is invalid: {0}", ex.Message);
return new ValidationFailure("AuthToken", "Authentication Token is invalid");
}
if (ex.Response.StatusCode == HttpStatusCode.NotAcceptable)
{
_logger.Error(ex, "Message limit reached: " + ex.Message);
_logger.Error(ex, "Message limit reached: {0}", ex.Message);
return new ValidationFailure("AuthToken", "Message limit reached");
}
if (ex.Response.StatusCode == HttpStatusCode.Gone)
{
_logger.Error(ex, "Authorization Token is no longer valid: " + ex.Message);
_logger.Error(ex, "Authorization Token is no longer valid: {0}", ex.Message);
return new ValidationFailure("AuthToken", "Authorization Token is no longer valid, please use a new one.");
}
var response = Json.Deserialize<PushalotResponse>(ex.Response.Content);
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("AuthToken", response.Description);
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("", "Unable to send test message");
}

@ -59,7 +59,7 @@ namespace NzbDrone.Core.Notifications.Pushover
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("ApiKey", "Unable to send test message");
}

@ -51,7 +51,7 @@ namespace NzbDrone.Core.Notifications.Telegram
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
var restException = ex as RestException;

@ -131,7 +131,7 @@ namespace NzbDrone.Core.Notifications.Twitter
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("Host", "Unable to send test message");
}
return null;

@ -63,7 +63,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
{
var response = _proxy.GetJsonVersion(settings);
_logger.Debug("Getting version from response: " + response);
_logger.Debug("Getting version from response: {0}", response);
var result = Json.Deserialize<XbmcJsonResult<JObject>>(response);
var versionObject = result.Result.Property("version");
@ -115,7 +115,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message: " + ex.Message);
_logger.Error(ex, "Unable to send test message: {0}", ex.Message);
return new ValidationFailure("Host", "Unable to send test message");
}

@ -253,7 +253,7 @@ namespace NzbDrone.Core.Parser
catch (Exception e)
{
if (!title.ToLower().Contains("password") && !title.ToLower().Contains("yenc"))
Logger.Error(e, "An error has occurred while trying to parse " + title);
Logger.Error(e, "An error has occurred while trying to parse {0}", title);
}
Logger.Debug("Unable to parse {0}", title);

@ -4,9 +4,11 @@ using System.Threading;
using NLog;
using NzbDrone.Common.Composition;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Exceptions;
using NzbDrone.Common.Instrumentation;
using NzbDrone.Common.Processes;
using NzbDrone.Common.Security;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Instrumentation;
namespace Radarr.Host
@ -49,6 +51,10 @@ namespace Radarr.Host
SpinToExit(appMode);
}
}
catch (InvalidConfigFileException ex)
{
throw new RadarrStartupException(ex);
}
catch (TerminateApplicationException e)
{
Logger.Info(e.Message);

@ -43,7 +43,7 @@ namespace Radarr.Host
}
catch (Exception e)
{
_logger.Error(e, "Couldn't open default browser to " + url);
_logger.Error(e, "Couldn't open default browser to {0}", url);
}
}
}

Loading…
Cancel
Save