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
};
}
}
}