The detailed guidelines could be found at here: Section 4.11 [DD160 - Programming guidelines](https://goto.netcompany.com/cases/GTE711/FINSCHAT/Deliverables/DD160%20-%20Programming%20Guidelines/DD160%20-%20Programming%20Guidelines%20Schatkistbankieren.docx)
---
**Some common suggestions:**
1. The log content should be cleared
```csharp
// instead
logger.LogInformation("Changing execute status started");
// do this
logger.LogInformation("Changing execute status for activity id {ActivityId} to {ExecuteStatus} started", request.ActivityId, request.ExecuteStatus);
```
---
2. The entry/exiting logs should sync to each other (according to guideline)
```csharp
logger.LogInformation("Creating accounting period {PeriodNumber} started", request.Period
;
....
await unitOfWork.SaveChangesAsync(cancellationToken);
logger.LogDebug("New AccoutingPeriod with period number {PeriodNumber} was created with id {AccoutingPeriodId}", addedEntity.PeriodNumber, addedEntity.Id);
....
logger.LogInformation("Creating accounting period {PeriodNumber} succedded. Result: {@Result}", request.PeriodNumber, result);
```
---
3. The exiting log should contain the method's return value if possible and not sensitive
```csharp
logger.LogInformation("Creating accounting period {PeriodNumber} succedded. Result: {@Result}", request.PeriodNumber, result);
```
---
4. LogWarning should happen before Exception
```csharp
logger.LogWarning("Account with number {AccountNumber} was already existed", accountNumber);
throw new ValidationException(.....);
```
---
5. Almost if/else, switch/case or other kind of branching should be covered with LogDebug/Trace
```csharp
if (existedAccount != null)
{
logger.LogDebug("Account with number {AccountNumber} was already existed, updating", existedAccount.AccountNumber);
}
else
{
logger.LogDebug("Creating new account with number {AccountNumber}", request.AccountNumber);
....
logger.LogDebug("New TreasuryAccount with number {AccountNumber} was created with entity id {TreasuryAccountEntityId}", createdTreasuryAccount.EntityId);
}
//
MappedMutationType result;
switch (mutationType)
{
case MutationType.B:
{
result = MappedMutationType.B;
break;
}
case MutationType.MEM:
{
result = MappedMutationType.MEM;
break;
}
default:
{
logger.LogWarning("Unsupported mutation type {UnsupportedMutationType}", mutationType);
throw new NotSupportedException(...);
}
}
logger.LogTrace("Mutation type {MutationType}", mutationType);
logger.LogTrace("Mapped mutation type {MutationType}", result);
```
---
6. LogTrace some value used for calculation or some variable can significantly change the action/result behavior, especially complex calculation handler
```csharp
var eodBalance = previousBalance + totalCredit - totalDebit;
logger.LogTrace("EOD calculation - previous balance: {PreviousBalance}", previousBalance);
logger.LogTrace("EOD calculation - total credit: {TotalCredit}", totalCredit);
logger.LogTrace("EOD calculation - total debit: {TotalDebit}", totalDebit);
logger.LogTrace("EOD calculation: {EodBalance}", eodBalance);
```
---
7. Log some information assisting in debugging condition expression, don't hesitate to change the code a bit, valuable log content is important
```csharp
var requestedCaseIds = ...;
var foundCaseIds = ...;
var notFoundCaseIds = requestedCaseIds.Except(foundCaseIds);
if (notFoundCaseIds.Any())
{
log.LogDebug/Warning("Could not found these case id {@NotFoundCaseIds}", notFoundCaseIds);
....
}
```
---
8. LogDebug some changing in database, such as new entity was added (which what id), such as removed entity (and which ids were removed)