fixing dotnets terrible logging

This commit is contained in:
2023-12-05 15:30:33 -07:00
parent a77c001601
commit e8aef7357a
16 changed files with 134 additions and 95 deletions

View File

@@ -16,7 +16,7 @@
@inject CanvasService canvas @inject CanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@inject QuizEditorContext quizContext @inject QuizEditorContext quizContext
@inject ILogger<QuizFormPage> logger @inject MyLogger<QuizFormPage> logger
@inject NavigationManager Navigation @inject NavigationManager Navigation
@code { @code {
@@ -45,12 +45,12 @@
if (loading) if (loading)
{ {
loading = false; loading = false;
logger.LogInformation($"loading quiz {CourseName} {QuizName}"); logger.Log($"loading quiz {CourseName} {QuizName}");
if (planner.LocalCourse == null) if (planner.LocalCourse == null)
{ {
var courses = await fileStorageManager.LoadSavedCourses(); var courses = await fileStorageManager.LoadSavedCourses();
planner.LocalCourse = courses.First(c => c.Settings.Name == CourseName); planner.LocalCourse = courses.First(c => c.Settings.Name == CourseName);
logger.LogInformation($"set course to '{planner.LocalCourse?.Settings.Name}'"); logger.Log($"set course to '{planner.LocalCourse?.Settings.Name}'");
} }
if (quizContext.Quiz == null) if (quizContext.Quiz == null)
@@ -62,7 +62,7 @@
.FirstOrDefault(q => q.Name == QuizName); .FirstOrDefault(q => q.Name == QuizName);
quizContext.Quiz = quiz; quizContext.Quiz = quiz;
logger.LogInformation($"set quiz to '{quizContext.Quiz?.Name}'"); logger.Log($"set quiz to '{quizContext.Quiz?.Name}'");
} }
StateHasChanged(); StateHasChanged();

View File

@@ -15,6 +15,8 @@ global using Management.Web.Shared.Components.Forms;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web;
using dotenv.net; using dotenv.net;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
DotEnv.Load(); DotEnv.Load();
@@ -60,6 +62,8 @@ builder.Services.AddSignalR(e =>
e.MaximumReceiveMessageSize = 102400000; e.MaximumReceiveMessageSize = 102400000;
}); });
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
@@ -79,4 +83,14 @@ app.UseRouting();
app.MapBlazorHub(); app.MapBlazorHub();
app.MapFallbackToPage("/_Host"); app.MapFallbackToPage("/_Host");
app.Run();
app.Start();
var addresses = app.Services.GetService<IServer>().Features.Get<IServerAddressesFeature>().Addresses;
foreach (var address in addresses)
{
Console.WriteLine("Running at: " + address);
}
app.WaitForShutdown();

View File

@@ -167,31 +167,16 @@
<div class="flex-grow-1 d-flex flex-column"> <div class="flex-grow-1 d-flex flex-column">
@if (assignmentContext.Assignment != null) @if (assignmentContext.Assignment != null)
{ {
<div class="m-1"> @* <ButtonSelect
<label class="form-label">
Name
</label>
<input class="form-control" @bind="name" @oninput="handleNameChange" />
</div>
<ButtonSelect
Label="Assignment Group" Label="Assignment Group"
Options="planner.LocalCourse?.Settings.AssignmentGroups" Options="planner.LocalCourse?.Settings.AssignmentGroups"
GetName="(g) => g?.Name" GetName="(g) => g?.Name"
OnSelect="(g) => setAssignmentGroup(g)" OnSelect="(g) => setAssignmentGroup(g)"
SelectedOption="selectedAssignmentGroup" SelectedOption="selectedAssignmentGroup"
/> /> *@
<div class="m-1 flex-grow-1"> <div class="m-1 flex-grow-1">
<AssignmentMarkdownEditor /> <AssignmentMarkdownEditor />
</div> </div>
@* <div class="container">
<RubricMarkdownEditor />
<hr>
<div class="mx-5 px-5">
<SubmissionTypeSelector />
</div>
</div> *@
} }
</div> </div>

View File

@@ -55,15 +55,6 @@
{ {
StateHasChanged(); StateHasChanged();
} }
@* if (assignmentContext.Assignment != null)
{
var newAssignment = assignmentContext.Assignment with
{
Description = newRawAssignment
};
assignmentContext.SaveAssignment(newAssignment);
} *@
} }
StateHasChanged(); StateHasChanged();
} }

