Skip to content

Commit e4b05ce

Browse files
authored
Merge pull request #41 from futurum-dev/feature/WebApiEndpointRunner-logger
WebApiEndpointRunner - Add logging on exceptions
2 parents 36b92af + b5b1ced commit e4b05ce

File tree

5 files changed

+149
-4
lines changed

5 files changed

+149
-4
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
namespace Futurum.WebApiEndpoint.Micro.Sample.Features;
2+
3+
[WebApiEndpoint(prefixRoute: "web-api-endpoint-runner")]
4+
public partial class WebApiEndpointRunnerWebApiEndpoint
5+
{
6+
protected override void Build(IEndpointRouteBuilder builder)
7+
{
8+
builder.MapGet("exception", ExceptionHandler);
9+
10+
builder.MapGet("no-exception", NoExceptionHandler);
11+
}
12+
13+
private static Results<Ok, BadRequest<ProblemDetails>> ExceptionHandler(HttpContext context)
14+
{
15+
return RunToOk(Execute, context, "Exception caught by WebApiEndpointRunner.");
16+
17+
void Execute()
18+
{
19+
throw new Exception("We have an Exception!");
20+
}
21+
}
22+
23+
private static Results<Ok, BadRequest<ProblemDetails>> NoExceptionHandler(HttpContext context)
24+
{
25+
return RunToOk(Execute, context, "We have an Exception!");
26+
27+
void Execute()
28+
{
29+
}
30+
}
31+
}

src/Futurum.WebApiEndpoint.Micro/WebApiEndpointRunner.Run.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using Microsoft.AspNetCore.Mvc;
22

3+
using static Microsoft.Extensions.Logging.LoggerMessage;
4+
35
namespace Futurum.WebApiEndpoint.Micro;
46

