Skip to content

Commit c3b9d45

Browse files
authored
Added logging for results (#92)
1 parent 5487af1 commit c3b9d45

6 files changed

Lines changed: 95 additions & 21 deletions

File tree

source/EasyWay.WebApi/Internals/WebApiResultMapper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public IResult Map(CommandResult commandResult)
1313
{
1414
CommandErrorEnum.None => Results.Ok(),
1515
CommandErrorEnum.Validation => Results.BadRequest(commandResult.ValidationErrors),
16-
CommandErrorEnum.BrokenBusinessRule => Results.Conflict(new BrokenBusinessRuleExceptionResponse(commandResult.Exception)),
16+
CommandErrorEnum.BrokenBusinessRule => Results.Conflict(new BrokenBusinessRuleExceptionResponse(commandResult.BrokenBusinessRuleException)),
1717
CommandErrorEnum.ConcurrencyConflict => Results.StatusCode(409),
1818
CommandErrorEnum.OperationCanceled => Results.StatusCode(499),
1919
CommandErrorEnum.NotFound => Results.StatusCode(404),

source/EasyWay/CommandResult.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public sealed class CommandResult
1111

1212
internal IDictionary<string, string[]> ValidationErrors;
1313

14+
internal BrokenBusinessRuleException? BrokenBusinessRuleException;
15+
1416
internal Exception? Exception;
1517

1618
private CommandResult()
@@ -38,7 +40,7 @@ private CommandResult(BrokenBusinessRuleException brokenBusinessRuleException)
3840
{
3941
Error = CommandErrorEnum.BrokenBusinessRule;
4042
ValidationErrors = new Dictionary<string, string[]>();
41-
Exception = brokenBusinessRuleException;
43+
BrokenBusinessRuleException = brokenBusinessRuleException;
4244
}
4345

4446
private CommandResult(ConcurrencyException concurrencyException)
@@ -81,6 +83,8 @@ public sealed class CommandResult<TOperationResult>
8183

8284
internal IDictionary<string, string[]> ValidationErrors;
8385

86+
internal BrokenBusinessRuleException? BrokenBusinessRuleException;
87+
8488
internal Exception? Exception;
8589

8690
private CommandResult(TOperationResult operationResult)
@@ -112,7 +116,7 @@ private CommandResult(BrokenBusinessRuleException brokenBusinessRuleException)
112116
OperationResult = null;
113117
Error = CommandErrorEnum.BrokenBusinessRule;
114118
ValidationErrors = new Dictionary<string, string[]>();
115-
Exception = brokenBusinessRuleException;
119+
BrokenBusinessRuleException = brokenBusinessRuleException;
116120
}
117121

118122
private CommandResult(ConcurrencyException concurrencyException)

source/EasyWay/Internals/Commands/Commands/CommandExecutorLoggerDecorator.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,33 @@ public async Task<CommandResult> Execute<TModule, TCommand>(TCommand command, Ca
2323
{
2424
var logger = _serviceProvider.GetRequiredService<EasyWayLogger<TModule>>();
2525

26-
//TODO begin scope (correlation Id)
26+
//TODO begin scope (correlation Id, userId)
2727

2828
logger.Executing(command);
2929

3030
try
3131
{
3232
var result = await _decoratedCommandExecutor.Execute<TModule, TCommand>(command, cancellationToken);
3333

34-
logger.Executed();
34+
switch (result.Error)
35+
{
36+
case CommandErrorEnum.None: logger.Successed(); break;
37+
case CommandErrorEnum.Validation: logger.Validation(result.ValidationErrors); break;
38+
case CommandErrorEnum.BrokenBusinessRule: logger.BrokenBusinessRule(result.BrokenBusinessRuleException.BrokenBusinessRule); break;
39+
case CommandErrorEnum.ConcurrencyConflict: logger.ConcurrencyConflict(result.Exception); break;
40+
case CommandErrorEnum.OperationCanceled: logger.OperationCanceled(); break;
41+
case CommandErrorEnum.NotFound: logger.NotFound(); break;
42+
case CommandErrorEnum.Forbidden: logger.Forbidden(); break;
43+
default: logger.UnexpectedException(result.Exception); break;
44+
}
3545

3646
return result;
3747
}
3848
catch (Exception ex)
3949
{
4050
logger.UnexpectedException(ex);
41-
throw;
51+
52+
return CommandResult.UnknownException(ex);
4253
}
4354
}
4455
}

source/EasyWay/Internals/Commands/CommandsWithResult/CommandWithOperationResultExecutorLoggerDecorator.cs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
namespace EasyWay.Internals.Commands.CommandsWithResult
1+
using EasyWay.Internals.Queries.Loggers;
2+
using Microsoft.Extensions.DependencyInjection;
3+
4+
namespace EasyWay.Internals.Commands.CommandsWithResult
25
{
36
internal sealed class CommandWithOperationResultExecutorLoggerDecorator : ICommandWithOperationResultExecutor
47
{
@@ -14,12 +17,41 @@ public CommandWithOperationResultExecutorLoggerDecorator(
1417
_serviceProvider = serviceProvider;
1518
}
1619

17-
public Task<CommandResult<TOperationResult>> Command<TModule, TCommand, TOperationResult>(TCommand command, CancellationToken cancellationToken = default)
20+
public async Task<CommandResult<TOperationResult>> Command<TModule, TCommand, TOperationResult>(TCommand command, CancellationToken cancellationToken = default)
1821
where TModule : EasyWayModule
1922
where TCommand : Command<TOperationResult>
2023
where TOperationResult : OperationResult
2124
{
22-
return _decoratedCommandExecutor.Command<TModule, TCommand, TOperationResult>(command, cancellationToken);
25+
var logger = _serviceProvider.GetRequiredService<EasyWayLogger<TModule>>();
26+
27+
//TODO begin scope (correlation Id, userId)
28+
29+
logger.Executing(command);
30+
31+
try
32+
{
33+
var result = await _decoratedCommandExecutor.Command<TModule, TCommand, TOperationResult>(command, cancellationToken);
34+
35+
switch (result.Error)
36+
{
37+
case CommandErrorEnum.None: logger.Successed(result.OperationResult); break;
38+
case CommandErrorEnum.Validation: logger.Validation(result.ValidationErrors); break;
39+
case CommandErrorEnum.BrokenBusinessRule: logger.BrokenBusinessRule(result.BrokenBusinessRuleException.BrokenBusinessRule); break;
40+
case CommandErrorEnum.ConcurrencyConflict: logger.ConcurrencyConflict(result.Exception); break;
41+
case CommandErrorEnum.OperationCanceled: logger.OperationCanceled(); break;
42+
case CommandErrorEnum.NotFound: logger.NotFound(); break;
43+
case CommandErrorEnum.Forbidden: logger.Forbidden(); break;
44+
default: logger.UnexpectedException(result.Exception); break;
45+
}
46+
47+
return result;
48+
}
49+
catch (Exception ex)
50+
{
51+
logger.UnexpectedException(ex);
52+
53+
return CommandResult<TOperationResult>.UnknownException(ex);
54+
}
2355
}
2456
}
2557
}
Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.Extensions.Logging;
1+
using EasyWay.Internals.BusinessRules;
2+
using Microsoft.Extensions.Logging;
23

34
namespace EasyWay.Internals.Queries.Loggers
45
{
@@ -9,18 +10,34 @@ internal sealed partial class EasyWayLogger<TModule>
910

1011
public EasyWayLogger(ILogger<TModule> logger) => _logger = logger;
1112

12-
//TODO scope logger CorrelationId (ScopeId)
13-
1413
[LoggerMessage(0, LogLevel.Information, "Executing {@component}", SkipEnabledCheck = true)]
1514
public partial void Executing(object component);
1615

17-
[LoggerMessage(1, LogLevel.Information, "Executed", SkipEnabledCheck = true)]
18-
public partial void Executed();
16+
[LoggerMessage(1, LogLevel.Information, "Successed", SkipEnabledCheck = true)]
17+
public partial void Successed();
18+
19+
[LoggerMessage(2, LogLevel.Information, "Successed: {@result}", SkipEnabledCheck = true)]
20+
public partial void Successed(object result);
21+
22+
[LoggerMessage(3, LogLevel.Information, "Validation error: {@validatonErrors}", SkipEnabledCheck = true)]
23+
public partial void Validation(IDictionary<string, string[]> validatonErrors);
24+
25+
[LoggerMessage(4, LogLevel.Information, "Broken business rule: {@brokenBusinessRule}", SkipEnabledCheck = true)]
26+
public partial void BrokenBusinessRule(BusinessRule brokenBusinessRule);
27+
28+
[LoggerMessage(5, LogLevel.Information, "Not found", SkipEnabledCheck = true)]
29+
public partial void NotFound();
30+
31+
[LoggerMessage(6, LogLevel.Information, "Operation canceled", SkipEnabledCheck = true)]
32+
public partial void OperationCanceled();
33+
34+
[LoggerMessage(7, LogLevel.Warning, "Forbidden", SkipEnabledCheck = true)]
35+
public partial void Forbidden();
1936

20-
[LoggerMessage(2, LogLevel.Information, "Failed", SkipEnabledCheck = true)]
21-
public partial void Failed();
37+
[LoggerMessage(8, LogLevel.Warning, "Concurrency conflict", SkipEnabledCheck = true)]
38+
public partial void ConcurrencyConflict(Exception exception);
2239

23-
[LoggerMessage(3, LogLevel.Error, "Unexpected exception", SkipEnabledCheck = true)]
40+
[LoggerMessage(500, LogLevel.Error, "Unexpected exception", SkipEnabledCheck = true)]
2441
public partial void UnexpectedException(Exception exception);
2542
}
2643
}

