GFramework/GFramework.Core.Tests/logging/LoggingConfigurationTests.cs
GeWuYou abdf4cc690 test(logging): 添加日志系统单元测试
- 为 AsyncLogAppender 添加完整功能测试,包括异步写入、缓冲区管理、并发处理等场景
- 为 CachedLoggerFactory 添加缓存机制测试,验证相同名称和级别的日志记录器重用
- 为 CompositeFilter 添加过滤器组合测试,验证多个过滤器的逻辑组合功能
- 为 CompositeLogger 添加复合日志记录器测试,验证多追加器写入和级别过滤功能
- 为 ConsoleAppender 添加控制台追加器测试,验证格式化输出和过滤器支持
- 为 DefaultLogFormatter 添加默认格式化器测试,验证基本格式化和异常处理功能
- 为 FileAppender 添加文件追加器测试,验证文件写入、目录创建和追加模式功能
- 为 JsonLogFormatter 添加 JSON 格式化器测试,验证 JSON 输出和属性序列化功能
- 为 LogContext 添加日志上下文测试,验证属性推送和作用域管理功能
2026-02-26 19:57:42 +08:00

299 lines
9.3 KiB
C#

using System.IO;
using System.Text.Json;
using GFramework.Core.Abstractions.logging;
using GFramework.Core.logging;
using NUnit.Framework;
namespace GFramework.Core.Tests.logging;
/// <summary>
/// 测试 LoggingConfiguration 和 LoggingConfigurationLoader 的功能和行为
/// </summary>
[TestFixture]
public class LoggingConfigurationTests
{
[Test]
public void LoadFromJsonString_WithValidJson_ShouldDeserialize()
{
var json = @"{
""minLevel"": ""Debug"",
""appenders"": [
{
""type"": ""Console"",
""formatter"": ""Default"",
""useColors"": true
}
],
""loggerLevels"": {
""GFramework.Core"": ""Trace"",
""MyApp"": ""Info""
}
}";
var config = LoggingConfigurationLoader.LoadFromJsonString(json);
Assert.That(config.MinLevel, Is.EqualTo(LogLevel.Debug));
Assert.That(config.Appenders.Count, Is.EqualTo(1));
Assert.That(config.Appenders[0].Type, Is.EqualTo("Console"));
Assert.That(config.LoggerLevels.Count, Is.EqualTo(2));
Assert.That(config.LoggerLevels["GFramework.Core"], Is.EqualTo(LogLevel.Trace));
}
[Test]
public void LoadFromJsonString_WithInvalidJson_ShouldThrow()
{
var invalidJson = "{ invalid json }";
Assert.Throws<JsonException>(() => LoggingConfigurationLoader.LoadFromJsonString(invalidJson));
}
[Test]
public void CreateFactory_WithConsoleAppender_ShouldCreateFactory()
{
var json = @"{
""minLevel"": ""Info"",
""appenders"": [
{
""type"": ""Console"",
""formatter"": ""Default"",
""useColors"": false
}
]
}";
var config = LoggingConfigurationLoader.LoadFromJsonString(json);
var factory = LoggingConfigurationLoader.CreateFactory(config);
Assert.That(factory, Is.Not.Null);
var logger = factory.GetLogger("TestLogger");
Assert.That(logger, Is.Not.Null);
Assert.That(logger.Name(), Is.EqualTo("TestLogger"));
}
[Test]
public void CreateFactory_WithFileAppender_ShouldCreateFactory()
{
var testFile = Path.Combine(Path.GetTempPath(), $"test_{Guid.NewGuid()}.log");
try
{
var json = $@"{{
""minLevel"": ""Info"",
""appenders"": [
{{
""type"": ""File"",
""filePath"": ""{testFile.Replace("\\", "\\\\")}"",
""formatter"": ""Json""
}}
]
}}";
var config = LoggingConfigurationLoader.LoadFromJsonString(json);
var factory = LoggingConfigurationLoader.CreateFactory(config);
var logger = factory.GetLogger("TestLogger");
logger.Info("Test message");
// 验证文件是否创建
Assert.That(File.Exists(testFile), Is.True);
}
finally
{
if (File.Exists(testFile))
{
try
{
File.Delete(testFile);
}
catch
{
}
}
}
}
[Test]
public void CreateFactory_WithLoggerLevels_ShouldApplyCorrectLevels()
{
var json = @"{
""minLevel"": ""Info"",
""appenders"": [
{
""type"": ""Console"",
""formatter"": ""Default""
}
],
""loggerLevels"": {
""GFramework.Core"": ""Trace"",
""MyApp"": ""Warning""
}
}";
var config = LoggingConfigurationLoader.LoadFromJsonString(json);
var factory = LoggingConfigurationLoader.CreateFactory(config);
var logger1 = factory.GetLogger("GFramework.Core.Test");
var logger2 = factory.GetLogger("MyApp.Controllers");
var logger3 = factory.GetLogger("OtherNamespace");
Assert.That(logger1.IsTraceEnabled(), Is.True);
Assert.That(logger2.IsTraceEnabled(), Is.False);
Assert.That(logger2.IsWarnEnabled(), Is.True);
Assert.That(logger3.IsInfoEnabled(), Is.True);
}
[Test]
public void CreateFactory_WithInvalidAppenderType_ShouldThrowException()
{
var json = @"{
""minLevel"": ""Info"",
""appenders"": [
{
""type"": ""UnsupportedType"",
""formatter"": ""Default""
}
]
}";
var config = LoggingConfigurationLoader.LoadFromJsonString(json);
Assert.Throws<NotSupportedException>(() => LoggingConfigurationLoader.CreateFactory(config));
}
[Test]
public void CreateFactory_WithLogLevelFilter_ShouldApplyFilter()
{
var testFile = Path.Combine(Path.GetTempPath(), $"test_{Guid.NewGuid()}.log");
try
{
var json = $@"{{
""minLevel"": ""Info"",
""appenders"": [
{{
""type"": ""File"",
""filePath"": ""{testFile.Replace("\\", "\\\\")}"",
""formatter"": ""Default"",
""filter"": {{
""type"": ""LogLevel"",
""minLevel"": ""Warning""
}}
}}
]
}}";
var config = LoggingConfigurationLoader.LoadFromJsonString(json);
var factory = LoggingConfigurationLoader.CreateFactory(config);
var logger = factory.GetLogger("TestLogger");
logger.Info("Info message");
logger.Warn("Warning message");
// 只有 Warning 应该被写入
var content = File.ReadAllText(testFile);
Assert.That(content, Does.Not.Contain("Info message"));
Assert.That(content, Does.Contain("Warning message"));
}
finally
{
if (File.Exists(testFile))
{
try
{
File.Delete(testFile);
}
catch
{
}
}
}
}
[Test]
public void CreateFactory_WithNamespaceFilter_ShouldApplyFilter()
{
var testFile = Path.Combine(Path.GetTempPath(), $"test_{Guid.NewGuid()}.log");
try
{
var json = $@"{{
""minLevel"": ""Info"",
""appenders"": [
{{
""type"": ""File"",
""filePath"": ""{testFile.Replace("\\", "\\\\")}"",
""formatter"": ""Default"",
""filter"": {{
""type"": ""Namespace"",
""namespaces"": [""GFramework""]
}}
}}
]
}}";
var config = LoggingConfigurationLoader.LoadFromJsonString(json);
Assert.That(config.Appenders[0].Filter, Is.Not.Null);
Assert.That(config.Appenders[0].Filter.Type, Is.EqualTo("Namespace"));
}
finally
{
if (File.Exists(testFile))
{
try
{
File.Delete(testFile);
}
catch
{
}
}
}
}
[Test]
public void LoadFromJsonString_WithComplexConfiguration_ShouldWork()
{
var json = @"{
""minLevel"": ""Info"",
""appenders"": [
{
""type"": ""Console"",
""formatter"": ""Default"",
""useColors"": true
},
{
""type"": ""File"",
""filePath"": ""logs/app.log"",
""formatter"": ""Json"",
""filter"": {
""type"": ""LogLevel"",
""minLevel"": ""Warning""
}
},
{
""type"": ""RollingFile"",
""filePath"": ""logs/rolling.log"",
""formatter"": ""Default"",
""maxFileSize"": 10485760,
""maxFileCount"": 5
}
],
""loggerLevels"": {
""GFramework.Core"": ""Debug"",
""MyApp.Controllers"": ""Info"",
""MyApp.Services"": ""Warning""
}
}";
var config = LoggingConfigurationLoader.LoadFromJsonString(json);
Assert.That(config.MinLevel, Is.EqualTo(LogLevel.Info));
Assert.That(config.Appenders.Count, Is.EqualTo(3));
Assert.That(config.Appenders[0].Type, Is.EqualTo("Console"));
Assert.That(config.Appenders[1].Type, Is.EqualTo("File"));
Assert.That(config.Appenders[1].Filter, Is.Not.Null);
Assert.That(config.Appenders[2].Type, Is.EqualTo("RollingFile"));
Assert.That(config.Appenders[2].MaxFileSize, Is.EqualTo(10485760));
Assert.That(config.LoggerLevels.Count, Is.EqualTo(3));
}
}