Updates signature with start/end date and prep for returning paginated logs items
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user