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 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);
}
@ -41,7 +41,7 @@ public class CompositeFilterTests
var filter2 = new NamespaceFilter("GFramework");
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);
}
@ -53,7 +53,7 @@ public class CompositeFilterTests
var filter2 = new NamespaceFilter("MyApp");
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);
}
@ -66,19 +66,19 @@ public class CompositeFilterTests
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);
// 级别不满足
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);
// 命名空间不满足
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);
// 都不满足
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);
}
@ -93,10 +93,10 @@ public class CompositeFilterTests
var outerComposite = new CompositeFilter(innerComposite, filter3);
// 需要同时满足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);
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
}
}

View File

@ -39,7 +39,7 @@ public class ConsoleAppenderTests
[Test]
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);
@ -54,8 +54,8 @@ public class ConsoleAppenderTests
var filter = new LogLevelFilter(LogLevel.Warning);
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 warningEntry = new LogEntry(DateTime.Now, LogLevel.Warning, "TestLogger", "Warning message", null, null);
var infoEntry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Info message", null, null);
var warningEntry = new LogEntry(DateTime.UtcNow, LogLevel.Warning, "TestLogger", "Warning message", null, null);
appender.Append(infoEntry);
appender.Append(warningEntry);
@ -70,7 +70,7 @@ public class ConsoleAppenderTests
[Test]
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.Flush();
@ -82,7 +82,7 @@ public class ConsoleAppenderTests
[Test]
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.Dispose();
@ -96,7 +96,7 @@ public class ConsoleAppenderTests
{
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);
}

View File

