@using System
@using System.Collections.Generic
@using System.Globalization
@using System.Linq
@using Microsoft.AspNetCore.Diagnostics.Elm
@using Microsoft.AspNetCore.Diagnostics.Elm.RazorViews
@using Microsoft.Extensions.RazorViews
@using Microsoft.Extensions.Logging
@functions
{
public LogPage(LogPageModel model)
{
Model = model;
}
public LogPageModel Model { get; set; }
public HelperResult LogRow(LogInfo log, int level)
{
return new HelperResult((writer) =>
{
if (log.Severity >= Model.Options.MinLevel &&
(string.IsNullOrEmpty(Model.Options.NamePrefix) || log.Name.StartsWith(Model.Options.NamePrefix, StringComparison.Ordinal)))
{
PushWriter(writer);
WriteLiteral("
\r\n | ");
Write(string.Format("{0:MM/dd/yy}", log.Time));
WriteLiteral(" | \r\n ");
Write(string.Format("{0:H:mm:ss}", log.Time));
WriteLiteral($" | \r\n ");
Write(log.Name);
var severity = log.Severity.ToString().ToLowerInvariant();
WriteLiteral($" | \r\n ");
Write(log.Severity);
WriteLiteral($" | \r\n \r\n");
for (var i = 0; i < level; i++)
{
WriteLiteral(" \r\n");
}
WriteLiteral(" ");
Write(log.Message);
WriteLiteral($"\r\n | \r\n ");
Write(log.Exception);
WriteLiteral(" | \r\n
\r\n");
PopWriter();
}
});
}
public HelperResult Traverse(ScopeNode node, int level, Dictionary counts)
{
return new HelperResult((writer) => {
PushWriter(writer);
// print start of scope
Write(LogRow(new LogInfo()
{
Name = node.Name,
Time = node.StartTime,
Severity = LogLevel.Debug,
Message = "Beginning " + node.State,
}, level));
var messageIndex = 0;
var childIndex = 0;
while (messageIndex < node.Messages.Count && childIndex < node.Children.Count)
{
if (node.Messages[messageIndex].Time < node.Children[childIndex].StartTime)
{
Write(LogRow(node.Messages[messageIndex], level));
counts[node.Messages[messageIndex].Severity.ToString()]++;
messageIndex++;
}
else
{
Write(Traverse(node.Children[childIndex], level + 1, counts));
childIndex++;
}
}
if (messageIndex < node.Messages.Count)
{
for (var i = messageIndex; i < node.Messages.Count; i++)
{
Write(LogRow(node.Messages[i], level));
counts[node.Messages[i].Severity.ToString()]++;
}
}
else
{
for (var i = childIndex; i < node.Children.Count; i++)
{
Write(Traverse(node.Children[i], level + 1, counts));
}
}
// print end of scope
Write(LogRow(new LogInfo()
{
Name = node.Name,
Time = node.EndTime,
Severity = LogLevel.Debug,
Message = string.Format("Completed {0} in {1}ms", node.State, node.EndTime - node.StartTime)
}, level));
PopWriter();
});
}
}
@{
Response.ContentType = "text/html; charset=utf-8";
}
ASP.NET Core Logs
ASP.NET Core Logs
@foreach (var activity in Model.Activities.Reverse())
{
@{
var activityPath = Model.Path.Value + "/" + activity.Id;
if (activity.HttpInfo != null)
{
| @activity.HttpInfo.Path |
@activity.HttpInfo.Method |
@activity.HttpInfo.Host |
@activity.HttpInfo.StatusCode |
}
else if (activity.RepresentsScope)
{
@activity.Root.State |
}
else
{
Non-scope Log |
}
}
@{
var counts = new Dictionary();
counts["Critical"] = 0;
counts["Error"] = 0;
counts["Warning"] = 0;
counts["Information"] = 0;
counts["Debug"] = 0;
}
@if (!activity.RepresentsScope)
{
// message not within a scope
var logInfo = activity.Root.Messages.FirstOrDefault();
@LogRow(logInfo, 0)
counts[logInfo.Severity.ToString()] = 1;
}
else
{
@Traverse(activity.Root, 0, counts)
}
| @activity.Time.ToString("MM-dd-yyyy HH:mm:ss") |
@foreach (var kvp in counts)
{
if (string.Equals("Debug", kvp.Key)) {
@kvp.Value @kvp.Keyv |
}
else
{
@kvp.Value @kvp.Key |
}
}
|
}