Updates signature with start/end date and prep for returning paginated logs items

This commit is contained in:
Warren
2018-08-28 18:30:58 +01:00
parent 50e3f84759
commit 4ce33c4e3d
4 changed files with 90 additions and 53 deletions

View File

@@ -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
{
/// <summary>
/// Get all logs from your chosen datasource back as Serilog LogEvents
/// </summary>
IEnumerable<LogEvent> GetAllLogs(DateTime startDate, DateTime endDate);
/// <summary>
/// A count of number of errors
/// By counting Warnings with Exceptions, Errors & Fatal messages
/// </summary>
int GetNumberOfErrors();
int GetNumberOfErrors(DateTime startDate, DateTime endDate);
/// <summary>
/// Returns a number of the different log level entries
/// </summary>
LogLevelCounts GetLogLevelCounts();
LogLevelCounts GetLogLevelCounts(DateTime startDate, DateTime endDate);
/// <summary>
/// Returns the top common log message templates and their counts
/// Returns the top 10 common log message templates and their counts
/// </summary>
IEnumerable<CommonLogMessage> GetCommonLogMessages(int numberOfResults = 10);
IEnumerable<CommonLogMessage> GetCommonLogMessages(DateTime startDate, DateTime endDate, int numberOfResults = 10);
/// <summary>
/// Returns the collection of logs
/// </summary>
IEnumerable<LogMessage> GetLogs();
PagedResult<LogMessage> GetLogs(DateTime startDate, DateTime endDate,
int pageNumber = 1, int pageSize = 100, Direction orderDirection = Direction.Descending);
}
}

View File

@@ -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<LogEvent> _logs = new List<LogEvent>();
public JsonLogViewer()
public IEnumerable<LogEvent> GetAllLogs(DateTime startDate, DateTime endDate)
{
var logs = new List<LogEvent>();
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<CommonLogMessage> GetCommonLogMessages(int numberOfResults)
public IEnumerable<CommonLogMessage> 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<LogMessage> GetLogs()
{
var messages = new List<LogMessage>();
var logs = _logs.Take(20);
public PagedResult<LogMessage> 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<LogMessage>(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
};
}
}
}

View File

@@ -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",

View File

@@ -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<CommonLogMessage> GetCommonLogMessages()
{
return _logViewer.GetCommonLogMessages();
return _logViewer.GetCommonLogMessages(startDate: DateTime.Now, endDate: DateTime.Now);
}
[HttpGet]
public IEnumerable<LogMessage> GetLogs()
public PagedResult<LogMessage> GetLogs()
{
return _logViewer.GetLogs();
return _logViewer.GetLogs(startDate: DateTime.Now, endDate: DateTime.Now);
}
}