Skip to content

Commit 74e3f96

Browse files
Add strongly typed logging for Identity service projects
Co-authored-by: christiannagel <[email protected]>
1 parent 9ec9926 commit 74e3f96

File tree

5 files changed

+109
-14
lines changed

5 files changed

+109
-14
lines changed

src/Directory.Packages.props

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,17 @@
7878
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.9" />
7979
<PackageVersion Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="8.4.0" />
8080
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="9.0.9" />
81+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.3" Condition="'$(TargetFramework)' == 'net8.0'" />
82+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.9" Condition="'$(TargetFramework)' == 'net9.0'" />
8183
<PackageVersion Include="Microsoft.Extensions.Diagnostics.Testing" Version="9.9.0" />
8284
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.9" />
8385
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.9" />
8486
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="9.9.0" />
8587
<PackageVersion Include="Microsoft.Extensions.Localization" Version="9.0.9" />
8688
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.3" Condition="'$(TargetFramework)' == 'net8.0'" />
8789
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.9" Condition="'$(TargetFramework)' == 'net9.0'" />
90+
<PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.3" Condition="'$(TargetFramework)' == 'net8.0'" />
91+
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.9" Condition="'$(TargetFramework)' == 'net9.0'" />
8892
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="9.5.0" />
8993
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery.Yarp" Version="9.5.0" />
9094
<!-- Microsoft UI and Identity packages -->
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using Microsoft.Extensions.Logging;
2+
3+
namespace Codebreaker.Identity.Tests.Extensions;
4+
5+
public static partial class LoggerExtensions
6+
{
7+
[LoggerMessage(
8+
EventId = 35001,
9+
Level = LogLevel.Information,
10+
Message = "Creating mock anonymous user: {UserName}")]
11+
public static partial void CreatingMockAnonymousUser(this ILogger logger, string userName);
12+
13+
[LoggerMessage(
14+
EventId = 35002,
15+
Level = LogLevel.Information,
16+
Message = "Deleting stale anonymous users")]
17+
public static partial void DeletingStaleAnonymousUsers(this ILogger logger);
18+
19+
[LoggerMessage(
20+
EventId = 35003,
21+
Level = LogLevel.Information,
22+
Message = "Deleted {Count} stale anonymous users")]
23+
public static partial void DeletedStaleAnonymousUsers(this ILogger logger, int count);
24+
25+
[LoggerMessage(
26+
EventId = 35004,
27+
Level = LogLevel.Information,
28+
Message = "Promoting mock anonymous user: {UserId}")]
29+
public static partial void PromotingMockAnonymousUser(this ILogger logger, string userId);
30+
}

src/services/identity/Codebreaker.Identity.Tests/MockAnonymousUserService.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Codebreaker.Identity.Models;
22
using Codebreaker.Identity.Services;
3+
using Codebreaker.Identity.Tests.Extensions;
34
using Microsoft.Extensions.Logging;
45