@ -36,7 +36,7 @@ public class DefaultLogFormatterTests
public void Format_WithException_ShouldIncludeException()
{
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);
@ -53,7 +53,7 @@ public class DefaultLogFormatterTests
["UserId"] = 12345,
["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);
@ -70,7 +70,7 @@ public class DefaultLogFormatterTests
{
["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);
@ -86,7 +86,7 @@ public class DefaultLogFormatterTests
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);
Assert.That(result, Does.Contain(expectedStrings[i]));
@ -97,7 +97,7 @@ public class DefaultLogFormatterTests
public void Format_WithLongMessage_ShouldNotTruncate()
{
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);
@ -108,7 +108,7 @@ public class DefaultLogFormatterTests
public void Format_WithSpecialCharacters_ShouldPreserveCharacters()
{
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);

View File

@ -73,7 +73,7 @@ public class FileAppenderTests
{
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.Flush();
}
@ -90,7 +90,7 @@ public class FileAppenderTests
{
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);
}
@ -110,7 +110,7 @@ public class FileAppenderTests
{
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.Flush();
}
@ -126,7 +126,7 @@ public class FileAppenderTests
var appender = new FileAppender(_testFilePath);
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));
}
@ -137,7 +137,7 @@ public class FileAppenderTests
// 第一次写入
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.Flush();
}
@ -145,7 +145,7 @@ public class FileAppenderTests
// 第二次写入
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.Flush();
}
@ -161,7 +161,7 @@ public class FileAppenderTests
{
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.Flush();

View File

@ -39,7 +39,7 @@ public class JsonLogFormatterTests
public void Format_WithException_ShouldIncludeExceptionDetails()
{
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);
@ -60,7 +60,7 @@ public class JsonLogFormatterTests
["UserName"] = "TestUser",
["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);
@ -98,7 +98,7 @@ public class JsonLogFormatterTests
["Key1"] = null,
["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);
@ -132,7 +132,7 @@ public class JsonLogFormatterTests
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 doc = JsonDocument.Parse(result);
@ -144,7 +144,7 @@ public class JsonLogFormatterTests
public void Format_WithSpecialCharacters_ShouldEscapeCorrectly()
{
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);
@ -178,7 +178,7 @@ public class JsonLogFormatterTests
["Null"] = null,
["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);

View File

@ -12,7 +12,7 @@ public class LogEntryTests
[Test]
public void Constructor_WithAllParameters_ShouldCreateEntry()
{
var timestamp = DateTime.Now;
var timestamp = DateTime.UtcNow;
var properties = new Dictionary<string, object?> { ["Key1"] = "Value1" };
var exception = new InvalidOperationException("Test");
@ -29,7 +29,7 @@ public class LogEntryTests
[Test]
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);
}
@ -37,7 +37,7 @@ public class LogEntryTests
[Test]
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);
}
@ -48,7 +48,7 @@ public class LogEntryTests
LogContext.Clear();
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();
@ -64,7 +64,7 @@ public class LogEntryTests
{
LogContext.Clear();
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();
@ -79,7 +79,7 @@ public class LogEntryTests
using (LogContext.Push("ContextKey", "ContextValue"))
{
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();
@ -98,7 +98,7 @@ public class LogEntryTests
using (LogContext.Push("Key1", "ContextValue"))
{
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();
@ -113,7 +113,7 @@ public class LogEntryTests
public void GetAllProperties_WithEmptyPropertiesAndEmptyContext_ShouldReturnEmpty()
{
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();
@ -123,7 +123,7 @@ public class LogEntryTests
[Test]
public void RecordEquality_WithSameValues_ShouldBeEqual()
{
var timestamp = DateTime.Now;
var timestamp = DateTime.UtcNow;
var properties = new Dictionary<string, object?> { ["Key1"] = "Value1" };
var entry1 = new LogEntry(timestamp, LogLevel.Info, "TestLogger", "Test message", null, properties);
@ -135,7 +135,7 @@ public class LogEntryTests
[Test]
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 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()
{
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);
}
@ -23,7 +23,7 @@ public class LogLevelFilterTests
public void ShouldLog_WithLevelEqualToMinimum_ShouldReturnTrue()
{
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);
}
@ -32,7 +32,7 @@ public class LogLevelFilterTests
public void ShouldLog_WithLevelBelowMinimum_ShouldReturnFalse()
{
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);
}
@ -42,12 +42,12 @@ public class LogLevelFilterTests
{
var filter = new LogLevelFilter(LogLevel.Warning);
var traceEntry = new LogEntry(DateTime.Now, LogLevel.Trace, "TestLogger", "Test", null, null);
var debugEntry = new LogEntry(DateTime.Now, LogLevel.Debug, "TestLogger", "Test", null, null);
var infoEntry = new LogEntry(DateTime.Now, LogLevel.Info, "TestLogger", "Test", null, null);
var warningEntry = new LogEntry(DateTime.Now, LogLevel.Warning, "TestLogger", "Test", null, null);
var errorEntry = new LogEntry(DateTime.Now, LogLevel.Error, "TestLogger", "Test", null, null);
var fatalEntry = new LogEntry(DateTime.Now, LogLevel.Fatal, "TestLogger", "Test", null, null);
var traceEntry = new LogEntry(DateTime.UtcNow, LogLevel.Trace, "TestLogger", "Test", null, null);
var debugEntry = new LogEntry(DateTime.UtcNow, LogLevel.Debug, "TestLogger", "Test", null, null);
var infoEntry = new LogEntry(DateTime.UtcNow, LogLevel.Info, "TestLogger", "Test", null, null);
var warningEntry = new LogEntry(DateTime.UtcNow, LogLevel.Warning, "TestLogger", "Test", null, null);
var errorEntry = new LogEntry(DateTime.UtcNow, LogLevel.Error, "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(debugEntry), Is.False);

View File

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

View File

@ -59,7 +59,7 @@ public class RollingFileAppenderTests
// 写入足够多的日志触发轮转
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);
appender.Append(entry);
}
@ -81,7 +81,7 @@ public class RollingFileAppenderTests
// 写入大量日志触发多次轮转
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);
appender.Append(entry);
}
@ -100,7 +100,7 @@ public class RollingFileAppenderTests
{
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);
appender.Append(entry);
}
@ -124,7 +124,7 @@ public class RollingFileAppenderTests
var appender = new RollingFileAppender(_testFilePath);
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));
}
@ -136,7 +136,7 @@ public class RollingFileAppenderTests
{
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);
appender.Append(entry);
}
@ -153,7 +153,7 @@ public class RollingFileAppenderTests
{
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.Flush();

View File

@ -34,7 +34,7 @@ public sealed class ConsoleLogger(
/// <param name="exception">异常信息,可为空</param>
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 log = $"[{timestamp}] {levelStr} [{Name()}] {message}";

View File

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

View File

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

View File

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

View File

@ -36,7 +36,7 @@ public sealed class GodotLogger(
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 logPrefix = $"[{timestamp}] {levelStr} [{Name()}]";

View File

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

View File

@ -439,7 +439,7 @@ public class EventBridge : AbstractSystem
this.SendEvent(new PublicPlayerDiedEvent
{
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)
{
// 自定义日志输出逻辑
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)
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}");
}

View File

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

View File

@ -144,7 +144,7 @@ storage.Write("user://saves/slot_001.dat", saveData);
// 存储调试信息(普通路径)
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,
Mana = 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)
: IDomainEvent
{
public DateTime OccurredAt { get; } = DateTime.Now;
public DateTime OccurredAt { get; } = DateTime.UtcNow;
}
public record PlayerLevelUpDomainEvent(PlayerId PlayerId, PlayerName PlayerName, int NewLevel, int OldLevel)
: 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 DateTime OccurredAt { get; } = DateTime.Now;
public DateTime OccurredAt { get; } = DateTime.UtcNow;
}
public class ConcurrencyException : Exception
@ -855,7 +855,7 @@ public class PlayerEventHandler : IEventHandler<PlayerLevelUpEvent>,
if (player != null)
{
player.IsAlive = false;
player.DeathTime = DateTime.Now;
player.DeathTime = DateTime.UtcNow;
_playerRepository.Update(player);
// 发送通知
@ -1160,7 +1160,7 @@ public class ChatService : IChatService
{
PlayerId = playerId,
Message = FilterMessage(message),
Timestamp = DateTime.Now,
Timestamp = DateTime.UtcNow,
Channel = channel
};
@ -1176,7 +1176,7 @@ public class ChatService : IChatService
{
PlayerId = "system",
Message = message,
Timestamp = DateTime.Now,
Timestamp = DateTime.UtcNow,
Channel = "system"
};

View File

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