fix(logging): 统一使用UTC时间戳记录日志

- 将所有DateTime.Now替换为DateTime.UtcNow以确保时区一致性
- 修复文档中的时间戳记录方式
- 更新测试代码中的时间戳生成逻辑
- 统一框架各模块的时间记录标准
This commit is contained in:
GeWuYou 2026-02-26 19:36:42 +08:00 committed by gewuyou
parent 7d0e5931d1
commit e94e4890cd
22 changed files with 92 additions and 92 deletions

View File

@ -29,7 +29,7 @@ public class CompositeFilterTests
var filter2 = new NamespaceFilter("GFramework"); var filter2 = new NamespaceFilter("GFramework");
var compositeFilter = new CompositeFilter(filter1, filter2); var compositeFilter = new CompositeFilter(filter1, filter2);
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core", "Test", null, null);
Assert.That(compositeFilter.ShouldLog(entry), Is.True); Assert.That(compositeFilter.ShouldLog(entry), Is.True);
} }
@ -41,7 +41,7 @@ public class CompositeFilterTests
var filter2 = new NamespaceFilter("GFramework"); var filter2 = new NamespaceFilter("GFramework");
var compositeFilter = new CompositeFilter(filter1, filter2); var compositeFilter = new CompositeFilter(filter1, filter2);
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core", "Test", null, null);
Assert.That(compositeFilter.ShouldLog(entry), Is.False); Assert.That(compositeFilter.ShouldLog(entry), Is.False);
} }
@ -53,7 +53,7 @@ public class CompositeFilterTests
var filter2 = new NamespaceFilter("MyApp"); var filter2 = new NamespaceFilter("MyApp");
var compositeFilter = new CompositeFilter(filter1, filter2); var compositeFilter = new CompositeFilter(filter1, filter2);
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core", "Test", null, null);
Assert.That(compositeFilter.ShouldLog(entry), Is.False); Assert.That(compositeFilter.ShouldLog(entry), Is.False);
} }
@ -66,19 +66,19 @@ public class CompositeFilterTests
var compositeFilter = new CompositeFilter(levelFilter, namespaceFilter); var compositeFilter = new CompositeFilter(levelFilter, namespaceFilter);
// 满足所有条件 // 满足所有条件
var entry1 = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core", "Test", null, null); var entry1 = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core", "Test", null, null);
Assert.That(compositeFilter.ShouldLog(entry1), Is.True); Assert.That(compositeFilter.ShouldLog(entry1), Is.True);
// 级别不满足 // 级别不满足
var entry2 = new LogEntry(DateTime.Now, LogLevel.Debug, "GFramework.Core", "Test", null, null); var entry2 = new LogEntry(DateTime.UtcNow, LogLevel.Debug, "GFramework.Core", "Test", null, null);
Assert.That(compositeFilter.ShouldLog(entry2), Is.False); Assert.That(compositeFilter.ShouldLog(entry2), Is.False);
// 命名空间不满足 // 命名空间不满足
var entry3 = new LogEntry(DateTime.Now, LogLevel.Info, "OtherNamespace", "Test", null, null); var entry3 = new LogEntry(DateTime.UtcNow, LogLevel.Info, "OtherNamespace", "Test", null, null);
Assert.That(compositeFilter.ShouldLog(entry3), Is.False); Assert.That(compositeFilter.ShouldLog(entry3), Is.False);
// 都不满足 // 都不满足
var entry4 = new LogEntry(DateTime.Now, LogLevel.Debug, "OtherNamespace", "Test", null, null); var entry4 = new LogEntry(DateTime.UtcNow, LogLevel.Debug, "OtherNamespace", "Test", null, null);
Assert.That(compositeFilter.ShouldLog(entry4), Is.False); Assert.That(compositeFilter.ShouldLog(entry4), Is.False);
} }
@ -93,10 +93,10 @@ public class CompositeFilterTests
var outerComposite = new CompositeFilter(innerComposite, filter3); var outerComposite = new CompositeFilter(innerComposite, filter3);
// 需要同时满足Info 以上 AND GFramework 命名空间 AND Warning 以上 // 需要同时满足Info 以上 AND GFramework 命名空间 AND Warning 以上
var entry1 = new LogEntry(DateTime.Now, LogLevel.Warning, "GFramework.Core", "Test", null, null); var entry1 = new LogEntry(DateTime.UtcNow, LogLevel.Warning, "GFramework.Core", "Test", null, null);
Assert.That(outerComposite.ShouldLog(entry1), Is.True); Assert.That(outerComposite.ShouldLog(entry1), Is.True);
var entry2 = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core", "Test", null, null); var entry2 = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core", "Test", null, null);
Assert.That(outerComposite.ShouldLog(entry2), Is.False); // 不满足 Warning Assert.That(outerComposite.ShouldLog(entry2), Is.False); // 不满足 Warning
} }
} }