View File

@@ -3,7 +3,7 @@
@inject FileStorageManager fileStorageManager @inject FileStorageManager fileStorageManager
@inject CoursePlanner planner @inject CoursePlanner planner
@inject NavigationManager Navigation @inject NavigationManager Navigation
@inject ILogger<CurrentFiles> logger @inject MyLogger<CurrentFiles> logger
@code @code
{ {
@@ -17,10 +17,8 @@
void handleClick(MouseEventArgs e, LocalCourse course) void handleClick(MouseEventArgs e, LocalCourse course)
{ {
@* logger.LogInformation("here"); *@
planner.LocalCourse = course; planner.LocalCourse = course;
Navigation.NavigateTo("/course/" + course.Settings.Name); Navigation.NavigateTo("/course/" + course.Settings.Name);
Console.WriteLine("navigated to course detail");
} }
} }

View File

@@ -5,7 +5,7 @@
@inject NavigationManager Navigation @inject NavigationManager Navigation
@inject AssignmentEditorContext assignmentContext @inject AssignmentEditorContext assignmentContext
@inject ILogger<AssignmentInDay> logger @inject MyLogger<AssignmentInDay> logger
@inherits DroppableAssignment @inherits DroppableAssignment
@code { @code {
@@ -38,7 +38,7 @@
{ {
assignmentContext.Assignment = Assignment; assignmentContext.Assignment = Assignment;
Navigation.NavigateTo("/course/" + planner.LocalCourse.Settings.Name + "/assignment/" + Assignment.Name); Navigation.NavigateTo("/course/" + planner.LocalCourse.Settings.Name + "/assignment/" + Assignment.Name);
logger.LogInformation("navigating to assignment page"); logger.Log("navigating to assignment page");
} }
} }
} }

View File

@@ -2,8 +2,8 @@
"DetailedErrors": true, "DetailedErrors": true,
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Error",
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Error"
} }
} }
} }

View File

@@ -1,7 +1,7 @@
{ {
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Error",
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
} }
}, },

View File

@@ -49,15 +49,15 @@ public class AssignmentEditorContext
? currentModule with ? currentModule with
{ {
Assignments = currentModule.Assignments Assignments = currentModule.Assignments
.Select(a => a == Assignment ? newAssignment : a) .Select(a => a.Name == Assignment.Name ? newAssignment : a)
.ToArray() .ToArray()
} }
: m : m
) )
.ToArray(); .ToArray();
planner.LocalCourse = planner.LocalCourse with { Modules = updatedModules };
Assignment = newAssignment; Assignment = newAssignment;
planner.LocalCourse = planner.LocalCourse with { Modules = updatedModules };
} }
} }

View File

