2013-08-31 01:42:30 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Diagnostics;
|
2014-12-17 07:12:26 +00:00
|
|
|
|
using System.IO;
|
2017-01-05 18:46:16 +00:00
|
|
|
|
using System.Linq;
|
2013-08-31 01:42:30 +00:00
|
|
|
|
using NLog;
|
2014-12-17 07:12:26 +00:00
|
|
|
|
using NLog.Config;
|
|
|
|
|
using NLog.Targets;
|
|
|
|
|
using NzbDrone.Common.EnvironmentInfo;
|
|
|
|
|
using NzbDrone.Common.Extensions;
|
2017-01-04 08:53:09 +00:00
|
|
|
|
using NzbDrone.Common.Instrumentation.Sentry;
|
2013-08-31 01:42:30 +00:00
|
|
|
|
|
|
|
|
|
namespace NzbDrone.Common.Instrumentation
|
|
|
|
|
{
|
|
|
|
|
public static class NzbDroneLogger
|
|
|
|
|
{
|
2014-12-17 07:12:26 +00:00
|
|
|
|
private static bool _isConfigured;
|
|
|
|
|
|
|
|
|
|
static NzbDroneLogger()
|
2013-08-31 01:42:30 +00:00
|
|
|
|
{
|
2014-12-17 07:12:26 +00:00
|
|
|
|
LogManager.Configuration = new LoggingConfiguration();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void Register(IStartupContext startupContext, bool updateApp, bool inConsole)
|
|
|
|
|
{
|
|
|
|
|
if (_isConfigured)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException("Loggers have already been registered.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_isConfigured = true;
|
|
|
|
|
|
2014-12-17 07:36:33 +00:00
|
|
|
|
GlobalExceptionHandlers.Register();
|
|
|
|
|
|
2014-12-17 07:12:26 +00:00
|
|
|
|
var appFolderInfo = new AppFolderInfo(startupContext);
|
|
|
|
|
|
|
|
|
|
if (Debugger.IsAttached)
|
|
|
|
|
{
|
|
|
|
|
RegisterDebugger();
|
|
|
|
|
}
|
|
|
|
|
|
2017-01-04 08:53:09 +00:00
|
|
|
|
RegisterSentry(updateApp);
|
|
|
|
|
|
2014-12-17 07:12:26 +00:00
|
|
|
|
if (updateApp)
|
|
|
|
|
{
|
|
|
|
|
RegisterUpdateFile(appFolderInfo);
|
|
|
|
|
}
|
|
|
|
|
else
|
2013-08-31 01:42:30 +00:00
|
|
|
|
{
|
2017-01-04 02:36:47 +00:00
|
|
|
|
if (inConsole && (OsInfo.IsNotWindows || RuntimeInfo.IsUserInteractive))
|
2013-08-31 01:42:30 +00:00
|
|
|
|
{
|
2014-12-17 07:12:26 +00:00
|
|
|
|
RegisterConsole();
|
2013-08-31 01:42:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-12-17 07:12:26 +00:00
|
|
|
|
RegisterAppFile(appFolderInfo);
|
|
|
|
|
}
|
2013-08-31 01:42:30 +00:00
|
|
|
|
|
2019-08-27 21:29:16 +00:00
|
|
|
|
RegisterAuthLogger();
|
|
|
|
|
|
2014-12-17 07:12:26 +00:00
|
|
|
|
LogManager.ReconfigExistingLoggers();
|
2013-08-31 01:42:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-04 08:53:09 +00:00
|
|
|
|
private static void RegisterSentry(bool updateClient)
|
|
|
|
|
{
|
|
|
|
|
string dsn;
|
|
|
|
|
|
|
|
|
|
if (updateClient)
|
|
|
|
|
{
|
|
|
|
|
dsn = RuntimeInfo.IsProduction
|
2019-08-24 19:43:45 +00:00
|
|
|
|
? "https://80777986b95f44a1a90d1eb2f3af1e36@sentry.sonarr.tv/11"
|
|
|
|
|
: "https://6168f0946aba4e60ac23e469ac08eac5@sentry.sonarr.tv/9";
|
2017-01-04 08:53:09 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
dsn = RuntimeInfo.IsProduction
|
2019-08-24 19:43:45 +00:00
|
|
|
|
? "https://e2adcbe52caf46aeaebb6b1dcdfe10a1@sentry.sonarr.tv/8"
|
|
|
|
|
: "https://4ee3580e01d8407c96a7430fbc953512@sentry.sonarr.tv/10";
|
2017-01-04 08:53:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-23 23:23:04 +00:00
|
|
|
|
Target target;
|
|
|
|
|
try
|
2017-01-04 08:53:09 +00:00
|
|
|
|
{
|
2019-08-23 23:23:04 +00:00
|
|
|
|
target = new SentryTarget(dsn)
|
|
|
|
|
{
|
|
|
|
|
Name = "sentryTarget",
|
|
|
|
|
Layout = "${message}"
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
2019-08-24 19:43:45 +00:00
|
|
|
|
Console.WriteLine("Failed to load dependency, may need an OS update: " + ex.ToString());
|
2019-08-23 23:23:04 +00:00
|
|
|
|
LogManager.GetLogger(nameof(NzbDroneLogger)).Debug(ex, "Failed to load dependency, may need an OS update");
|
|
|
|
|
|
|
|
|
|
// We still need the logging rules, so use a null target.
|
|
|
|
|
target = new NullTarget();
|
|
|
|
|
}
|
2017-01-04 08:53:09 +00:00
|
|
|
|
|
2017-07-30 19:30:34 +00:00
|
|
|
|
var loggingRule = new LoggingRule("*", updateClient ? LogLevel.Trace : LogLevel.Warn, target);
|
2017-01-05 18:46:16 +00:00
|
|
|
|
LogManager.Configuration.AddTarget("sentryTarget", target);
|
2017-01-04 08:53:09 +00:00
|
|
|
|
LogManager.Configuration.LoggingRules.Add(loggingRule);
|
2017-07-30 19:30:34 +00:00
|
|
|
|
|
|
|
|
|
// Events logged to Sentry go only to Sentry.
|
|
|
|
|
var loggingRuleSentry = new LoggingRule("Sentry", LogLevel.Debug, target) { Final = true };
|
|
|
|
|
LogManager.Configuration.LoggingRules.Insert(0, loggingRuleSentry);
|
2014-12-17 07:12:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RegisterDebugger()
|
|
|
|
|
{
|
|
|
|
|
DebuggerTarget target = new DebuggerTarget();
|
|
|
|
|
target.Name = "debuggerLogger";
|
2016-03-01 20:44:12 +00:00
|
|
|
|
target.Layout = "[${level}] [${threadid}] ${logger}: ${message} ${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}}";
|
2014-12-17 07:12:26 +00:00
|
|
|
|
|
|
|
|
|
var loggingRule = new LoggingRule("*", LogLevel.Trace, target);
|
|
|
|
|
LogManager.Configuration.AddTarget("debugger", target);
|
|
|
|
|
LogManager.Configuration.LoggingRules.Add(loggingRule);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RegisterConsole()
|
|
|
|
|
{
|
|
|
|
|
var level = LogLevel.Trace;
|
|
|
|
|
|
|
|
|
|
var coloredConsoleTarget = new ColoredConsoleTarget();
|
|
|
|
|
|
|
|
|
|
coloredConsoleTarget.Name = "consoleLogger";
|
2016-03-01 20:44:12 +00:00
|
|
|
|
coloredConsoleTarget.Layout = "[${level}] ${logger}: ${message} ${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}}";
|
2014-12-17 07:12:26 +00:00
|
|
|
|
|
|
|
|
|
var loggingRule = new LoggingRule("*", level, coloredConsoleTarget);
|
|
|
|
|
|
|
|
|
|
LogManager.Configuration.AddTarget("console", coloredConsoleTarget);
|
|
|
|
|
LogManager.Configuration.LoggingRules.Add(loggingRule);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-25 02:17:33 +00:00
|
|
|
|
private const string FILE_LOG_LAYOUT = @"${date:format=yyyy-MM-dd HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}}";
|
2014-12-17 07:12:26 +00:00
|
|
|
|
|
|
|
|
|
private static void RegisterAppFile(IAppFolderInfo appFolderInfo)
|
2016-02-18 20:45:48 +00:00
|
|
|
|
{
|
2016-08-16 20:10:03 +00:00
|
|
|
|
RegisterAppFile(appFolderInfo, "appFileInfo", "sonarr.txt", 5, LogLevel.Info);
|
|
|
|
|
RegisterAppFile(appFolderInfo, "appFileDebug", "sonarr.debug.txt", 50, LogLevel.Off);
|
|
|
|
|
RegisterAppFile(appFolderInfo, "appFileTrace", "sonarr.trace.txt", 50, LogLevel.Off);
|
2016-02-18 20:45:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-05 01:56:29 +00:00
|
|
|
|
private static void RegisterAppFile(IAppFolderInfo appFolderInfo, string name, string fileName, int maxArchiveFiles, LogLevel minLogLevel)
|
2014-12-17 07:12:26 +00:00
|
|
|
|
{
|
|
|
|
|
var fileTarget = new NzbDroneFileTarget();
|
|
|
|
|
|
2016-02-18 20:45:48 +00:00
|
|
|
|
fileTarget.Name = name;
|
|
|
|
|
fileTarget.FileName = Path.Combine(appFolderInfo.GetLogFolder(), fileName);
|
2014-12-17 07:12:26 +00:00
|
|
|
|
fileTarget.AutoFlush = true;
|
|
|
|
|
fileTarget.KeepFileOpen = false;
|
|
|
|
|
fileTarget.ConcurrentWrites = false;
|
|
|
|
|
fileTarget.ConcurrentWriteAttemptDelay = 50;
|
|
|
|
|
fileTarget.ConcurrentWriteAttempts = 10;
|
|
|
|
|
fileTarget.ArchiveAboveSize = 1024000;
|
2016-02-18 20:45:48 +00:00
|
|
|
|
fileTarget.MaxArchiveFiles = maxArchiveFiles;
|
2014-12-17 07:12:26 +00:00
|
|
|
|
fileTarget.EnableFileDelete = true;
|
|
|
|
|
fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling;
|
|
|
|
|
fileTarget.Layout = FILE_LOG_LAYOUT;
|
|
|
|
|
|
2016-08-16 20:10:03 +00:00
|
|
|
|
var loggingRule = new LoggingRule("*", minLogLevel, fileTarget);
|
2014-12-17 07:12:26 +00:00
|
|
|
|
|
2016-02-18 20:45:48 +00:00
|
|
|
|
LogManager.Configuration.AddTarget(name, fileTarget);
|
2014-12-17 07:12:26 +00:00
|
|
|
|
LogManager.Configuration.LoggingRules.Add(loggingRule);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RegisterUpdateFile(IAppFolderInfo appFolderInfo)
|
2013-08-31 01:42:30 +00:00
|
|
|
|
{
|
2014-12-17 07:12:26 +00:00
|
|
|
|
var fileTarget = new FileTarget();
|
|
|
|
|
|
|
|
|
|
fileTarget.Name = "updateFileLogger";
|
|
|
|
|
fileTarget.FileName = Path.Combine(appFolderInfo.GetUpdateLogFolder(), DateTime.Now.ToString("yyyy.MM.dd-HH.mm") + ".txt");
|
|
|
|
|
fileTarget.AutoFlush = true;
|
|
|
|
|
fileTarget.KeepFileOpen = false;
|
|
|
|
|
fileTarget.ConcurrentWrites = false;
|
|
|
|
|
fileTarget.ConcurrentWriteAttemptDelay = 50;
|
|
|
|
|
fileTarget.ConcurrentWriteAttempts = 100;
|
|
|
|
|
fileTarget.Layout = FILE_LOG_LAYOUT;
|
|
|
|
|
|
|
|
|
|
var loggingRule = new LoggingRule("*", LogLevel.Trace, fileTarget);
|
|
|
|
|
|
|
|
|
|
LogManager.Configuration.AddTarget("updateFile", fileTarget);
|
|
|
|
|
LogManager.Configuration.LoggingRules.Add(loggingRule);
|
2013-08-31 01:42:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-27 21:29:16 +00:00
|
|
|
|
private static void RegisterAuthLogger()
|
|
|
|
|
{
|
|
|
|
|
var consoleTarget = LogManager.Configuration.FindTargetByName("console");
|
|
|
|
|
var fileTarget = LogManager.Configuration.FindTargetByName("appFileInfo");
|
|
|
|
|
|
|
|
|
|
var target = consoleTarget ?? fileTarget ?? new NullTarget();
|
|
|
|
|
|
|
|
|
|
// Send Auth to Console and info app file, but not the log database
|
|
|
|
|
var rule = new LoggingRule("Auth", LogLevel.Info, target) { Final = true };
|
|
|
|
|
if (consoleTarget != null && fileTarget != null)
|
|
|
|
|
{
|
|
|
|
|
rule.Targets.Add(fileTarget);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LogManager.Configuration.LoggingRules.Insert(0, rule);
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-17 07:12:26 +00:00
|
|
|
|
public static Logger GetLogger(Type obj)
|
|
|
|
|
{
|
|
|
|
|
return LogManager.GetLogger(obj.Name.Replace("NzbDrone.", ""));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Logger GetLogger(object obj)
|
|
|
|
|
{
|
|
|
|
|
return GetLogger(obj.GetType());
|
|
|
|
|
}
|
|
|
|
|
|
2013-08-31 01:42:30 +00:00
|
|
|
|
}
|
2016-08-16 20:10:03 +00:00
|
|
|
|
}
|