View File

@ -39,7 +39,7 @@ public class ConsoleAppenderTests
[Test] [Test]
public void Append_ShouldWriteToWriter() public void Append_ShouldWriteToWriter()
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
_appender.Append(entry); _appender.Append(entry);
@ -54,8 +54,8 @@ public class ConsoleAppenderTests
var filter = new LogLevelFilter(LogLevel.Warning); var filter = new LogLevelFilter(LogLevel.Warning);
var appender = new ConsoleAppender(new DefaultLogFormatter(), _stringWriter, useColors: false, filter: filter); var appender = new ConsoleAppender(new DefaultLogFormatter(), _stringWriter, useColors: false, filter: filter);
var infoEntry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Info message", null, null); var infoEntry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Info message", null, null);
var warningEntry = new LogEntry(DateTime.Now, LogLevel.Warning, "TestLogger", "Warning message", null, null); var warningEntry = new LogEntry(DateTime.UtcNow, LogLevel.Warning, "TestLogger", "Warning message", null, null);
appender.Append(infoEntry); appender.Append(infoEntry);
appender.Append(warningEntry); appender.Append(warningEntry);
@ -70,7 +70,7 @@ public class ConsoleAppenderTests
[Test] [Test]
public void Flush_ShouldFlushWriter() public void Flush_ShouldFlushWriter()
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
_appender.Append(entry); _appender.Append(entry);
_appender.Flush(); _appender.Flush();
@ -82,7 +82,7 @@ public class ConsoleAppenderTests
[Test] [Test]
public void Dispose_ShouldFlushWriter() public void Dispose_ShouldFlushWriter()
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
_appender.Append(entry); _appender.Append(entry);
_appender.Dispose(); _appender.Dispose();
@ -96,7 +96,7 @@ public class ConsoleAppenderTests
{ {
for (int i = 0; i < 10; i++) 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);
_appender.Append(entry); _appender.Append(entry);
} }

View File

