diff --git a/src/Umbraco.Core/Logging/Viewer/ILogViewer.cs b/src/Umbraco.Core/Logging/Viewer/ILogViewer.cs index 1b7016307d..ff2c583db7 100644 --- a/src/Umbraco.Core/Logging/Viewer/ILogViewer.cs +++ b/src/Umbraco.Core/Logging/Viewer/ILogViewer.cs @@ -1,29 +1,39 @@ -using System.Collections.Generic; +using Serilog.Events; +using System; +using System.Collections.Generic; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Core.Logging.Viewer { public interface ILogViewer { + /// + /// Get all logs from your chosen datasource back as Serilog LogEvents + /// + IEnumerable GetAllLogs(DateTime startDate, DateTime endDate); + /// /// A count of number of errors /// By counting Warnings with Exceptions, Errors & Fatal messages /// - int GetNumberOfErrors(); + int GetNumberOfErrors(DateTime startDate, DateTime endDate); /// /// Returns a number of the different log level entries /// - LogLevelCounts GetLogLevelCounts(); + LogLevelCounts GetLogLevelCounts(DateTime startDate, DateTime endDate); /// - /// Returns the top common log message templates and their counts + /// Returns the top 10 common log message templates and their counts /// - IEnumerable GetCommonLogMessages(int numberOfResults = 10); + IEnumerable GetCommonLogMessages(DateTime startDate, DateTime endDate, int numberOfResults = 10); /// /// Returns the collection of logs /// - IEnumerable GetLogs(); + PagedResult GetLogs(DateTime startDate, DateTime endDate, + int pageNumber = 1, int pageSize = 100, Direction orderDirection = Direction.Descending); } } diff --git a/src/Umbraco.Core/Logging/Viewer/JsonLogViewer.cs b/src/Umbraco.Core/Logging/Viewer/JsonLogViewer.cs index b7d13777c8..a59847de9a 100644 --- a/src/Umbraco.Core/Logging/Viewer/JsonLogViewer.cs +++ b/src/Umbraco.Core/Logging/Viewer/JsonLogViewer.cs @@ -4,15 +4,17 @@ using System.IO; using System.Linq; using Serilog.Events; using Serilog.Formatting.Compact.Reader; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Core.Logging.Viewer { public class JsonLogViewer : ILogViewer { - private List _logs = new List(); - - public JsonLogViewer() + + public IEnumerable GetAllLogs(DateTime startDate, DateTime endDate) { + var logs = new List(); var filePath = $@"{AppDomain.CurrentDomain.BaseDirectory}\App_Data\Logs\UmbracoTraceLog.DELLBOOK.20180828.json"; //Open log file @@ -20,37 +22,42 @@ namespace Umbraco.Core.Logging.Viewer { using (var stream = new StreamReader(fs)) { - + var reader = new LogEventReader(stream); LogEvent evt; while (reader.TryRead(out evt)) { - _logs.Add(evt); + logs.Add(evt); } } } + + return logs; } - public int GetNumberOfErrors() + public int GetNumberOfErrors(DateTime startDate, DateTime endDate) { - return _logs.Count(x => x.Level == LogEventLevel.Fatal && x.Level == LogEventLevel.Error && x.Exception != null); + var logs = GetAllLogs(startDate, endDate); + return logs.Count(x => x.Level == LogEventLevel.Fatal && x.Level == LogEventLevel.Error && x.Exception != null); } - public LogLevelCounts GetLogLevelCounts() + public LogLevelCounts GetLogLevelCounts(DateTime startDate, DateTime endDate) { + var logs = GetAllLogs(startDate, endDate); return new LogLevelCounts { - Information = _logs.Count(x => x.Level == LogEventLevel.Information), - Debug = _logs.Count(x => x.Level == LogEventLevel.Debug), - Warning = _logs.Count(x => x.Level == LogEventLevel.Warning), - Error = _logs.Count(x => x.Level == LogEventLevel.Error), - Fatal = _logs.Count(x => x.Level == LogEventLevel.Fatal) + Information = logs.Count(x => x.Level == LogEventLevel.Information), + Debug = logs.Count(x => x.Level == LogEventLevel.Debug), + Warning = logs.Count(x => x.Level == LogEventLevel.Warning), + Error = logs.Count(x => x.Level == LogEventLevel.Error), + Fatal = logs.Count(x => x.Level == LogEventLevel.Fatal) }; } - public IEnumerable GetCommonLogMessages(int numberOfResults) + public IEnumerable GetCommonLogMessages(DateTime startDate, DateTime endDate, int numberOfResults) { - var templates = _logs.GroupBy(x => x.MessageTemplate.Text) + var logs = GetAllLogs(startDate, endDate); + var templates = logs.GroupBy(x => x.MessageTemplate.Text) .Select(g => new CommonLogMessage { MessageTemplate = g.Key, Count = g.Count() }) .OrderByDescending(x => x.Count) .Take(numberOfResults); @@ -58,27 +65,31 @@ namespace Umbraco.Core.Logging.Viewer return templates; } - public IEnumerable GetLogs() - { - var messages = new List(); - var logs = _logs.Take(20); + public PagedResult GetLogs(DateTime startDate, DateTime endDate, int pageNumber = 1, int pageSize = 100, Direction orderDirection = Direction.Descending) + { + //Get all logs into memory (Not sure this good or not) + var logs = GetAllLogs(startDate, endDate); + long totalRecords = logs.Count(); + long pageIndex = pageNumber - 1; + + //Skip, Take & Select + var logItems = logs + .OrderBy(l => l.Timestamp, orderDirection) + .Skip(pageSize * pageNumber) + .Take(pageSize) + .Select(x => new LogMessage { + Timestamp = x.Timestamp, + Level = x.Level, + MessageTemplateText = x.MessageTemplate.Text, + Exception = x.Exception, + Properties = x.Properties, + RenderedMessage = x.RenderMessage() + }); - foreach(var log in logs) + return new PagedResult(totalRecords, pageNumber, pageSize) { - var logItem = new LogMessage - { - Level = log.Level, - Properties = log.Properties, - Timestamp = log.Timestamp, - MessageTemplateText = log.MessageTemplate.Text, //Not necesarily worried about token position just the message text itself - RenderedMessage = log.RenderMessage(), //Not returning LogEvent itself from Serilog (as we don't get the rendered txt log back) - Exception = log.Exception - }; - - messages.Add(logItem); - } - - return messages; + Items = logItems + }; } } } diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 131dcd3404..fba504d87c 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -4582,12 +4582,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4602,17 +4604,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4729,7 +4734,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4741,6 +4747,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4755,6 +4762,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4762,12 +4770,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -4786,6 +4796,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4866,7 +4877,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4878,6 +4890,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4999,6 +5012,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", diff --git a/src/Umbraco.Web/Editors/LogsController.cs b/src/Umbraco.Web/Editors/LogsController.cs index a649dffde0..c1ca023cad 100644 --- a/src/Umbraco.Web/Editors/LogsController.cs +++ b/src/Umbraco.Web/Editors/LogsController.cs @@ -1,6 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Web.Mvc; using Umbraco.Core.Logging.Viewer; +using Umbraco.Core.Models; using Umbraco.Web.Mvc; namespace Umbraco.Web.Editors @@ -21,25 +23,25 @@ namespace Umbraco.Web.Editors [HttpGet] public int GetNumberOfErrors() { - return _logViewer.GetNumberOfErrors(); + return _logViewer.GetNumberOfErrors(startDate: DateTime.Now, endDate: DateTime.Now); } [HttpGet] public LogLevelCounts GetLogLevelCounts() { - return _logViewer.GetLogLevelCounts(); + return _logViewer.GetLogLevelCounts(startDate: DateTime.Now, endDate: DateTime.Now); } [HttpGet] public IEnumerable GetCommonLogMessages() { - return _logViewer.GetCommonLogMessages(); + return _logViewer.GetCommonLogMessages(startDate: DateTime.Now, endDate: DateTime.Now); } [HttpGet] - public IEnumerable GetLogs() + public PagedResult GetLogs() { - return _logViewer.GetLogs(); + return _logViewer.GetLogs(startDate: DateTime.Now, endDate: DateTime.Now); } }