56
namespace Codebreaker.Identity.Tests;
@@ -24,7 +25,7 @@ public MockAnonymousUserService(ILogger<MockAnonymousUserService> logger)
2425
/// <inheritdoc />
2526
public Task<AnonymousUser> CreateAnonUser(string userName)
2627
{
27-
_logger.LogInformation("Creating mock anonymous user: {UserName}", userName);
28+
_logger.CreatingMockAnonymousUser(userName);
2829

2930
var user = new AnonymousUser
3031
{
@@ -43,22 +44,22 @@ public Task<AnonymousUser> CreateAnonUser(string userName)
4344
/// <inheritdoc />
4445
public Task<int> DeleteAnonUsers()
4546
{
46-
_logger.LogInformation("Deleting stale anonymous users");
47+
_logger.DeletingStaleAnonymousUsers();
4748

4849
// Delete users older than 3 months
4950
DateTimeOffset cutoffDate = DateTimeOffset.UtcNow.AddMonths(-3);
5051
int count = _users.RemoveAll(u =>
5152
(u.LastLoginAt == null && u.CreatedAt < cutoffDate) ||
5253
(u.LastLoginAt != null && u.LastLoginAt < cutoffDate));
5354

54-
_logger.LogInformation("Deleted {Count} stale anonymous users", count);
55+
_logger.DeletedStaleAnonymousUsers(count);
5556
return Task.FromResult(count);
5657
}
5758

5859
/// <inheritdoc />
5960
public Task<AnonymousUser> PromoteAnonUser(string anonymousUserId, string email, string displayName, string password)
6061
{
61-
_logger.LogInformation("Promoting mock anonymous user: {UserId}", anonymousUserId);
62+
_logger.PromotingMockAnonymousUser(anonymousUserId);
6263

6364
var user = _users.FirstOrDefault(u => u.Id == anonymousUserId);
6465
if (user == null)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using Microsoft.Extensions.Logging;
2+
3+
namespace Codebreaker.Identity.Extensions;
4+
5+
public static partial class LoggerExtensions
6+
{
7+
[LoggerMessage(
8+
EventId = 30001,
9+
Level = LogLevel.Information,
10+
Message = "Creating anonymous user with name {UserName}")]
11+
public static partial void CreatingAnonymousUser(this ILogger logger, string userName);
12+
13+
[LoggerMessage(
14+
EventId = 30002,
15+
Level = LogLevel.Error,
16+
Message = "Failed to create anonymous user {UserName}: {Message}")]
17+
public static partial void FailedToCreateAnonymousUser(this ILogger logger, Exception ex, string userName, string message);
18+
19+
[LoggerMessage(
20+
EventId = 30003,
21+
Level = LogLevel.Information,
22+
Message = "Deleting anonymous users that haven't logged in for at least three months")]
23+
public static partial void DeletingStaleAnonymousUsers(this ILogger logger);
24+
25+
[LoggerMessage(
26+
EventId = 30004,
27+
Level = LogLevel.Information,
28+
Message = "No anonymous users found")]
29+
public static partial void NoAnonymousUsersFound(this ILogger logger);
30+
31+
[LoggerMessage(
32+
EventId = 30005,
33+
Level = LogLevel.Information,
34+
Message = "Deleted anonymous user: {UserId}, {DisplayName}")]
35+
public static partial void DeletedAnonymousUser(this ILogger logger, string userId, string? displayName);
36+
37+
[LoggerMessage(
38+
EventId = 30006,
39+
Level = LogLevel.Information,
40+
Message = "Deleted {Count} anonymous users")]
41+
public static partial void DeletedAnonymousUsers(this ILogger logger, int count);
42+
43+
[LoggerMessage(
44+
EventId = 30007,
45+
Level = LogLevel.Error,
46+
Message = "Failed to delete anonymous users: {Message}")]
47+
public static partial void FailedToDeleteAnonymousUsers(this ILogger logger, Exception ex, string message);
48+
49+
[LoggerMessage(
50+
EventId = 30008,
51+
Level = LogLevel.Information,
52+
Message = "Promoting anonymous user {UserId} to registered user")]
53+
public static partial void PromotingAnonymousUser(this ILogger logger, string userId);
54+
55+
[LoggerMessage(
56+
EventId = 30009,
57+
Level = LogLevel.Error,
58+
Message = "Failed to promote anonymous user {UserId}: {Message}")]
59+
public static partial void FailedToPromoteAnonymousUser(this ILogger logger, Exception ex, string userId, string message);
60+
}

src/services/identity/Codebreaker.Identity/Services/GraphAnonymousUserService.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Azure.Identity;
22
using Codebreaker.Identity.Configuration;
3+
using Codebreaker.Identity.Extensions;
34
using Codebreaker.Identity.Models;
45
using Microsoft.Extensions.Logging;
56
using Microsoft.Extensions.Options;
@@ -42,7 +43,7 @@ public GraphAnonymousUserService(
4243
/// <inheritdoc />
4344
public async Task<AnonymousUser> CreateAnonUser(string userName)
4445
{
45-
_logger.LogInformation("Creating anonymous user with name {UserName}", userName);
46+
_logger.CreatingAnonymousUser(userName);
4647

4748
// Generate a secure random password
4849
string password = GenerateSecurePassword(_options.PasswordLength);
@@ -99,15 +100,15 @@ await _graphClient.Users[createdUser.Id].PatchAsync(new User
99100
}
100101
catch (Exception ex)
101102
{
102-
_logger.LogError(ex, "Failed to create anonymous user {UserName}: {Message}", userName, ex.Message);
103+
_logger.FailedToCreateAnonymousUser(ex, userName, ex.Message);
103104
throw;
104105
}
105106
}
106107

107108
/// <inheritdoc />
108109
public async Task<int> DeleteAnonUsers()
109110
{
110-
_logger.LogInformation("Deleting anonymous users that haven't logged in for at least three months");
111+
_logger.DeletingStaleAnonymousUsers();
111112

112113
try
113114
{
@@ -125,7 +126,7 @@ public async Task<int> DeleteAnonUsers()
125126

126127
if (usersToDelete?.Value == null)
127128
{
128-
_logger.LogInformation("No anonymous users found");
129+
_logger.NoAnonymousUsersFound();
129130
return 0;
130131
}
131132

@@ -163,24 +164,23 @@ createdAtObj is string createdAtStr &&
163164
await _graphClient.Users[user.Id].DeleteAsync();
164165
deletedCount++;
165166

166-
_logger.LogInformation("Deleted anonymous user: {UserId}, {DisplayName}",
167-
user.Id, user.DisplayName);
167+
_logger.DeletedAnonymousUser(user.Id, user.DisplayName);
168168
}
169169

170-
_logger.LogInformation("Deleted {Count} anonymous users", deletedCount);
170+
_logger.DeletedAnonymousUsers(deletedCount);
171171
return deletedCount;
172172
}
173173
catch (Exception ex)
174174
{
175-
_logger.LogError(ex, "Failed to delete anonymous users: {Message}", ex.Message);
175+
_logger.FailedToDeleteAnonymousUsers(ex, ex.Message);
176176
throw;
177177
}
178178
}
179179

180180
/// <inheritdoc />
181181
public async Task<AnonymousUser> PromoteAnonUser(string anonymousUserId, string email, string displayName, string password)
182182
{
183-
_logger.LogInformation("Promoting anonymous user {UserId} to registered user", anonymousUserId);
183+
_logger.PromotingAnonymousUser(anonymousUserId);
184184

185185
try
186186
{
@@ -245,7 +245,7 @@ await _graphClient.Users[anonymousUserId].PatchAsync(new User
245245
}
246246
catch (Exception ex)
247247
{
248-
_logger.LogError(ex, "Failed to promote anonymous user {UserId}: {Message}", anonymousUserId, ex.Message);
248+
_logger.FailedToPromoteAnonymousUser(ex, anonymousUserId, ex.Message);
249249
throw;
250250
}
251251
}

0 commit comments

Comments
 (0)