@ -36,7 +36,7 @@ public class DefaultLogFormatterTests
public void Format_WithException_ShouldIncludeException() public void Format_WithException_ShouldIncludeException()
{ {
var exception = new InvalidOperationException("Test exception"); var exception = new InvalidOperationException("Test exception");
var entry = new LogEntry(DateTime.Now, LogLevel.Error, "TestLogger", "Error occurred", exception, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Error, "TestLogger", "Error occurred", exception, null);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
@ -53,7 +53,7 @@ public class DefaultLogFormatterTests
["UserId"] = 12345, ["UserId"] = 12345,
["UserName"] = "TestUser" ["UserName"] = "TestUser"
}; };
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "User action", null, properties); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "User action", null, properties);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
@ -70,7 +70,7 @@ public class DefaultLogFormatterTests
{ {
["Key1"] = null ["Key1"] = null
}; };
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, properties); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, properties);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
@ -86,7 +86,7 @@ public class DefaultLogFormatterTests
for (int i = 0; i < levels.Length; i++) for (int i = 0; i < levels.Length; i++)
{ {
var entry = new LogEntry(DateTime.Now, levels[i], "TestLogger", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, levels[i], "TestLogger", "Test", null, null);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
Assert.That(result, Does.Contain(expectedStrings[i])); Assert.That(result, Does.Contain(expectedStrings[i]));
@ -97,7 +97,7 @@ public class DefaultLogFormatterTests
public void Format_WithLongMessage_ShouldNotTruncate() public void Format_WithLongMessage_ShouldNotTruncate()
{ {
var longMessage = new string('A', 1000); var longMessage = new string('A', 1000);
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", longMessage, null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", longMessage, null, null);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
@ -108,7 +108,7 @@ public class DefaultLogFormatterTests
public void Format_WithSpecialCharacters_ShouldPreserveCharacters() public void Format_WithSpecialCharacters_ShouldPreserveCharacters()
{ {
var message = "Test\nNew\tLine\r\nSpecial: <>&\"'"; var message = "Test\nNew\tLine\r\nSpecial: <>&\"'";
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", message, null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", message, null, null);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);

View File

@ -73,7 +73,7 @@ public class FileAppenderTests
{ {
using (var appender = new FileAppender(_testFilePath)) using (var appender = new FileAppender(_testFilePath))
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
appender.Append(entry); appender.Append(entry);
appender.Flush(); appender.Flush();
} }
@ -90,7 +90,7 @@ public class FileAppenderTests
{ {
for (int i = 0; i < 10; i++) 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);
appender.Append(entry); appender.Append(entry);
} }
@ -110,7 +110,7 @@ public class FileAppenderTests
{ {
using (var appender = new FileAppender(_testFilePath, new JsonLogFormatter())) using (var appender = new FileAppender(_testFilePath, new JsonLogFormatter()))
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
appender.Append(entry); appender.Append(entry);
appender.Flush(); appender.Flush();
} }
@ -126,7 +126,7 @@ public class FileAppenderTests
var appender = new FileAppender(_testFilePath); var appender = new FileAppender(_testFilePath);
appender.Dispose(); appender.Dispose();
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
Assert.Throws<ObjectDisposedException>(() => appender.Append(entry)); Assert.Throws<ObjectDisposedException>(() => appender.Append(entry));
} }
@ -137,7 +137,7 @@ public class FileAppenderTests
// 第一次写入 // 第一次写入
using (var appender1 = new FileAppender(_testFilePath)) using (var appender1 = new FileAppender(_testFilePath))
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "First message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "First message", null, null);
appender1.Append(entry); appender1.Append(entry);
appender1.Flush(); appender1.Flush();
} }
@ -145,7 +145,7 @@ public class FileAppenderTests
// 第二次写入 // 第二次写入
using (var appender2 = new FileAppender(_testFilePath)) using (var appender2 = new FileAppender(_testFilePath))
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Second message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Second message", null, null);
appender2.Append(entry); appender2.Append(entry);
appender2.Flush(); appender2.Flush();
} }
@ -161,7 +161,7 @@ public class FileAppenderTests
{ {
using (var appender = new FileAppender(_testFilePath)) using (var appender = new FileAppender(_testFilePath))
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
appender.Append(entry); appender.Append(entry);
appender.Flush(); appender.Flush();

View File

@ -39,7 +39,7 @@ public class JsonLogFormatterTests
public void Format_WithException_ShouldIncludeExceptionDetails() public void Format_WithException_ShouldIncludeExceptionDetails()
{ {
var exception = new InvalidOperationException("Test exception"); var exception = new InvalidOperationException("Test exception");
var entry = new LogEntry(DateTime.Now, LogLevel.Error, "TestLogger", "Error occurred", exception, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Error, "TestLogger", "Error occurred", exception, null);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
@ -60,7 +60,7 @@ public class JsonLogFormatterTests
["UserName"] = "TestUser", ["UserName"] = "TestUser",
["IsActive"] = true ["IsActive"] = true
}; };
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "User action", null, properties); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "User action", null, properties);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
@ -98,7 +98,7 @@ public class JsonLogFormatterTests
["Key1"] = null, ["Key1"] = null,
["Key2"] = "value" ["Key2"] = "value"
}; };
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, properties); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, properties);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
@ -132,7 +132,7 @@ public class JsonLogFormatterTests
for (int i = 0; i < levels.Length; i++) for (int i = 0; i < levels.Length; i++)
{ {
var entry = new LogEntry(DateTime.Now, levels[i], "TestLogger", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, levels[i], "TestLogger", "Test", null, null);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
var doc = JsonDocument.Parse(result); var doc = JsonDocument.Parse(result);
@ -144,7 +144,7 @@ public class JsonLogFormatterTests
public void Format_WithSpecialCharacters_ShouldEscapeCorrectly() public void Format_WithSpecialCharacters_ShouldEscapeCorrectly()
{ {
var message = "Test \"quoted\" and \n newline"; var message = "Test \"quoted\" and \n newline";
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", message, null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", message, null, null);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);
@ -178,7 +178,7 @@ public class JsonLogFormatterTests
["Null"] = null, ["Null"] = null,
["Array"] = new[] { 1, 2, 3 } ["Array"] = new[] { 1, 2, 3 }
}; };
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test", null, properties); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test", null, properties);
var result = _formatter.Format(entry); var result = _formatter.Format(entry);

View File

