diff --git a/src/NzbDrone.Core.Test/InstrumentationTests/DatabaseTargetFixture.cs b/src/NzbDrone.Core.Test/InstrumentationTests/DatabaseTargetFixture.cs index f5d99e564..c0cc34b57 100644 --- a/src/NzbDrone.Core.Test/InstrumentationTests/DatabaseTargetFixture.cs +++ b/src/NzbDrone.Core.Test/InstrumentationTests/DatabaseTargetFixture.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using FluentAssertions; +using Marr.Data; using NLog; using NUnit.Framework; using NzbDrone.Common.Instrumentation; @@ -65,6 +66,19 @@ namespace NzbDrone.Core.Test.InstrumentationTests VerifyLog(StoredModel, LogLevel.Info); } + + [Test] + [Explicit] + public void perf_test() + { + MapRepository.Instance.EnableTraceLogging = false; + for (int i = 0; i < 1000; i++) + { + _logger.Info(Guid.NewGuid()); + } + MapRepository.Instance.EnableTraceLogging = true; + } + [Test] public void write_log_exception() { diff --git a/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs b/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs index 312df4cc8..680376c34 100644 --- a/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs +++ b/src/NzbDrone.Core/Datastore/ConnectionStringFactory.cs @@ -30,6 +30,7 @@ namespace NzbDrone.Core.Datastore connectionBuilder.CacheSize = (int)-10.Megabytes(); connectionBuilder.DateTimeKind = DateTimeKind.Utc; connectionBuilder.JournalMode = SQLiteJournalModeEnum.Wal; + connectionBuilder.Pooling = true; return connectionBuilder.ConnectionString; } diff --git a/src/NzbDrone.Core/Instrumentation/DatabaseTarget.cs b/src/NzbDrone.Core/Instrumentation/DatabaseTarget.cs index f2e14f7ea..cc0fc0ccb 100644 --- a/src/NzbDrone.Core/Instrumentation/DatabaseTarget.cs +++ b/src/NzbDrone.Core/Instrumentation/DatabaseTarget.cs @@ -1,4 +1,5 @@ using System; +using System.Data; using System.Data.SQLite; using NLog.Common; using NLog.Config; @@ -6,6 +7,7 @@ using NLog; using NLog.Layouts; using NLog.Targets; using NzbDrone.Common.Instrumentation; +using NzbDrone.Core.Datastore; using NzbDrone.Core.Lifecycle; using NzbDrone.Core.Messaging.Events; @@ -14,11 +16,14 @@ namespace NzbDrone.Core.Instrumentation public class DatabaseTarget : TargetWithLayout, IHandle { - private readonly ILogRepository _repository; + private readonly SQLiteConnection _connection; - public DatabaseTarget(ILogRepository repository) + const string INSERT_COMMAND = "INSERT INTO [Logs]([Message],[Time],[Logger],[Method],[Exception],[ExceptionType],[Level]) " + + "VALUES(@Message,@Time,@Logger,@Method,@Exception,@ExceptionType,@Level)"; + + public DatabaseTarget(IConnectionStringFactory connectionStringFactory) { - _repository = repository; + _connection = new SQLiteConnection(connectionStringFactory.LogDbConnectionString).OpenAndReturn(); } public void Register() @@ -51,40 +56,50 @@ namespace NzbDrone.Core.Instrumentation protected override void Write(LogEventInfo logEvent) { - var log = new Log(); - log.Time = logEvent.TimeStamp; - log.Message = CleanseLogMessage.Cleanse(logEvent.FormattedMessage); - log.Method = Layout.Render(logEvent); - - log.Logger = logEvent.LoggerName; - - if (log.Logger.StartsWith("NzbDrone.")) + try { - log.Logger = log.Logger.Remove(0, 9); - } + var log = new Log(); + log.Time = logEvent.TimeStamp; + log.Message = CleanseLogMessage.Cleanse(logEvent.FormattedMessage); + log.Method = Layout.Render(logEvent); - if (logEvent.Exception != null) - { - if (String.IsNullOrWhiteSpace(log.Message)) + log.Logger = logEvent.LoggerName; + + if (log.Logger.StartsWith("NzbDrone.")) { - log.Message = logEvent.Exception.Message; + log.Logger = log.Logger.Remove(0, 9); } - else + + if (logEvent.Exception != null) { - log.Message += ": " + logEvent.Exception.Message; + if (String.IsNullOrWhiteSpace(log.Message)) + { + log.Message = logEvent.Exception.Message; + } + else + { + log.Message += ": " + logEvent.Exception.Message; + } + + + log.Exception = logEvent.Exception.ToString(); + log.ExceptionType = logEvent.Exception.GetType().ToString(); } - log.Exception = logEvent.Exception.ToString(); - log.ExceptionType = logEvent.Exception.GetType().ToString(); - } + log.Level = logEvent.Level.Name; - - log.Level = logEvent.Level.Name; + var sqlCommand = new SQLiteCommand(INSERT_COMMAND, _connection); - try - { - _repository.Insert(log); + sqlCommand.Parameters.Add(new SQLiteParameter("Message", DbType.String) { Value = log.Message }); + sqlCommand.Parameters.Add(new SQLiteParameter("Time", DbType.DateTime) { Value = log.Time }); + sqlCommand.Parameters.Add(new SQLiteParameter("Logger", DbType.String) { Value = log.Logger }); + sqlCommand.Parameters.Add(new SQLiteParameter("Method", DbType.String) { Value = log.Method }); + sqlCommand.Parameters.Add(new SQLiteParameter("Exception", DbType.String) { Value = log.Exception }); + sqlCommand.Parameters.Add(new SQLiteParameter("ExceptionType", DbType.String) { Value = log.ExceptionType }); + sqlCommand.Parameters.Add(new SQLiteParameter("Level", DbType.String) { Value = log.Level }); + + sqlCommand.ExecuteNonQuery(); } catch (SQLiteException ex) {