@using System @using System.Collections.Generic @using System.Globalization @using System.Linq @using Microsoft.AspNetCore.Diagnostics.Elm @using Microsoft.AspNetCore.Diagnostics.Elm.Views @using Microsoft.AspNetCore.DiagnosticsViewPage.Views @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))) { WriteLiteralTo(writer, " \r\n "); WriteTo(writer, string.Format("{0:MM/dd/yy}", log.Time)); WriteLiteralTo(writer, "\r\n "); WriteTo(writer, string.Format("{0:H:mm:ss}", log.Time)); WriteLiteralTo(writer, $"\r\n "); WriteTo(writer, log.Name); var severity = log.Severity.ToString().ToLowerInvariant(); WriteLiteralTo(writer, $"\r\n "); WriteTo(writer, log.Severity); WriteLiteralTo(writer, $"\r\n \r\n"); for (var i = 0; i < level; i++) { WriteLiteralTo(writer, " \r\n"); } WriteLiteralTo(writer, " "); WriteTo(writer, log.Message); WriteLiteralTo(writer, $"\r\n \r\n "); WriteTo(writer, log.Exception); WriteLiteralTo(writer, "\r\n \r\n"); } }); } public HelperResult Traverse(ScopeNode node, int level, Dictionary counts) { return new HelperResult((writer) => { // print start of scope WriteTo(writer, 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) { WriteTo(writer, LogRow(node.Messages[messageIndex], level)); counts[node.Messages[messageIndex].Severity.ToString()]++; messageIndex++; } else { WriteTo(writer, Traverse(node.Children[childIndex], level + 1, counts)); childIndex++; } } if (messageIndex < node.Messages.Count) { for (var i = messageIndex; i < node.Messages.Count; i++) { WriteTo(writer, LogRow(node.Messages[i], level)); counts[node.Messages[i].Severity.ToString()]++; } } else { for (var i = childIndex; i < node.Children.Count; i++) { WriteTo(writer, Traverse(node.Children[i], level + 1, counts)); } } // print end of scope WriteTo(writer, 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)); }); } } @{ Response.ContentType = "text/html"; } 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) { } else if (activity.RepresentsScope) { } else { } } }
Path Method Host Status Code Logs
@activity.HttpInfo.Path @activity.HttpInfo.Method @activity.HttpInfo.Host @activity.HttpInfo.StatusCode@activity.Root.StateNon-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) } @foreach (var kvp in counts) { if (string.Equals("Debug", kvp.Key)) { } else { } }
Date Time Name Severity State Error^
@activity.Time.ToString("MM-dd-yyyy HH:mm:ss")@kvp.Value @kvp.Keyv@kvp.Value @kvp.Key