From 7d0e5931d11b83c6a783a5108a13653f98a2f616 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Thu, 26 Feb 2026 19:28:09 +0800 Subject: [PATCH] =?UTF-8?q?refactor(logging):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=B3=BB=E7=BB=9F=E7=9A=84=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=88=B3=E5=92=8C=E4=BB=A3=E7=A0=81=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将时间戳从本地时间改为UTC时间以提高一致性 - 使用ToUpperInvariant替代ToUpper提高文化区域安全性 - 简化LogContext中的空值检查逻辑 - 重构CompositeDisposable类以使用主构造函数语法 - 更新测试代码中的时间戳处理方式 --- .../logging/LogContext.cs | 15 ++++---------- .../logging/AsyncLogAppenderTests.cs | 20 +++++++++---------- GFramework.Core/logging/CompositeLogger.cs | 6 +++--- .../logging/formatters/JsonLogFormatter.cs | 2 +- 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/GFramework.Core.Abstractions/logging/LogContext.cs b/GFramework.Core.Abstractions/logging/LogContext.cs index 0f54d16..6effb1d 100644 --- a/GFramework.Core.Abstractions/logging/LogContext.cs +++ b/GFramework.Core.Abstractions/logging/LogContext.cs @@ -15,7 +15,7 @@ public sealed class LogContext : IDisposable _key = key; var current = _context.Value; - if (current != null && current.TryGetValue(key, out var prev)) + if (current?.TryGetValue(key, out var prev) == true) { _previousValue = prev; _hadPreviousValue = true; @@ -103,21 +103,14 @@ public sealed class LogContext : IDisposable /// /// 组合多个可释放对象 /// - private sealed class CompositeDisposable : IDisposable + private sealed class CompositeDisposable(IDisposable[] disposables) : IDisposable { - private readonly IDisposable[] _disposables; - - public CompositeDisposable(IDisposable[] disposables) - { - _disposables = disposables; - } - public void Dispose() { // 按相反顺序释放 - for (int i = _disposables.Length - 1; i >= 0; i--) + for (int i = disposables.Length - 1; i >= 0; i--) { - _disposables[i].Dispose(); + disposables[i].Dispose(); } } } diff --git a/GFramework.Core.Tests/logging/AsyncLogAppenderTests.cs b/GFramework.Core.Tests/logging/AsyncLogAppenderTests.cs index dab71c7..eb5bd3d 100644 --- a/GFramework.Core.Tests/logging/AsyncLogAppenderTests.cs +++ b/GFramework.Core.Tests/logging/AsyncLogAppenderTests.cs @@ -30,14 +30,14 @@ public class AsyncLogAppenderTests var innerAppender = new SlowAppender(delayMs: 100); using var asyncAppender = new AsyncLogAppender(innerAppender, bufferSize: 1000); - var startTime = DateTime.Now; + var startTime = DateTime.UtcNow; for (int i = 0; i < 10; i++) { - var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", $"Message {i}", null, null); + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", $"Message {i}", null, null); asyncAppender.Append(entry); } - var elapsed = (DateTime.Now - startTime).TotalMilliseconds; + var elapsed = (DateTime.UtcNow - startTime).TotalMilliseconds; // 异步写入应该非常快(< 100ms),不应该等待内部 Appender Assert.That(elapsed, Is.LessThan(100)); @@ -51,7 +51,7 @@ public class AsyncLogAppenderTests { for (int i = 0; i < 10; i++) { - var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", $"Message {i}", null, null); + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", $"Message {i}", null, null); asyncAppender.Append(entry); } @@ -69,7 +69,7 @@ public class AsyncLogAppenderTests for (int i = 0; i < 100; i++) { - var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", $"Message {i}", null, null); + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", $"Message {i}", null, null); asyncAppender.Append(entry); } @@ -86,7 +86,7 @@ public class AsyncLogAppenderTests { for (int i = 0; i < 50; i++) { - var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", $"Message {i}", null, null); + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", $"Message {i}", null, null); asyncAppender.Append(entry); } } // Dispose 会等待所有日志处理完成 @@ -101,7 +101,7 @@ public class AsyncLogAppenderTests var asyncAppender = new AsyncLogAppender(innerAppender); asyncAppender.Dispose(); - var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test", null, null); + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test", null, null); Assert.Throws(() => asyncAppender.Append(entry)); } @@ -114,7 +114,7 @@ public class AsyncLogAppenderTests for (int i = 0; i < 10; i++) { - var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", $"Message {i}", null, null); + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", $"Message {i}", null, null); asyncAppender.Append(entry); } @@ -136,7 +136,7 @@ public class AsyncLogAppenderTests { for (int i = 0; i < 100; i++) { - var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", $"Thread {threadId} Message {i}", null, null); asyncAppender.Append(entry); } @@ -160,7 +160,7 @@ public class AsyncLogAppenderTests { for (int i = 0; i < 10; i++) { - var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", $"Message {i}", null, null); + var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", $"Message {i}", null, null); asyncAppender.Append(entry); } }); diff --git a/GFramework.Core/logging/CompositeLogger.cs b/GFramework.Core/logging/CompositeLogger.cs index 06dba6c..253cd80 100644 --- a/GFramework.Core/logging/CompositeLogger.cs +++ b/GFramework.Core/logging/CompositeLogger.cs @@ -50,7 +50,7 @@ public sealed class CompositeLogger : AbstractLogger, IDisposable protected override void Write(LogLevel level, string message, Exception? exception) { var entry = new LogEntry( - DateTime.Now, + DateTime.UtcNow, level, Name(), message, @@ -78,7 +78,7 @@ public sealed class CompositeLogger : AbstractLogger, IDisposable : null; var entry = new LogEntry( - DateTime.Now, + DateTime.UtcNow, level, Name(), message, @@ -108,7 +108,7 @@ public sealed class CompositeLogger : AbstractLogger, IDisposable : null; var entry = new LogEntry( - DateTime.Now, + DateTime.UtcNow, level, Name(), message, diff --git a/GFramework.Core/logging/formatters/JsonLogFormatter.cs b/GFramework.Core/logging/formatters/JsonLogFormatter.cs index 83e6820..407aac7 100644 --- a/GFramework.Core/logging/formatters/JsonLogFormatter.cs +++ b/GFramework.Core/logging/formatters/JsonLogFormatter.cs @@ -24,7 +24,7 @@ public sealed class JsonLogFormatter : ILogFormatter var logObject = new Dictionary { ["timestamp"] = entry.Timestamp.ToString("O"), // ISO 8601 格式 - ["level"] = entry.Level.ToString().ToUpper(), + ["level"] = entry.Level.ToString().ToUpperInvariant(), ["logger"] = entry.LoggerName, ["message"] = entry.Message };