source/EasyWay/Internals/Queries/QueryExecutorLoggerDecorator.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using EasyWay.Internals.Queries.Loggers;
2+
using EasyWay.Internals.Queries.Results;
23
using Microsoft.Extensions.DependencyInjection;
34

45
namespace EasyWay.Internals.Queries
@@ -24,23 +25,32 @@ public async Task<QueryResult<TReadModel>> Execute<TModule, TQuery, TReadModel>(
2425
{
2526
var logger = _serviceProvider.GetRequiredService<EasyWayLogger<TModule>>();
2627

27-
//TODO begin scope (correlation Id)
28+
//TODO begin scope (correlation Id, userId)
2829

2930
logger.Executing(query);
3031

3132
try
3233
{
3334
var result = await _decoratedQueryExecutor.Execute<TModule, TQuery, TReadModel>(query, cancellationToken);
3435

35-
logger.Executed();
36+
switch (result.Error)
37+
{
38+
case QueryErrorEnum.None: logger.Successed(result.ReadModel); break;
39+
case QueryErrorEnum.Validation: logger.Validation(result.ValidationErrors); break;
40+
case QueryErrorEnum.OperationCanceled: logger.OperationCanceled(); break;
41+
case QueryErrorEnum.NotFound: logger.NotFound(); break;
42+
case QueryErrorEnum.Forbidden: logger.Forbidden(); break;
43+
default: logger.UnexpectedException(result.Exception); break;
44+
}
3645

3746
return result;
3847
}
3948
catch (Exception ex)
4049
{
4150
logger.UnexpectedException(ex);
42-
throw;
43-
}
51+
52+
return QueryResult<TReadModel>.UnknownException(ex);
53+
}
4454
}
4555
}
4656
}

0 commit comments

Comments
 (0)