@ -12,7 +12,7 @@ public class LogEntryTests
[Test] [Test]
public void Constructor_WithAllParameters_ShouldCreateEntry() public void Constructor_WithAllParameters_ShouldCreateEntry()
{ {
var timestamp = DateTime.Now; var timestamp = DateTime.UtcNow;
var properties = new Dictionary<string, object?> { ["Key1"] = "Value1" }; var properties = new Dictionary<string, object?> { ["Key1"] = "Value1" };
var exception = new InvalidOperationException("Test"); var exception = new InvalidOperationException("Test");
@ -29,7 +29,7 @@ public class LogEntryTests
[Test] [Test]
public void Constructor_WithNullException_ShouldWork() public void Constructor_WithNullException_ShouldWork()
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
Assert.That(entry.Exception, Is.Null); Assert.That(entry.Exception, Is.Null);
} }
@ -37,7 +37,7 @@ public class LogEntryTests
[Test] [Test]
public void Constructor_WithNullProperties_ShouldWork() public void Constructor_WithNullProperties_ShouldWork()
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
Assert.That(entry.Properties, Is.Null); Assert.That(entry.Properties, Is.Null);
} }
@ -48,7 +48,7 @@ public class LogEntryTests
LogContext.Clear(); LogContext.Clear();
using (LogContext.Push("ContextKey", "ContextValue")) using (LogContext.Push("ContextKey", "ContextValue"))
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
var allProps = entry.GetAllProperties(); var allProps = entry.GetAllProperties();
@ -64,7 +64,7 @@ public class LogEntryTests
{ {
LogContext.Clear(); LogContext.Clear();
var properties = new Dictionary<string, object?> { ["PropKey"] = "PropValue" }; var properties = new Dictionary<string, object?> { ["PropKey"] = "PropValue" };
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, properties); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, properties);
var allProps = entry.GetAllProperties(); var allProps = entry.GetAllProperties();
@ -79,7 +79,7 @@ public class LogEntryTests
using (LogContext.Push("ContextKey", "ContextValue")) using (LogContext.Push("ContextKey", "ContextValue"))
{ {
var properties = new Dictionary<string, object?> { ["PropKey"] = "PropValue" }; var properties = new Dictionary<string, object?> { ["PropKey"] = "PropValue" };
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, properties); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, properties);
var allProps = entry.GetAllProperties(); var allProps = entry.GetAllProperties();
@ -98,7 +98,7 @@ public class LogEntryTests
using (LogContext.Push("Key1", "ContextValue")) using (LogContext.Push("Key1", "ContextValue"))
{ {
var properties = new Dictionary<string, object?> { ["Key1"] = "PropValue" }; var properties = new Dictionary<string, object?> { ["Key1"] = "PropValue" };
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, properties); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, properties);
var allProps = entry.GetAllProperties(); var allProps = entry.GetAllProperties();
@ -113,7 +113,7 @@ public class LogEntryTests
public void GetAllProperties_WithEmptyPropertiesAndEmptyContext_ShouldReturnEmpty() public void GetAllProperties_WithEmptyPropertiesAndEmptyContext_ShouldReturnEmpty()
{ {
LogContext.Clear(); LogContext.Clear();
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
var allProps = entry.GetAllProperties(); var allProps = entry.GetAllProperties();
@ -123,7 +123,7 @@ public class LogEntryTests
[Test] [Test]
public void RecordEquality_WithSameValues_ShouldBeEqual() public void RecordEquality_WithSameValues_ShouldBeEqual()
{ {
var timestamp = DateTime.Now; var timestamp = DateTime.UtcNow;
var properties = new Dictionary<string, object?> { ["Key1"] = "Value1" }; var properties = new Dictionary<string, object?> { ["Key1"] = "Value1" };
var entry1 = new LogEntry(timestamp, LogLevel.Info, "TestLogger", "Test message", null, properties); var entry1 = new LogEntry(timestamp, LogLevel.Info, "TestLogger", "Test message", null, properties);
@ -135,7 +135,7 @@ public class LogEntryTests
[Test] [Test]
public void RecordEquality_WithDifferentValues_ShouldNotBeEqual() public void RecordEquality_WithDifferentValues_ShouldNotBeEqual()
{ {
var timestamp = DateTime.Now; var timestamp = DateTime.UtcNow;
var entry1 = new LogEntry(timestamp, LogLevel.Info, "TestLogger", "Test message 1", null, null); var entry1 = new LogEntry(timestamp, LogLevel.Info, "TestLogger", "Test message 1", null, null);
var entry2 = new LogEntry(timestamp, LogLevel.Info, "TestLogger", "Test message 2", null, null); var entry2 = new LogEntry(timestamp, LogLevel.Info, "TestLogger", "Test message 2", null, null);

View File

@ -14,7 +14,7 @@ public class LogLevelFilterTests
public void ShouldLog_WithLevelAboveMinimum_ShouldReturnTrue() public void ShouldLog_WithLevelAboveMinimum_ShouldReturnTrue()
{ {
var filter = new LogLevelFilter(LogLevel.Info); var filter = new LogLevelFilter(LogLevel.Info);
var entry = new LogEntry(DateTime.Now, LogLevel.Warning, "TestLogger", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Warning, "TestLogger", "Test", null, null);
Assert.That(filter.ShouldLog(entry), Is.True); Assert.That(filter.ShouldLog(entry), Is.True);
} }
@ -23,7 +23,7 @@ public class LogLevelFilterTests
public void ShouldLog_WithLevelEqualToMinimum_ShouldReturnTrue() public void ShouldLog_WithLevelEqualToMinimum_ShouldReturnTrue()
{ {
var filter = new LogLevelFilter(LogLevel.Info); var filter = new LogLevelFilter(LogLevel.Info);
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.That(filter.ShouldLog(entry), Is.True); Assert.That(filter.ShouldLog(entry), Is.True);
} }
@ -32,7 +32,7 @@ public class LogLevelFilterTests
public void ShouldLog_WithLevelBelowMinimum_ShouldReturnFalse() public void ShouldLog_WithLevelBelowMinimum_ShouldReturnFalse()
{ {
var filter = new LogLevelFilter(LogLevel.Info); var filter = new LogLevelFilter(LogLevel.Info);
var entry = new LogEntry(DateTime.Now, LogLevel.Debug, "TestLogger", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Debug, "TestLogger", "Test", null, null);
Assert.That(filter.ShouldLog(entry), Is.False); Assert.That(filter.ShouldLog(entry), Is.False);
} }
@ -42,12 +42,12 @@ public class LogLevelFilterTests
{ {
var filter = new LogLevelFilter(LogLevel.Warning); var filter = new LogLevelFilter(LogLevel.Warning);
var traceEntry = new LogEntry(DateTime.Now, LogLevel.Trace, "TestLogger", "Test", null, null); var traceEntry = new LogEntry(DateTime.UtcNow, LogLevel.Trace, "TestLogger", "Test", null, null);
var debugEntry = new LogEntry(DateTime.Now, LogLevel.Debug, "TestLogger", "Test", null, null); var debugEntry = new LogEntry(DateTime.UtcNow, LogLevel.Debug, "TestLogger", "Test", null, null);
var infoEntry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test", null, null); var infoEntry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test", null, null);
var warningEntry = new LogEntry(DateTime.Now, LogLevel.Warning, "TestLogger", "Test", null, null); var warningEntry = new LogEntry(DateTime.UtcNow, LogLevel.Warning, "TestLogger", "Test", null, null);
var errorEntry = new LogEntry(DateTime.Now, LogLevel.Error, "TestLogger", "Test", null, null); var errorEntry = new LogEntry(DateTime.UtcNow, LogLevel.Error, "TestLogger", "Test", null, null);
var fatalEntry = new LogEntry(DateTime.Now, LogLevel.Fatal, "TestLogger", "Test", null, null); var fatalEntry = new LogEntry(DateTime.UtcNow, LogLevel.Fatal, "TestLogger", "Test", null, null);
Assert.That(filter.ShouldLog(traceEntry), Is.False); Assert.That(filter.ShouldLog(traceEntry), Is.False);
Assert.That(filter.ShouldLog(debugEntry), Is.False); Assert.That(filter.ShouldLog(debugEntry), Is.False);

View File

@ -26,7 +26,7 @@ public class NamespaceFilterTests
public void ShouldLog_WithMatchingNamespace_ShouldReturnTrue() public void ShouldLog_WithMatchingNamespace_ShouldReturnTrue()
{ {
var filter = new NamespaceFilter("GFramework.Core", "MyApp"); var filter = new NamespaceFilter("GFramework.Core", "MyApp");
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core.Logging", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core.Logging", "Test", null, null);
Assert.That(filter.ShouldLog(entry), Is.True); Assert.That(filter.ShouldLog(entry), Is.True);
} }
@ -35,7 +35,7 @@ public class NamespaceFilterTests
public void ShouldLog_WithNonMatchingNamespace_ShouldReturnFalse() public void ShouldLog_WithNonMatchingNamespace_ShouldReturnFalse()
{ {
var filter = new NamespaceFilter("GFramework.Core", "MyApp"); var filter = new NamespaceFilter("GFramework.Core", "MyApp");
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "OtherNamespace", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "OtherNamespace", "Test", null, null);
Assert.That(filter.ShouldLog(entry), Is.False); Assert.That(filter.ShouldLog(entry), Is.False);
} }
@ -44,7 +44,7 @@ public class NamespaceFilterTests
public void ShouldLog_WithExactMatch_ShouldReturnTrue() public void ShouldLog_WithExactMatch_ShouldReturnTrue()
{ {
var filter = new NamespaceFilter("GFramework.Core"); var filter = new NamespaceFilter("GFramework.Core");
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core", "Test", null, null);
Assert.That(filter.ShouldLog(entry), Is.True); Assert.That(filter.ShouldLog(entry), Is.True);
} }
@ -53,7 +53,7 @@ public class NamespaceFilterTests
public void ShouldLog_WithPrefixMatch_ShouldReturnTrue() public void ShouldLog_WithPrefixMatch_ShouldReturnTrue()
{ {
var filter = new NamespaceFilter("GFramework"); var filter = new NamespaceFilter("GFramework");
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core.Logging", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core.Logging", "Test", null, null);
Assert.That(filter.ShouldLog(entry), Is.True); Assert.That(filter.ShouldLog(entry), Is.True);
} }
@ -62,7 +62,7 @@ public class NamespaceFilterTests
public void ShouldLog_IsCaseInsensitive() public void ShouldLog_IsCaseInsensitive()
{ {
var filter = new NamespaceFilter("gframework.core"); var filter = new NamespaceFilter("gframework.core");
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core.Logging", "Test", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core.Logging", "Test", null, null);
Assert.That(filter.ShouldLog(entry), Is.True); Assert.That(filter.ShouldLog(entry), Is.True);
} }
@ -72,10 +72,10 @@ public class NamespaceFilterTests
{ {
var filter = new NamespaceFilter("GFramework.Core", "MyApp.Services", "ThirdParty"); var filter = new NamespaceFilter("GFramework.Core", "MyApp.Services", "ThirdParty");
var entry1 = new LogEntry(DateTime.Now, LogLevel.Info, "GFramework.Core.Logging", "Test", null, null); var entry1 = new LogEntry(DateTime.UtcNow, LogLevel.Info, "GFramework.Core.Logging", "Test", null, null);
var entry2 = new LogEntry(DateTime.Now, LogLevel.Info, "MyApp.Services.UserService", "Test", null, null); var entry2 = new LogEntry(DateTime.UtcNow, LogLevel.Info, "MyApp.Services.UserService", "Test", null, null);
var entry3 = new LogEntry(DateTime.Now, LogLevel.Info, "ThirdParty.Library", "Test", null, null); var entry3 = new LogEntry(DateTime.UtcNow, LogLevel.Info, "ThirdParty.Library", "Test", null, null);
var entry4 = new LogEntry(DateTime.Now, LogLevel.Info, "OtherNamespace", "Test", null, null); var entry4 = new LogEntry(DateTime.UtcNow, LogLevel.Info, "OtherNamespace", "Test", null, null);
Assert.That(filter.ShouldLog(entry1), Is.True); Assert.That(filter.ShouldLog(entry1), Is.True);
Assert.That(filter.ShouldLog(entry2), Is.True); Assert.That(filter.ShouldLog(entry2), Is.True);

View File

@ -59,7 +59,7 @@ public class RollingFileAppenderTests
// 写入足够多的日志触发轮转 // 写入足够多的日志触发轮转
for (int i = 0; i < 20; i++) for (int i = 0; i < 20; i++)
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger",
$"This is a test message number {i} with some padding to increase size", null, null); $"This is a test message number {i} with some padding to increase size", null, null);
appender.Append(entry); appender.Append(entry);
} }
@ -81,7 +81,7 @@ public class RollingFileAppenderTests
// 写入大量日志触发多次轮转 // 写入大量日志触发多次轮转
for (int i = 0; i < 50; i++) for (int i = 0; i < 50; i++)
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger",
$"This is a test message number {i} with some padding to increase size significantly", null, null); $"This is a test message number {i} with some padding to increase size significantly", null, null);
appender.Append(entry); appender.Append(entry);
} }
@ -100,7 +100,7 @@ public class RollingFileAppenderTests
{ {
for (int i = 0; i < 30; i++) for (int i = 0; i < 30; i++)
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger",
$"Test message {i} with padding to trigger rolling", null, null); $"Test message {i} with padding to trigger rolling", null, null);
appender.Append(entry); appender.Append(entry);
} }
@ -124,7 +124,7 @@ public class RollingFileAppenderTests
var appender = new RollingFileAppender(_testFilePath); var appender = new RollingFileAppender(_testFilePath);
appender.Dispose(); appender.Dispose();
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
Assert.Throws<ObjectDisposedException>(() => appender.Append(entry)); Assert.Throws<ObjectDisposedException>(() => appender.Append(entry));
} }
@ -136,7 +136,7 @@ public class RollingFileAppenderTests
{ {
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger",
"This is a longer message to trigger rolling more frequently", null, null); "This is a longer message to trigger rolling more frequently", null, null);
appender.Append(entry); appender.Append(entry);
} }
@ -153,7 +153,7 @@ public class RollingFileAppenderTests
{ {
using (var appender = new RollingFileAppender(_testFilePath)) using (var appender = new RollingFileAppender(_testFilePath))
{ {
var entry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test message", null, null); var entry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test message", null, null);
appender.Append(entry); appender.Append(entry);
appender.Flush(); appender.Flush();

View File

@ -34,7 +34,7 @@ public sealed class ConsoleLogger(
/// <param name="exception">异常信息,可为空</param> /// <param name="exception">异常信息,可为空</param>
protected override void Write(LogLevel level, string message, Exception? exception) protected override void Write(LogLevel level, string message, Exception? exception)
{ {
var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); var timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff");
var levelStr = LevelStrings[(int)level]; var levelStr = LevelStrings[(int)level];
var log = $"[{timestamp}] {levelStr} [{Name()}] {message}"; var log = $"[{timestamp}] {levelStr} [{Name()}] {message}";

View File

@ -39,7 +39,7 @@ public class AudioSettings : ISettingsData
/// <summary> /// <summary>
/// 获取设置数据最后修改的时间 /// 获取设置数据最后修改的时间
/// </summary> /// </summary>
public DateTime LastModified { get; } = DateTime.Now; public DateTime LastModified { get; } = DateTime.UtcNow;
/// <summary> /// <summary>
/// 从指定的数据源加载音频设置 /// 从指定的数据源加载音频设置

View File

@ -38,7 +38,7 @@ public class GraphicsSettings : ISettingsData
/// <summary> /// <summary>
/// 获取设置数据最后修改的时间 /// 获取设置数据最后修改的时间
/// </summary> /// </summary>
public DateTime LastModified { get; } = DateTime.Now; public DateTime LastModified { get; } = DateTime.UtcNow;
/// <summary> /// <summary>
/// 从指定的数据源加载图形设置 /// 从指定的数据源加载图形设置

View File

@ -42,7 +42,7 @@ public class LocalizationSettings : ISettingsData
/// <summary> /// <summary>
/// 获取设置数据最后修改的时间 /// 获取设置数据最后修改的时间
/// </summary> /// </summary>
public DateTime LastModified { get; } = DateTime.Now; public DateTime LastModified { get; } = DateTime.UtcNow;
/// <summary> /// <summary>
/// 从指定的数据源加载本地化设置 /// 从指定的数据源加载本地化设置

View File

@ -36,7 +36,7 @@ public sealed class GodotLogger(
protected override void Write(LogLevel level, string message, Exception? exception) protected override void Write(LogLevel level, string message, Exception? exception)
{ {
// 构造时间戳和日志前缀 // 构造时间戳和日志前缀
var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); var timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff");
var levelStr = LevelStrings[(int)level]; var levelStr = LevelStrings[(int)level];
var logPrefix = $"[{timestamp}] {levelStr} [{Name()}]"; var logPrefix = $"[{timestamp}] {levelStr} [{Name()}]";

View File

@ -1012,7 +1012,7 @@ public class SaveSystem : AbstractSystem
Level = 1, Level = 1,
Health = 100, Health = 100,
Position = Vector3.Zero, Position = Vector3.Zero,
CreatedAt = DateTime.Now CreatedAt = DateTime.UtcNow
}; };
} }
} }

View File

@ -439,7 +439,7 @@ public class EventBridge : AbstractSystem
this.SendEvent(new PublicPlayerDiedEvent this.SendEvent(new PublicPlayerDiedEvent
{ {
PlayerId = e.Id, PlayerId = e.Id,
Timestamp = DateTime.Now Timestamp = DateTime.UtcNow
}); });
}); });
} }