@@ -7,17 +7,20 @@ using CanvasModel.Modules;
using Management.Services.Canvas; using Management.Services.Canvas;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using CanvasModel.Quizzes; using CanvasModel.Quizzes;
using Management.Services;
namespace Management.Planner; namespace Management.Planner;
public class CoursePlanner public class CoursePlanner
{ {
private readonly MyLogger<CoursePlanner> logger;
private readonly FileStorageManager fileStorageManager; private readonly FileStorageManager fileStorageManager;
private readonly CanvasService canvas; private readonly CanvasService canvas;
public bool LoadingCanvasData { get; internal set; } = false; public bool LoadingCanvasData { get; internal set; } = false;
public CoursePlanner(FileStorageManager fileStorageManager, CanvasService canvas) public CoursePlanner(MyLogger<CoursePlanner> logger, FileStorageManager fileStorageManager, CanvasService canvas)
{ {
this.logger = logger;
this.fileStorageManager = fileStorageManager; this.fileStorageManager = fileStorageManager;
this.canvas = canvas; this.canvas = canvas;
} }
@@ -41,6 +44,14 @@ public class CoursePlanner
var verifiedCourse = value.GeneralCourseCleanup(); var verifiedCourse = value.GeneralCourseCleanup();
if (_localCourse == null)
{
_localCourse = verifiedCourse;
_lastSavedCourse = verifiedCourse;
StateHasChanged?.Invoke();
return;
}
_debounceTimer?.Dispose(); _debounceTimer?.Dispose();
_debounceTimer = new Timer( _debounceTimer = new Timer(
async (_) => await saveCourseToFile(verifiedCourse), async (_) => await saveCourseToFile(verifiedCourse),
@@ -61,16 +72,25 @@ public class CoursePlanner
// ignore initial load of course // ignore initial load of course
if (LocalCourse == null) if (LocalCourse == null)
{ {
Console.WriteLine("saving course as of debounce call time"); logger.Trace("saving course as of debounce call time");
await fileStorageManager.SaveCourseAsync(courseAsOfDebounce, null); await fileStorageManager.SaveCourseAsync(courseAsOfDebounce, null);
_lastSavedCourse = courseAsOfDebounce; _lastSavedCourse = courseAsOfDebounce;
} }
else else
{ {
Console.WriteLine("Saving latest version of file"); if (_lastSavedCourse == null)
{
logger.Trace("not saving course, no prevous saved course");
_lastSavedCourse = LocalCourse ?? courseAsOfDebounce;
return;
}
logger.Trace("Saving latest version of file");
var courseToSave = LocalCourse; var courseToSave = LocalCourse;
await fileStorageManager.SaveCourseAsync(courseToSave, _lastSavedCourse); await fileStorageManager.SaveCourseAsync(courseToSave, _lastSavedCourse);
_lastSavedCourse = courseToSave; _lastSavedCourse = courseToSave;
} }
} }
@@ -115,7 +135,7 @@ public class CoursePlanner
public async Task CreateModule(LocalModule newModule) public async Task CreateModule(LocalModule newModule)
{ {
if(LocalCourse == null) if (LocalCourse == null)
return; return;
var canvasCourseId = var canvasCourseId =
LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module"); LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module");
@@ -132,13 +152,13 @@ public class CoursePlanner
public async Task SyncAssignmentGroups() public async Task SyncAssignmentGroups()
{ {
if(LocalCourse == null) if (LocalCourse == null)
return; return;
var canvasCourseId = var canvasCourseId =
LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module"); LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module");
CanvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId); CanvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId);
await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(canvasCourseId, CanvasAssignmentGroups, canvas); await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(canvasCourseId, CanvasAssignmentGroups, canvas);

View File

@@ -8,17 +8,17 @@ public class CanvasAssignmentGroupService
{ {
private readonly IWebRequestor webRequestor; private readonly IWebRequestor webRequestor;
private readonly CanvasServiceUtils utils; private readonly CanvasServiceUtils utils;
private readonly ILogger<CanvasAssignmentGroupService> log; private readonly MyLogger<CanvasAssignmentGroupService> logger;
public CanvasAssignmentGroupService( public CanvasAssignmentGroupService(
IWebRequestor webRequestor, IWebRequestor webRequestor,
CanvasServiceUtils utils, CanvasServiceUtils utils,
ILogger<CanvasAssignmentGroupService> logger MyLogger<CanvasAssignmentGroupService> logger
) )
{ {
this.webRequestor = webRequestor; this.webRequestor = webRequestor;
this.utils = utils; this.utils = utils;
this.log = logger; this.logger = logger;
} }
public async Task<IEnumerable<CanvasAssignmentGroup>> GetAll(ulong courseId) public async Task<IEnumerable<CanvasAssignmentGroup>> GetAll(ulong courseId)
{ {
@@ -35,7 +35,7 @@ public class CanvasAssignmentGroupService
LocalAssignmentGroup localAssignmentGroup LocalAssignmentGroup localAssignmentGroup
) )
{ {
log.LogInformation($"creating assignment group: {localAssignmentGroup.Name}"); logger.Log($"creating assignment group: {localAssignmentGroup.Name}");
var url = $"courses/{canvasCourseId}/assignment_groups"; var url = $"courses/{canvasCourseId}/assignment_groups";
var request = new RestRequest(url); var request = new RestRequest(url);
var body = new var body = new
@@ -59,7 +59,7 @@ public class CanvasAssignmentGroupService
LocalAssignmentGroup localAssignmentGroup LocalAssignmentGroup localAssignmentGroup
) )
{ {
log.LogInformation($"updating assignment group: {localAssignmentGroup.Name}"); logger.Log($"updating assignment group: {localAssignmentGroup.Name}");
if (localAssignmentGroup.CanvasId == null) if (localAssignmentGroup.CanvasId == null)
throw new Exception("cannot update assignment group if canvas id is null"); throw new Exception("cannot update assignment group if canvas id is null");
var url = $"courses/{canvasCourseId}/assignment_groups/{localAssignmentGroup.CanvasId}"; var url = $"courses/{canvasCourseId}/assignment_groups/{localAssignmentGroup.CanvasId}";

View File

@@ -12,7 +12,7 @@ public class CanvasService
{ {
private readonly IWebRequestor webRequestor; private readonly IWebRequestor webRequestor;
private readonly CanvasServiceUtils utils; private readonly CanvasServiceUtils utils;
private readonly ILogger<CanvasService> logger; private readonly MyLogger<CanvasService> logger;
public CanvasAssignmentService Assignments { get; } public CanvasAssignmentService Assignments { get; }
public CanvasAssignmentGroupService AssignmentGroups { get; } public CanvasAssignmentGroupService AssignmentGroups { get; }
@@ -26,7 +26,7 @@ public class CanvasService
CanvasAssignmentGroupService AssignmentGroups, CanvasAssignmentGroupService AssignmentGroups,
CanvasModuleService Modules, CanvasModuleService Modules,
CanvasQuizService Quizzes, CanvasQuizService Quizzes,
ILogger<CanvasService> logger MyLogger<CanvasService> logger
) )
{ {
this.webRequestor = webRequestor; this.webRequestor = webRequestor;
@@ -64,8 +64,8 @@ public class CanvasService
if (data == null) if (data == null)
{ {
logger.LogError(response.Content); logger.Error(response.Content);
logger.LogError(response.ResponseUri?.ToString()); logger.Error(response.ResponseUri?.ToString());
throw new Exception("error getting course from canvas"); throw new Exception("error getting course from canvas");
} }
return data; return data;
@@ -95,7 +95,7 @@ public class CanvasService
CanvasModuleItem item CanvasModuleItem item
) )
{ {
logger.LogInformation($"updating module item {item.Title}"); logger.Log($"updating module item {item.Title}");
var url = $"courses/{canvasCourseId}/modules/{canvasModuleId}/items/{item.Id}"; var url = $"courses/{canvasCourseId}/modules/{canvasModuleId}/items/{item.Id}";
var body = new { module_item = new { title = item.Title, position = item.Position } }; var body = new { module_item = new { title = item.Title, position = item.Position } };
var request = new RestRequest(url); var request = new RestRequest(url);
@@ -114,7 +114,7 @@ public class CanvasService
ulong contentId ulong contentId
) )
{ {
logger.LogInformation($"creating new module item {title}"); logger.Log($"creating new module item {title}");
var url = $"courses/{canvasCourseId}/modules/{canvasModuleId}/items"; var url = $"courses/{canvasCourseId}/modules/{canvasModuleId}/items";
var body = new var body = new
{ {

View File

@@ -23,7 +23,7 @@ public class FileStorageManager
this.logger.Log("Using storage directory: " + _basePath); this.logger.Log("Using storage directory: " + _basePath);
} }
public async Task SaveCourseAsync(LocalCourse course, LocalCourse? previouslyStoredCourse) public async Task SaveCourseAsync(LocalCourse course, LocalCourse previouslyStoredCourse)
{ {
await _saveMarkdownCourse.Save(course, previouslyStoredCourse); await _saveMarkdownCourse.Save(course, previouslyStoredCourse);
} }

View File

@@ -1,3 +1,4 @@
using System.Threading.Tasks.Sources;
using LocalModels; using LocalModels;
using Management.Services; using Management.Services;
@@ -12,16 +13,16 @@ public class MarkdownCourseSaver
_basePath = FileConfiguration.GetBasePath(); _basePath = FileConfiguration.GetBasePath();
} }
public async Task Save(LocalCourse course, LocalCourse? previouslyStoredCourse) public async Task Save(LocalCourse course, LocalCourse previouslyStoredCourse)
{ {
var courseDirectory = $"{_basePath}/{course.Settings.Name}"; var courseDirectory = $"{_basePath}/{course.Settings.Name}";
if (!Directory.Exists(courseDirectory)) if (!Directory.Exists(courseDirectory))
Directory.CreateDirectory(courseDirectory); Directory.CreateDirectory(courseDirectory);
await saveSettings(course, courseDirectory); await saveSettings(course, courseDirectory);
await saveModules(course, courseDirectory); await saveModules(course, courseDirectory, previouslyStoredCourse);
} }
private async Task saveModules(LocalCourse course, string courseDirectory) private async Task saveModules(LocalCourse course, string courseDirectory, LocalCourse previouslyStoredCourse)
{ {
foreach (var module in course.Modules) foreach (var module in course.Modules)
{ {
@@ -30,7 +31,7 @@ public class MarkdownCourseSaver
Directory.CreateDirectory(moduleDirectory); Directory.CreateDirectory(moduleDirectory);
await saveQuizzes(course, module); await saveQuizzes(course, module);
await saveAssignments(course, module); await saveAssignments(course, module, previouslyStoredCourse);
} }
var moduleNames = course.Modules.Select(m => m.Name); var moduleNames = course.Modules.Select(m => m.Name);
@@ -91,7 +92,7 @@ public class MarkdownCourseSaver
} }
private async Task saveAssignments(LocalCourse course, LocalModule module) private async Task saveAssignments(LocalCourse course, LocalModule module, LocalCourse? previouslyStoredCourse)
{ {
var assignmentsDirectory = $"{_basePath}/{course.Settings.Name}/{module.Name}/assignments"; var assignmentsDirectory = $"{_basePath}/{course.Settings.Name}/{module.Name}/assignments";
if (!Directory.Exists(assignmentsDirectory)) if (!Directory.Exists(assignmentsDirectory))
@@ -99,11 +100,18 @@ public class MarkdownCourseSaver
foreach (var assignment in module.Assignments) foreach (var assignment in module.Assignments)
{ {
var assignmentMarkdown = assignment.ToMarkdown();
var filePath = assignmentsDirectory + "/" + assignment.Name + ".md"; var previousModule = previouslyStoredCourse?.Modules.FirstOrDefault(m => m.Name == module.Name);
await File.WriteAllTextAsync(filePath, assignmentMarkdown); var previousAssignment = previousModule?.Assignments.FirstOrDefault(a => a == assignment);
Console.WriteLine("saving file");
if (previousAssignment == null)
{
var assignmentMarkdown = assignment.ToMarkdown();
var filePath = assignmentsDirectory + "/" + assignment.Name + ".md";
await File.WriteAllTextAsync(filePath, assignmentMarkdown);
logger.Trace("saving assignment " + filePath);
}
} }
removeOldAssignments(assignmentsDirectory, module); removeOldAssignments(assignmentsDirectory, module);
} }

View File

@@ -1,26 +0,0 @@
using System.Runtime.CompilerServices;
namespace Management.Services;
public class MyLogger<T>
{
private readonly ILogger<T> baseLogger;
public MyLogger(ILogger<T> baseLogger)
{
this.baseLogger = baseLogger;
}
public void Log(
string message,
LogLevel logLevel = LogLevel.Information,
[CallerMemberName] string memberName = ""
)
{
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
// baseLogger.Log(logLevel, finalMessage);
Console.WriteLine(finalMessage);
}
}

View File

@@ -0,0 +1,49 @@
using System.Runtime.CompilerServices;
namespace Management.Services;
public class MyLogger<T>
{
private readonly ILogger<T> baseLogger;
public MyLogger(ILogger<T> baseLogger)
{
this.baseLogger = baseLogger;
}
public void Log(
string message,
LogLevel logLevel = LogLevel.Information,
[CallerMemberName] string memberName = ""
)
{
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
baseLogger.Log(logLevel, finalMessage);
Console.WriteLine(finalMessage);
}
public void Trace(
string message,
LogLevel logLevel = LogLevel.Trace,
[CallerMemberName] string memberName = ""
)
{
var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
baseLogger.Log(logLevel, finalMessage);
Console.WriteLine(finalMessage);
}
public void Error(
string message,
LogLevel logLevel = LogLevel.Error,
[CallerMemberName] string memberName = ""
)
{
var finalMessage = $"ERROR: [{typeof(T)}.{memberName}] {message}";
baseLogger.Log(logLevel, finalMessage);
Console.WriteLine(finalMessage);
}
}