InterlockLedger.WatchDog is a Realtime Message, Event, HTTP (Request & Response) and Exception logger and viewer for ASP.Net 6 Web Apps and APIs. It allows developers log and view messages, events, http requests made to their web application and also exception caught during runtime in their web applications, all in Realtime.
It leverages SignalR
for real-time monitoring and LiteDb
a Serverless MongoDB-like database with no configuration.
- RealTime HTTP Request and Response Logger
- RealTime Exception Logger
- In-code message and event logging
- User Friendly Logger Views
- Search Option for HTTP and Exception Logs
- Filtering Option for HTTP Logs using HTTP Methods and StatusCode
- Logger View Authentication
- Auto Clear Logs Option
- In-code logger for messages and events
- Now a privacy filtering class to vet/adjust information to be logged can be injected
- Specify folder to store log database
- Separate extension method to map endpoints for better integration with complex ASP.NET apps
- Diagnostic logging when configuring middleware
- .NET 6.0 and newer
Install via .NET CLI
dotnet add package InterlockLedger.WatchDog --version 3.0.0
Install via Package Manager
Install-Package InterlockLedger.WatchDog --version 3.0.0
To enable InterlockLedger.WatchDog to listen for requests, use the WatchDog middleware provided by WatchDog.
using InterlockLedger.WatchDog;
services.AddWatchDogServices();
services.AddWatchDogServices(opt =>
{
opt.DatabaseFolder = "c:\\temp\\watchdog";
// default uses SpecialFolder.LocalApplicationData and executing assembly name
});
This clears the logs after a specific duration.
services.AddWatchDogServices(opt =>
{
opt.UseAutoClear = true;
});
NOTE When
UseAutoClear = true
Default Schedule Time is set to Weekly, override it like below:
services.AddWatchDogServices(opt =>
{
opt.UseAutoClear = true;
opt.ClearTimeSchedule = WatchDogAutoClearScheduleEnum.Monthly;
});
This authentication information (Username and Password) will be used to access the log viewer, unless you specify a role to check first
app.UseWatchDog(opt =>
{
opt.WatchPageUsername = "admin";
opt.WatchPagePassword = "Qwerty@123";
});
NOTE
Important
If your projects startup or program class contains app.UseMvc() or app.UseRouting() then app.UseWatchDog() should come after
app.UseWatchDog(opt =>
{
opt.WatchPageUsername = "admin";
opt.WatchPagePassword = "Qwerty@123";
opt.RequiredRole = "LogViewer";
});
List of routes, paths or specific strings to be ignored should be a comma separated string like below.
app.UseWatchDog(opt =>
{
opt.WatchPageUsername = "admin";
opt.WatchPagePassword = "Qwerty@123";
opt.Blacklist = "Test/testPost,weatherforecast";
});
This is used to log in-app exceptions that occur during the processing of a particular HTTP request.
app.UseWatchDog(opt =>
{
opt.WatchPageUsername = "admin";
opt.WatchPagePassword = "Qwerty@123";
opt.LogExceptions = true;
});
This is used to inject a class that will look at log details models and tweak them before being stored, to remove sensitive information
builder.Services.AddWatchDogServicesUsing<MyCustomModelsFilter>(opt =>
{
opt.UseAutoClear = true;
opt.ClearTimeSchedule = WatchDogAutoClearScheduleEnum.Monthly;
});```
The class must implement IModelsFilter to do the needed filtering
```c#
class MyCustomModelsFilter : IModelsFilter
{
public ExceptionLogModel FilterExceptionLog(ExceptionLogModel exceptionLogModel, RequestModel requestModel) => exceptionLogModel;
public RequestModel FilterRequest(RequestModel requestModel) {
if (requestModel.Path.Safe().StartsWith("/Private/", StringComparison.OrdinalIgnoreCase))
requestModel.QueryString = "<<sensitive>>";
return requestModel;
}
public ResponseModel FilterResponse(ResponseModel responseModel, RequestModel requestModel) => responseModel;
}
This will make the LogViewer available at /watchdog
app.UseEndpoints(endpoints => {
endpoints.MapControllers();
// map other needed things ...
endpoints.MapWatchDog();
});
WatchLogger.Log("...TestGet Started...");
Start your server and head to /watchdog
to view the logs.
Example: https://myserver.com/watchdog or https://localhost:[your-port]/watchdog
Still confused? Check out the implementation in the WatchDogCompleteApiNet6 folder.
Feel like something is missing? Fork the repo and send a PR.
Encountered a bug? Fork the repo and send a PR.
Alternatively, open an issue and we'll get to it as soon as we can.
Kelechi Onyekwere - Github Twitter
Rafael Monoman Teixeira - Github