New: Configurable log file size limit

(cherry picked from commit 813965e6a20edef2772d68eaa7646af33028425a)

Closes #4982
pull/5051/head
Mark McDowall 4 months ago committed by Bogdan
parent 828e04bcad
commit 2b8b8ed147

@ -1,11 +1,11 @@
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
namespace NzbDrone.Common.Test.ExtensionTests namespace NzbDrone.Common.Test.ExtensionTests
{ {
[TestFixture] [TestFixture]
public class Int64ExtensionFixture public class NumberExtensionFixture
{ {
[TestCase(0, "0 B")] [TestCase(0, "0 B")]
[TestCase(1000, "1,000.0 B")] [TestCase(1000, "1,000.0 B")]

@ -1,30 +0,0 @@
using System;
using System.Globalization;
namespace NzbDrone.Common.Extensions
{
public static class Int64Extensions
{
private static readonly string[] SizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
public static string SizeSuffix(this long bytes)
{
const int bytesInKb = 1024;
if (bytes < 0)
{
return "-" + SizeSuffix(-bytes);
}
if (bytes == 0)
{
return "0 B";
}
var mag = (int)Math.Log(bytes, bytesInKb);
var adjustedSize = bytes / (decimal)Math.Pow(bytesInKb, mag);
return string.Format(CultureInfo.InvariantCulture, "{0:n1} {1}", adjustedSize, SizeSuffixes[mag]);
}
}
}

@ -0,0 +1,60 @@
using System;
using System.Globalization;
namespace NzbDrone.Common.Extensions
{
public static class NumberExtensions
{
private static readonly string[] SizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
public static string SizeSuffix(this long bytes)
{
const int bytesInKb = 1024;
if (bytes < 0)
{
return "-" + SizeSuffix(-bytes);
}
if (bytes == 0)
{
return "0 B";
}
var mag = (int)Math.Log(bytes, bytesInKb);
var adjustedSize = bytes / (decimal)Math.Pow(bytesInKb, mag);
return string.Format(CultureInfo.InvariantCulture, "{0:n1} {1}", adjustedSize, SizeSuffixes[mag]);
}
public static long Kilobits(this int kilobits)
{
return Convert.ToInt64(kilobits * 128L);
}
public static long Megabytes(this int megabytes)
{
return Convert.ToInt64(megabytes * 1024L * 1024L);
}
public static long Gigabytes(this int gigabytes)
{
return Convert.ToInt64(gigabytes * 1024L * 1024L * 1024L);
}
public static long Kilobits(this double kilobits)
{
return Convert.ToInt64(kilobits * 128L);
}
public static long Megabytes(this double megabytes)
{
return Convert.ToInt64(megabytes * 1024L * 1024L);
}
public static long Gigabytes(this double gigabytes)
{
return Convert.ToInt64(gigabytes * 1024L * 1024L * 1024L);
}
}
}

@ -148,7 +148,7 @@ namespace NzbDrone.Common.Instrumentation
fileTarget.ConcurrentWrites = false; fileTarget.ConcurrentWrites = false;
fileTarget.ConcurrentWriteAttemptDelay = 50; fileTarget.ConcurrentWriteAttemptDelay = 50;
fileTarget.ConcurrentWriteAttempts = 10; fileTarget.ConcurrentWriteAttempts = 10;
fileTarget.ArchiveAboveSize = 1024000; fileTarget.ArchiveAboveSize = 1.Megabytes();
fileTarget.MaxArchiveFiles = maxArchiveFiles; fileTarget.MaxArchiveFiles = maxArchiveFiles;
fileTarget.EnableFileDelete = true; fileTarget.EnableFileDelete = true;
fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling; fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling;

@ -5,6 +5,7 @@ public class LogOptions
public string Level { get; set; } public string Level { get; set; }
public bool? FilterSentryEvents { get; set; } public bool? FilterSentryEvents { get; set; }
public int? Rotate { get; set; } public int? Rotate { get; set; }
public int? SizeLimit { get; set; }
public bool? Sql { get; set; } public bool? Sql { get; set; }
public string ConsoleLevel { get; set; } public string ConsoleLevel { get; set; }
public string ConsoleFormat { get; set; } public string ConsoleFormat { get; set; }

@ -4,6 +4,7 @@ using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.DecisionEngine.Specifications;
using NzbDrone.Core.Music; using NzbDrone.Core.Music;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;

@ -8,6 +8,7 @@ using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.Download.TrackedDownloads;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;

@ -5,6 +5,7 @@ using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;

@ -5,6 +5,7 @@ using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles.TrackImport.Specifications; using NzbDrone.Core.MediaFiles.TrackImport.Specifications;
using NzbDrone.Core.Music; using NzbDrone.Core.Music;

@ -42,6 +42,7 @@ namespace NzbDrone.Core.Configuration
ConsoleLogFormat ConsoleLogFormat { get; } ConsoleLogFormat ConsoleLogFormat { get; }
bool LogSql { get; } bool LogSql { get; }
int LogRotate { get; } int LogRotate { get; }
int LogSizeLimit { get; }
bool FilterSentryEvents { get; } bool FilterSentryEvents { get; }
string Branch { get; } string Branch { get; }
string ApiKey { get; } string ApiKey { get; }
@ -239,6 +240,7 @@ namespace NzbDrone.Core.Configuration
public bool LogSql => _logOptions.Sql ?? GetValueBoolean("LogSql", false, persist: false); public bool LogSql => _logOptions.Sql ?? GetValueBoolean("LogSql", false, persist: false);
public int LogRotate => _logOptions.Rotate ?? GetValueInt("LogRotate", 50, persist: false); public int LogRotate => _logOptions.Rotate ?? GetValueInt("LogRotate", 50, persist: false);
public int LogSizeLimit => Math.Min(Math.Max(_logOptions.SizeLimit ?? GetValueInt("LogSizeLimit", 1, persist: false), 0), 10);
public bool FilterSentryEvents => _logOptions.FilterSentryEvents ?? GetValueBoolean("FilterSentryEvents", true, persist: false); public bool FilterSentryEvents => _logOptions.FilterSentryEvents ?? GetValueBoolean("FilterSentryEvents", true, persist: false);
public string SslCertPath => _serverOptions.SslCertPath ?? GetValue("SslCertPath", ""); public string SslCertPath => _serverOptions.SslCertPath ?? GetValue("SslCertPath", "");
public string SslCertPassword => _serverOptions.SslCertPassword ?? GetValue("SslCertPassword", ""); public string SslCertPassword => _serverOptions.SslCertPassword ?? GetValue("SslCertPassword", "");

@ -1,4 +1,5 @@
using FluentValidation; using FluentValidation;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;

@ -1,4 +1,5 @@
using NLog; using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;

@ -1,5 +1,6 @@
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
{ {

@ -20,36 +20,6 @@ namespace NzbDrone.Core
return actual; return actual;
} }
public static long Kilobits(this int kilobits)
{
return Convert.ToInt64(kilobits * 128L);
}
public static long Megabytes(this int megabytes)
{
return Convert.ToInt64(megabytes * 1024L * 1024L);
}
public static long Gigabytes(this int gigabytes)
{
return Convert.ToInt64(gigabytes * 1024L * 1024L * 1024L);
}
public static long Kilobits(this double kilobits)
{
return Convert.ToInt64(kilobits * 128L);
}
public static long Megabytes(this double megabytes)
{
return Convert.ToInt64(megabytes * 1024L * 1024L);
}
public static long Gigabytes(this double gigabytes)
{
return Convert.ToInt64(gigabytes * 1024L * 1024L * 1024L);
}
public static long Round(this long number, long level) public static long Round(this long number, long level)
{ {
return Convert.ToInt64(Math.Floor((decimal)number / level) * level); return Convert.ToInt64(Math.Floor((decimal)number / level) * level);

@ -59,7 +59,7 @@ namespace NzbDrone.Core.Instrumentation
SetMinimumLogLevel(rules, "appFileInfo", minimumLogLevel <= LogLevel.Info ? LogLevel.Info : LogLevel.Off); SetMinimumLogLevel(rules, "appFileInfo", minimumLogLevel <= LogLevel.Info ? LogLevel.Info : LogLevel.Off);
SetMinimumLogLevel(rules, "appFileDebug", minimumLogLevel <= LogLevel.Debug ? LogLevel.Debug : LogLevel.Off); SetMinimumLogLevel(rules, "appFileDebug", minimumLogLevel <= LogLevel.Debug ? LogLevel.Debug : LogLevel.Off);
SetMinimumLogLevel(rules, "appFileTrace", minimumLogLevel <= LogLevel.Trace ? LogLevel.Trace : LogLevel.Off); SetMinimumLogLevel(rules, "appFileTrace", minimumLogLevel <= LogLevel.Trace ? LogLevel.Trace : LogLevel.Off);
SetLogRotation(); ReconfigureFile();
// Log Sql // Log Sql
SqlBuilderExtensions.LogSql = _configFileProvider.LogSql; SqlBuilderExtensions.LogSql = _configFileProvider.LogSql;
@ -93,11 +93,12 @@ namespace NzbDrone.Core.Instrumentation
} }
} }
private void SetLogRotation() private void ReconfigureFile()
{ {
foreach (var target in LogManager.Configuration.AllTargets.OfType<NzbDroneFileTarget>()) foreach (var target in LogManager.Configuration.AllTargets.OfType<NzbDroneFileTarget>())
{ {
target.MaxArchiveFiles = _configFileProvider.LogRotate; target.MaxArchiveFiles = _configFileProvider.LogRotate;
target.ArchiveAboveSize = _configFileProvider.LogSizeLimit.Megabytes();
} }
} }

@ -2,6 +2,7 @@ using System;
using System.IO; using System.IO;
using NLog; using NLog;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;

Loading…
Cancel
Save