57
public static partial class WebApiEndpointRunner
@@ -30,6 +32,9 @@ public static Results<TIResult1, BadRequest<ProblemDetails>> Run<TIResult1>(
3032
}
3133
catch (Exception exception)
3234
{
35+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
36+
LogErrorMessage(logger, exception.Message, exception);
37+
3338
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
3439

3540
return TypedResults.BadRequest(problemDetails);
@@ -62,6 +67,9 @@ public static Results<TIResult1, BadRequest<ProblemDetails>> Run<TIResult1>(
6267
}
6368
catch (Exception exception)
6469
{
70+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
71+
LogErrorMessage(logger, exception.Message, exception);
72+
6573
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
6674

6775
return TypedResults.BadRequest(problemDetails);
@@ -100,6 +108,9 @@ public static Results<TIResult1, TIResult2, BadRequest<ProblemDetails>> Run<TIRe
100108
}
101109
catch (Exception exception)
102110
{
111+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
112+
LogErrorMessage(logger, exception.Message, exception);
113+
103114
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
104115

105116
return TypedResults.BadRequest(problemDetails);
@@ -138,6 +149,9 @@ public static Results<TIResult1, TIResult2, BadRequest<ProblemDetails>> Run<TIRe
138149
}
139150
catch (Exception exception)
140151
{
152+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
153+
LogErrorMessage(logger, exception.Message, exception);
154+
141155
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
142156

143157
return TypedResults.BadRequest(problemDetails);
@@ -178,6 +192,9 @@ public static Results<TIResult1, TIResult2, TIResult3, BadRequest<ProblemDetails
178192
}
179193
catch (Exception exception)
180194
{
195+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
196+
LogErrorMessage(logger, exception.Message, exception);
197+
181198
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
182199

183200
return TypedResults.BadRequest(problemDetails);
@@ -218,6 +235,9 @@ public static Results<TIResult1, TIResult2, TIResult3, BadRequest<ProblemDetails
218235
}
219236
catch (Exception exception)
220237
{
238+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
239+
LogErrorMessage(logger, exception.Message, exception);
240+
221241
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
222242

223243
return TypedResults.BadRequest(problemDetails);
@@ -260,6 +280,9 @@ public static Results<TIResult1, TIResult2, TIResult3, TIResult4, BadRequest<Pro
260280
}
261281
catch (Exception exception)
262282
{
283+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
284+
LogErrorMessage(logger, exception.Message, exception);
285+
263286
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
264287

265288
return TypedResults.BadRequest(problemDetails);
@@ -302,6 +325,9 @@ public static Results<TIResult1, TIResult2, TIResult3, TIResult4, BadRequest<Pro
302325
}
303326
catch (Exception exception)
304327
{
328+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
329+
LogErrorMessage(logger, exception.Message, exception);
330+
305331
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
306332

307333
return TypedResults.BadRequest(problemDetails);
@@ -346,6 +372,9 @@ public static Results<TIResult1, TIResult2, TIResult3, TIResult4, TIResult5, Bad
346372
}
347373
catch (Exception exception)
348374
{
375+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
376+
LogErrorMessage(logger, exception.Message, exception);
377+
349378
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
350379

351380
return TypedResults.BadRequest(problemDetails);
@@ -390,6 +419,9 @@ public static Results<TIResult1, TIResult2, TIResult3, TIResult4, TIResult5, Bad
390419
}
391420
catch (Exception exception)
392421
{
422+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
423+
LogErrorMessage(logger, exception.Message, exception);
424+
393425
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
394426

395427
return TypedResults.BadRequest(problemDetails);
@@ -422,6 +454,9 @@ public static async Task<Results<TIResult, BadRequest<ProblemDetails>>> RunAsync
422454
}
423455
catch (Exception exception)
424456
{
457+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
458+
LogErrorMessage(logger, exception.Message, exception);
459+
425460
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
426461

427462
return TypedResults.BadRequest(problemDetails);
@@ -454,6 +489,9 @@ public static async Task<Results<TIResult, BadRequest<ProblemDetails>>> RunAsync
454489
}
455490
catch (Exception exception)
456491
{
492+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
493+
LogErrorMessage(logger, exception.Message, exception);
494+
457495
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
458496

459497
return TypedResults.BadRequest(problemDetails);
@@ -492,6 +530,9 @@ public static async Task<Results<TIResult1, TIResult2, BadRequest<ProblemDetails
492530
}
493531
catch (Exception exception)
494532
{
533+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
534+
LogErrorMessage(logger, exception.Message, exception);
535+
495536
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
496537

497538
return TypedResults.BadRequest(problemDetails);
@@ -530,6 +571,9 @@ public static async Task<Results<TIResult1, TIResult2, BadRequest<ProblemDetails
530571
}
531572
catch (Exception exception)
532573
{
574+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
575+
LogErrorMessage(logger, exception.Message, exception);
576+
533577
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
534578

535579
return TypedResults.BadRequest(problemDetails);
@@ -570,6 +614,9 @@ public static async Task<Results<TIResult1, TIResult2, TIResult3, BadRequest<Pro
570614
}
571615
catch (Exception exception)
572616
{
617+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
618+
LogErrorMessage(logger, exception.Message, exception);
619+
573620
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
574621

575622
return TypedResults.BadRequest(problemDetails);
@@ -610,6 +657,9 @@ public static async Task<Results<TIResult1, TIResult2, TIResult3, BadRequest<Pro
610657
}
611658
catch (Exception exception)
612659
{
660+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
661+
LogErrorMessage(logger, exception.Message, exception);
662+
613663
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
614664

615665
return TypedResults.BadRequest(problemDetails);
@@ -652,6 +702,9 @@ public static async Task<Results<TIResult1, TIResult2, TIResult3, TIResult4, Bad
652702
}
653703
catch (Exception exception)
654704
{
705+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
706+
LogErrorMessage(logger, exception.Message, exception);
707+
655708
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
656709

657710
return TypedResults.BadRequest(problemDetails);
@@ -694,6 +747,9 @@ public static async Task<Results<TIResult1, TIResult2, TIResult3, TIResult4, Bad
694747
}
695748
catch (Exception exception)
696749
{
750+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
751+
LogErrorMessage(logger, exception.Message, exception);
752+
697753
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
698754

699755
return TypedResults.BadRequest(problemDetails);
@@ -738,6 +794,9 @@ public static async Task<Results<TIResult1, TIResult2, TIResult3, TIResult4, TIR
738794
}
739795
catch (Exception exception)
740796
{
797+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
798+
LogErrorMessage(logger, exception.Message, exception);
799+
741800
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
742801

743802
return TypedResults.BadRequest(problemDetails);
@@ -782,9 +841,16 @@ public static async Task<Results<TIResult1, TIResult2, TIResult3, TIResult4, TIR
782841
}
783842
catch (Exception exception)
784843
{
844+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
845+
LogErrorMessage(logger, exception.Message, exception);
846+
785847
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
786848

787849
return TypedResults.BadRequest(problemDetails);
788850
}
789851
}
852+
853+
public class Logger;
854+
855+
private static readonly Action<ILogger, string, Exception> LogErrorMessage = Define<string>(LogLevel.Error, eventId: new EventId(id: 0, name: "ERROR"), formatString: "Exception occurred: {Message}");
790856
}