View File

@ -118,7 +118,7 @@ public class CustomLogger : AbstractLogger
protected override void Write(LogLevel level, string message, Exception? exception) protected override void Write(LogLevel level, string message, Exception? exception)
{ {
// 自定义日志输出逻辑 // 自定义日志输出逻辑
var logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] [{level}] {message}"; var logMessage = $"[{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss}] [{level}] {message}";
if (exception != null) if (exception != null)
logMessage += $"\n{exception}"; logMessage += $"\n{exception}";

View File

@ -432,7 +432,7 @@ public class LogUtility : IUtility
_ => "" _ => ""
}; };
string timestamp = DateTime.Now.ToString("HH:mm:ss"); string timestamp = DateTime.UtcNow.ToString("HH:mm:ss");
GD.Print($"{timestamp} {prefix} {message}"); GD.Print($"{timestamp} {prefix} {message}");
} }

View File

@ -452,7 +452,7 @@ public class GameDataManager
public void SaveGame(int slotId, SaveData data) public void SaveGame(int slotId, SaveData data)
{ {
_saveStorage.Write($"slot_{slotId}", data); _saveStorage.Write($"slot_{slotId}", data);
_saveStorage.Write($"slot_{slotId}/timestamp", DateTime.Now); _saveStorage.Write($"slot_{slotId}/timestamp", DateTime.UtcNow);
_saveStorage.Write($"slot_{slotId}/version", data.Version); _saveStorage.Write($"slot_{slotId}/version", data.Version);
} }
@ -639,13 +639,13 @@ public class CachedStorage : IStorage
if (!_cacheTimestamps.TryGetValue(key, out var timestamp)) if (!_cacheTimestamps.TryGetValue(key, out var timestamp))
return true; return true;
return DateTime.Now - timestamp > _cacheExpiry; return DateTime.UtcNow - timestamp > _cacheExpiry;
} }
private void UpdateCache<T>(string key, T value) private void UpdateCache<T>(string key, T value)
{ {
_cache[key] = value; _cache[key] = value;
_cacheTimestamps[key] = DateTime.Now; _cacheTimestamps[key] = DateTime.UtcNow;
} }
} }
``` ```
@ -928,7 +928,7 @@ public partial class GameManager : Node, IController
var profile = new GameProfile var profile = new GameProfile
{ {
PlayerName = playerName, PlayerName = playerName,
LastPlayed = DateTime.Now, LastPlayed = DateTime.UtcNow,
TotalPlayTime = 0 TotalPlayTime = 0
}; };
@ -1029,7 +1029,7 @@ public partial class GameManager : Node, IController
PlayerHealth = Context.GetModel<PlayerModel>().Health.Value, PlayerHealth = Context.GetModel<PlayerModel>().Health.Value,
CurrentLevel = Context.GetModel<GameModel>().CurrentLevel.Value, CurrentLevel = Context.GetModel<GameModel>().CurrentLevel.Value,
Inventory = Context.GetModel<InventoryModel>().GetData(), Inventory = Context.GetModel<InventoryModel>().GetData(),
Timestamp = DateTime.Now, Timestamp = DateTime.UtcNow,
Version = 1 Version = 1
}; };
} }
@ -1096,7 +1096,7 @@ public class AutoSaveSystem : AbstractSystem
// 保存到自动存档槽 // 保存到自动存档槽
var storage = Context.GetUtility<IStorage>(); var storage = Context.GetUtility<IStorage>();
storage.Write("autosave", saveData); storage.Write("autosave", saveData);
storage.Write("autosave/timestamp", DateTime.Now); storage.Write("autosave/timestamp", DateTime.UtcNow);
Logger.Debug("Auto-save completed successfully"); Logger.Debug("Auto-save completed successfully");
} }

