using System; using System.Diagnostics; using Exceptron.Client; using Exceptron.Client.Configuration; using NLog; using NLog.Common; using NLog.Config; using NLog.Layouts; using NLog.Targets; namespace NzbDrone.Common.Instrumentation { /// /// target for exceptron. Allows you to automatically report all /// exceptions logged to Nlog/> /// [Target("Exceptron")] public class ExceptronTarget : Target { /// /// instance that Nlog Target uses to report the exceptions. /// public IExceptronClient ExceptronClient { get; internal set; } private static ExceptronTarget _instance = new ExceptronTarget(); public static void Register() { var rule = new LoggingRule("*", LogLevel.Warn, _instance); LogManager.Configuration.AddTarget("ExceptronTarget", _instance); LogManager.Configuration.LoggingRules.Add(rule); LogManager.ConfigurationReloaded += (sender, args) => Register(); LogManager.ReconfigExistingLoggers(); } protected override void InitializeTarget() { var config = new ExceptronConfiguration { ApiKey = "57cb75d9eb2d457094d3f67133833eef", IncludeMachineName = true, }; if (EnvironmentProvider.IsProduction) { config.ApiKey = "cc4728a35aa9414f9a0baa8eed56bc67"; } ExceptronClient = new ExceptronClient(config, Environment.Version); } /// /// String that identifies the active user /// public Layout UserId { get; set; } protected override void Write(LogEventInfo logEvent) { if (logEvent == null || logEvent.Exception == null) return; InternalLogger.Trace("Sending Exception to api.exceptron.com. Process Name: {0}", Process.GetCurrentProcess().ProcessName); try { var exceptionData = new ExceptionData { Exception = logEvent.Exception, Component = logEvent.LoggerName, Message = logEvent.FormattedMessage, }; if (UserId != null) { exceptionData.UserId = UserId.Render(logEvent); } if (logEvent.Level <= LogLevel.Info) { exceptionData.Severity = ExceptionSeverity.None; } else if (logEvent.Level <= LogLevel.Warn) { exceptionData.Severity = ExceptionSeverity.Warning; } else if (logEvent.Level <= LogLevel.Error) { exceptionData.Severity = ExceptionSeverity.Error; } else if (logEvent.Level <= LogLevel.Fatal) { exceptionData.Severity = ExceptionSeverity.Fatal; } ExceptronClient.SubmitException(exceptionData); } catch (Exception e) { InternalLogger.Warn("Unable to report exception. {0}", e); throw; } } } }