-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVerifyMultipleLoggersDemo.cs
More file actions
272 lines (228 loc) · 8.48 KB
/
VerifyMultipleLoggersDemo.cs
File metadata and controls
272 lines (228 loc) · 8.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Open.Logging.Extensions.FileSystem;
using Open.Logging.Extensions.Memory;
namespace Open.Logging.Verification;
/// <summary>
/// Verification program to test that multiple loggers work as documented.
/// This tests the exact scenarios from MULTIPLE_LOGGERS_GUIDE.md
/// </summary>
internal static class VerifyMultipleLoggersDemo
{
public static async Task Main(string[] args)
{
Console.WriteLine("=== Verifying Multiple Loggers Scenario ===");
Console.WriteLine();
await TestSimpleMultipleLoggersRegistration();
Console.WriteLine();
await TestConfigurationBasedSetup();
Console.WriteLine();
await TestDifferentLogLevelsPerProvider();
Console.WriteLine();
Console.WriteLine("=== All Tests Completed Successfully! ===");
}
/// <summary>
/// Test the "Simple Multiple Loggers Registration" example from the guide
/// </summary>
private static async Task TestSimpleMultipleLoggersRegistration()
{
Console.WriteLine("🧪 Testing: Simple Multiple Loggers Registration");
var services = new ServiceCollection();
var tempDir = Path.Combine(Path.GetTempPath(), "OpenLoggingTest", Guid.NewGuid().ToString());
Directory.CreateDirectory(tempDir);
try
{
services.AddLogging(builder =>
{
builder.ClearProviders(); // Remove default providers
// Add File Logger
builder.AddFileLogger(options =>
{
options.LogDirectory = tempDir;
options.FileNamePattern = "app-{Timestamp:yyyy-MM-dd}.log";
options.MinLogLevel = LogLevel.Information;
});
// Add Memory Logger
builder.AddMemoryLogger(options =>
{
options.MaxCapacity = 1000;
options.MinLogLevel = LogLevel.Debug;
});
});
using var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetRequiredService<ILogger<VerifyMultipleLoggersDemo>>();
var memoryProvider = serviceProvider.GetRequiredService<IMemoryLoggerProvider>();
// Both loggers will receive these logs
logger.LogDebug("Debug message - only in memory");
logger.LogInformation("Info message - in both file and memory");
logger.LogError("Error message - in both file and memory");
// Give file logger time to write
await Task.Delay(100);
} // Dispose to flush logs
// Verify memory logs
using var verifyServiceProvider = services.BuildServiceProvider();
var verifyMemoryProvider = verifyServiceProvider.GetRequiredService<IMemoryLoggerProvider>();
var memoryLogs = verifyMemoryProvider.Snapshot();
Console.WriteLine($"✅ Memory Logger captured {memoryLogs.Count} entries:");
foreach (var log in memoryLogs)
{
Console.WriteLine($" 📝 {log.Level}: {log.Message}");
}
// Verify file logs
var logFiles = Directory.GetFiles(tempDir, "*.log");
if (logFiles.Length > 0)
{
var fileContent = await File.ReadAllTextAsync(logFiles[0]);
var lines = fileContent.Split('\n', StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine($"✅ File Logger wrote {lines.Length} entries:");
foreach (var line in lines)
{
Console.WriteLine($" 📄 {line.Trim()}");
}
}
else
{
Console.WriteLine("❌ No log files found");
}
// Cleanup
Directory.Delete(tempDir, true);
}
/// <summary>
/// Test the "Configuration-Based Setup" example from the guide
/// </summary>
private static async Task TestConfigurationBasedSetup()
{
Console.WriteLine("🧪 Testing: Configuration-Based Setup");
var tempDir = Path.Combine(Path.GetTempPath(), "OpenLoggingConfigTest", Guid.NewGuid().ToString());
Directory.CreateDirectory(tempDir);
try
{
// Setup configuration
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string?>
{
["Logging:LogLevel:Default"] = "Information",
// File Logger Configuration
["Logging:File:LogLevel:Default"] = "Information",
["Logging:File:Directory"] = tempDir,
["Logging:File:FileNamePattern"] = "app-{Timestamp:yyyy-MM-dd}.log",
["Logging:File:Template"] = "[{Timestamp:yyyy-MM-dd HH:mm:ss}] {Level}: {Message}",
// Memory Logger Configuration
["Logging:Memory:LogLevel:Default"] = "Debug",
["Logging:Memory:MaxCapacity"] = "1000",
["Logging:Memory:Template"] = "{Timestamp:HH:mm:ss} [{Level}] {Category}: {Message}"
})
.Build();
var services = new ServiceCollection();
services.AddSingleton<IConfiguration>(configuration);
services.AddLogging(builder =>
{
builder.ClearProviders();
builder.AddConfiguration(configuration.GetSection("Logging"));
builder.SetMinimumLevel(LogLevel.Debug); // Allow all levels
builder.AddFileLogger(); // Uses "Logging:File" section
builder.AddMemoryLogger(); // Uses "Logging:Memory" section
});
using var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetRequiredService<ILogger<VerifyMultipleLoggersDemo>>();
var memoryProvider = serviceProvider.GetRequiredService<IMemoryLoggerProvider>();
// Log messages
logger.LogDebug("Debug config message");
logger.LogInformation("Info config message");
logger.LogWarning("Warning config message");
// Give file logger time to write
await Task.Delay(100);
// Check memory logs immediately
var memoryLogs = memoryProvider.Snapshot();
Console.WriteLine($"✅ Memory Logger (Config) captured {memoryLogs.Count} entries:");
foreach (var log in memoryLogs)
{
Console.WriteLine($" 📝 {log.Level}: {log.Message}");
}
} // Dispose to flush logs
// Verify file logs after disposal
var logFiles = Directory.GetFiles(tempDir, "*.log");
if (logFiles.Length > 0)
{
var fileContent = await File.ReadAllTextAsync(logFiles[0]);
var lines = fileContent.Split('\n', StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine($"✅ File Logger (Config) wrote {lines.Length} entries:");
foreach (var line in lines)
{
Console.WriteLine($" 📄 {line.Trim()}");
}
}
else
{
Console.WriteLine("❌ No log files found");
}
// Cleanup
Directory.Delete(tempDir, true);
}
/// <summary>
/// Test the "Different Log Levels per Provider" example from the guide
/// </summary>
private static async Task TestDifferentLogLevelsPerProvider()
{
Console.WriteLine("🧪 Testing: Different Log Levels per Provider");
var tempDir = Path.Combine(Path.GetTempPath(), "OpenLoggingLevelsTest", Guid.NewGuid().ToString());
Directory.CreateDirectory(tempDir);
try
{
var services = new ServiceCollection();
services.AddLogging(builder =>
{
builder.ClearProviders();
// File logger - only warnings and errors
builder.AddFileLogger(options =>
{
options.LogDirectory = tempDir;
options.FileNamePattern = "errors-{Timestamp:yyyy-MM-dd}.log";
options.MinLogLevel = LogLevel.Warning;
});
// Memory logger - all levels for debugging
builder.AddMemoryLogger(options =>
{
options.MaxCapacity = 5000;
options.MinLogLevel = LogLevel.Debug;
});
});
using var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetRequiredService<ILogger<VerifyMultipleLoggersDemo>>();
var memoryProvider = serviceProvider.GetRequiredService<IMemoryLoggerProvider>();
// Log at different levels
logger.LogDebug("Debug level message"); // Only in memory
logger.LogInformation("Info level message"); // Only in memory
logger.LogWarning("Warning level message"); // In both
logger.LogError("Error level message"); // In both
// Give file logger time to write
await Task.Delay(100);
// Check memory logs
var memoryLogs = memoryProvider.Snapshot();
Console.WriteLine($"✅ Memory Logger (All Levels) captured {memoryLogs.Count} entries:");
foreach (var log in memoryLogs)
{
Console.WriteLine($" 📝 {log.Level}: {log.Message}");
}
} // Dispose to flush logs
// Verify file logs (should only have Warning and Error)
var logFiles = Directory.GetFiles(tempDir, "*.log");
if (logFiles.Length > 0)
{
var fileContent = await File.ReadAllTextAsync(logFiles[0]);
var lines = fileContent.Split('\n', StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine($"✅ File Logger (Warning+) wrote {lines.Length} entries:");
foreach (var line in lines)
{
Console.WriteLine($" 📄 {line.Trim()}");
}
}
else
{
Console.WriteLine("❌ No log files found");
}
// Cleanup
Directory.Delete(tempDir, true);
}
}