View File

@ -144,7 +144,7 @@ storage.Write("user://saves/slot_001.dat", saveData);
// 存储调试信息(普通路径) // 存储调试信息(普通路径)
var debugLog = new DebugLog { /* ... */ }; var debugLog = new DebugLog { /* ... */ };
storage.Write("logs/debug_" + DateTime.Now.Ticks + ".json", debugLog); storage.Write("logs/debug_" + DateTime.UtcNow.Ticks + ".json", debugLog);
``` ```
### 存在性检查 ### 存在性检查

View File

@ -51,7 +51,7 @@ public class CreatePlayerCommand : AbstractCommand
MaxHealth = 100, MaxHealth = 100,
Mana = 50, Mana = 50,
MaxMana = 50, MaxMana = 50,
CreatedAt = DateTime.Now CreatedAt = DateTime.UtcNow
}; };
// 保存玩家数据 // 保存玩家数据
@ -440,13 +440,13 @@ public interface IDomainEvent
public record PlayerCreatedDomainEvent(PlayerId PlayerId, PlayerName PlayerName, PlayerClass Class) public record PlayerCreatedDomainEvent(PlayerId PlayerId, PlayerName PlayerName, PlayerClass Class)
: IDomainEvent : IDomainEvent
{ {
public DateTime OccurredAt { get; } = DateTime.Now; public DateTime OccurredAt { get; } = DateTime.UtcNow;
} }
public record PlayerLevelUpDomainEvent(PlayerId PlayerId, PlayerName PlayerName, int NewLevel, int OldLevel) public record PlayerLevelUpDomainEvent(PlayerId PlayerId, PlayerName PlayerName, int NewLevel, int OldLevel)
: IDomainEvent : IDomainEvent
{ {
public DateTime OccurredAt { get; } = DateTime.Now; public DateTime OccurredAt { get; } = DateTime.UtcNow;
} }
// 领域服务 // 领域服务
@ -620,7 +620,7 @@ public interface IEventStore
public record AggregateSnapshot(string StreamId, int Version) : IDomainEvent public record AggregateSnapshot(string StreamId, int Version) : IDomainEvent
{ {
public DateTime OccurredAt { get; } = DateTime.Now; public DateTime OccurredAt { get; } = DateTime.UtcNow;
} }
public class ConcurrencyException : Exception public class ConcurrencyException : Exception
@ -855,7 +855,7 @@ public class PlayerEventHandler : IEventHandler<PlayerLevelUpEvent>,
if (player != null) if (player != null)
{ {
player.IsAlive = false; player.IsAlive = false;
player.DeathTime = DateTime.Now; player.DeathTime = DateTime.UtcNow;
_playerRepository.Update(player); _playerRepository.Update(player);
// 发送通知 // 发送通知
@ -1160,7 +1160,7 @@ public class ChatService : IChatService
{ {
PlayerId = playerId, PlayerId = playerId,
Message = FilterMessage(message), Message = FilterMessage(message),
Timestamp = DateTime.Now, Timestamp = DateTime.UtcNow,
Channel = channel Channel = channel
}; };
@ -1176,7 +1176,7 @@ public class ChatService : IChatService
{ {
PlayerId = "system", PlayerId = "system",
Message = message, Message = message,
Timestamp = DateTime.Now, Timestamp = DateTime.UtcNow,
Channel = "system" Channel = "system"
}; };

View File

@ -569,7 +569,7 @@ public partial class SmartResourceLoader : Node, IController
{ {
Path = path, Path = path,
Priority = priority, Priority = priority,
RequestTime = DateTime.Now RequestTime = DateTime.UtcNow
}; };
_loadQueue.Enqueue(request); _loadQueue.Enqueue(request);