src/Futurum.WebApiEndpoint.Micro/WebApiEndpointRunner.RunToOk.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public static Results<Ok<T>, BadRequest<ProblemDetails>> RunToOk<T>(
2929
}
3030
catch (Exception exception)
3131
{
32+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
33+
LogErrorMessage(logger, exception.Message, exception);
34+
3235
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
3336

3437
return TypedResults.BadRequest(problemDetails);
@@ -60,6 +63,9 @@ public static Results<Ok<T>, BadRequest<ProblemDetails>> RunToOk<T>(
6063
}
6164
catch (Exception exception)
6265
{
66+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
67+
LogErrorMessage(logger, exception.Message, exception);
68+
6369
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
6470

6571
return TypedResults.BadRequest(problemDetails);
@@ -92,6 +98,9 @@ public static Results<Ok, BadRequest<ProblemDetails>> RunToOk(
9298
}
9399
catch (Exception exception)
94100
{
101+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
102+
LogErrorMessage(logger, exception.Message, exception);
103+
95104
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
96105

97106
return TypedResults.BadRequest(problemDetails);
@@ -124,6 +133,9 @@ public static Results<Ok, BadRequest<ProblemDetails>> RunToOk(
124133
}
125134
catch (Exception exception)
126135
{
136+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
137+
LogErrorMessage(logger, exception.Message, exception);
138+
127139
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
128140

129141
return TypedResults.BadRequest(problemDetails);
@@ -155,6 +167,9 @@ public static async Task<Results<Ok<T>, BadRequest<ProblemDetails>>> RunToOkAsyn
155167
}
156168
catch (Exception exception)
157169
{
170+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
171+
LogErrorMessage(logger, exception.Message, exception);
172+
158173
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
159174

160175
return TypedResults.BadRequest(problemDetails);
@@ -186,6 +201,9 @@ public static async Task<Results<Ok<T>, BadRequest<ProblemDetails>>> RunToOkAsyn
186201
}
187202
catch (Exception exception)
188203
{
204+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
205+
LogErrorMessage(logger, exception.Message, exception);
206+
189207
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
190208

191209
return TypedResults.BadRequest(problemDetails);
@@ -218,6 +236,9 @@ public static async Task<Results<Ok, BadRequest<ProblemDetails>>> RunToOkAsync(
218236
}
219237
catch (Exception exception)
220238
{
239+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
240+
LogErrorMessage(logger, exception.Message, exception);
241+
221242
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage);
222243

223244
return TypedResults.BadRequest(problemDetails);
@@ -250,6 +271,9 @@ public static async Task<Results<Ok, BadRequest<ProblemDetails>>> RunToOkAsync(
250271
}
251272
catch (Exception exception)
252273
{
274+
var logger = context.RequestServices.GetRequiredService<ILogger<Logger>>();
275+
LogErrorMessage(logger, exception.Message, exception);
276+
253277
var problemDetails = ExceptionToProblemDetailsMapperService.Instance.Map(exception, context, errorMessage());
254278

255279
return TypedResults.BadRequest(problemDetails);

test/Futurum.WebApiEndpoint.Micro.Tests/WebApiEndpointRunnerTests.Run.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using Microsoft.AspNetCore.Http;
22
using Microsoft.AspNetCore.Http.HttpResults;
33
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Logging;
6+
using Microsoft.Extensions.Logging.Abstractions;
47

58
namespace Futurum.WebApiEndpoint.Micro.Tests;
69

@@ -1385,6 +1388,15 @@ private static void ValidateOk(Results<Ok, NotFound, Accepted, Created, Conflict
13851388
}
13861389
}
13871390

1388-
private static DefaultHttpContext CreateHttpContext() =>
1389-
new() { Request = { Path = REQUEST_PATH } };
1391+
private static DefaultHttpContext CreateHttpContext()
1392+
{
1393+
var services = new ServiceCollection();
1394+
services.AddSingleton<ILogger<WebApiEndpointRunner.Logger>>(new Logger<WebApiEndpointRunner.Logger>(new NullLoggerFactory()));
1395+
1396+
return new DefaultHttpContext
1397+
{
1398+
Request = { Path = REQUEST_PATH },
1399+
RequestServices = services.BuildServiceProvider()
1400+
};
1401+
}
13901402
}

test/Futurum.WebApiEndpoint.Micro.Tests/WebApiEndpointRunnerTests.RunToOk.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using Microsoft.AspNetCore.Http;
22
using Microsoft.AspNetCore.Http.HttpResults;
33
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Logging;
6+
using Microsoft.Extensions.Logging.Abstractions;
47

58
namespace Futurum.WebApiEndpoint.Micro.Tests;
69

@@ -361,6 +364,15 @@ private static void ValidateOk<T>(Results<Ok<T>, BadRequest<ProblemDetails>> res
361364
}
362365
}
363366

364-
private static DefaultHttpContext CreateHttpContext() =>
365-
new() { Request = { Path = REQUEST_PATH } };
367+
private static DefaultHttpContext CreateHttpContext()
368+
{
369+
var services = new ServiceCollection();
370+
services.AddSingleton<ILogger<WebApiEndpointRunner.Logger>>(new Logger<WebApiEndpointRunner.Logger>(new NullLoggerFactory()));
371+
372+
return new DefaultHttpContext
373+
{
374+
Request = { Path = REQUEST_PATH },
375+
RequestServices = services.BuildServiceProvider()
376+
};
377+
}
366378
}

0 commit comments

Comments
 (0)