c# - 为什么 ETW 日志记录会在 2 秒后记录
问题描述
我正在使用 ETW 日志记录。这是我的代码:
[EventSource(Name = "MyEventSource")]
public sealed class MyEventSource : EventSource
{
public static MyEventSource Log { get; set; } = new MyEventSource();
[NonEvent]
public void Register()
{
Registrator eventSourceRegistrator = new Registrator(this);
eventSourceRegistrator.Register();
}
[Event(120, Message = "App started.Process path: {0}", Level = EventLevel.Informational, Channel = EventChannel.Admin)]
public void ServerStarted(string proccessPath)
{
Register();
WriteEvent(120, proccessPath);
}
}
我正在尝试为此编写单元测试。为了从事件查看器获取日志,我使用 EventLogReader 和 EventRecord:
[TestMethod]
public void EventLogTest()
{
MyApp myApp = new MyApp();
var appStartedLog = GetEventRecordFromEventID(120);
Assert.IsNotNull(appStartedLog);
}
EventRecord GetEventRecordFromEventID(int eventID)
{
string source = "MyEventSource/Admin";
string query = $"*[System/EventID={eventID}]";
var elQuery = new EventLogQuery(source, PathType.LogName, query);
using (var elReader = new EventLogReader(elQuery))
{
List<EventRecord> eventRecords = new List<EventRecord>();
for (EventRecord eventInstance = elReader.ReadEvent(); eventInstance != null; eventInstance = elReader.ReadEvent())
{
eventRecords.Add(eventInstance);
}
var res = eventRecords.OrderBy(a => a.TimeCreated).LastOrDefault();
return res;
}
}
还有 MyApp 类:
public class MyApp
{
public MyApp()
{
Start();
}
public void Start()
{
var proccessPath = Process.GetCurrentProcess().MainModule.FileName;
MyEventSource.Log.ServerStarted(proccessPath);
}
}
当我从事件查看器中清除日志并运行 EventLogTest 时,它失败了。但是在测试失败后,我再次检查了事件查看器,并且有我的日志:
然后我改变了我的测试:
[TestMethod]
public void EventLogTest()
{
MyApp myApp = new MyApp();
Thread.Sleep(2000);
var appStartedLog = GetEventRecordFromEventID(120);
Assert.IsNotNull(appStartedLog);
}
现在我清除日志并运行测试。它通过了。我的问题是:为什么它会在 2 秒后记录以及如何为此编写单元测试?
解决方案
推荐阅读
- python - DASK 无法识别 EMR 上的工作人员
- regex - Flutter/Dart - 用于删除主题标签和空格的正则表达式?
- c++ - 将二进制文件读入结构以及字节序问题
- r - 如何从由另一列分组的两列中减去?
- python - 从另一个脚本调用时,Tkinter 条目返回空白,但它自己可以正常工作
- c# - 使用 C# 编程的 powershell cmdlet 的外部帮助文件
- haproxy - HAProxy 将请求路由到错误的服务器
- triggers - Zabbix 5 - 只能在特定情况下监控项目吗?
- c# - 在 DataGridViewComboBoxColumn 中使用来自 AutoComplete 的键入文本,即使该值不在组合框数据源中
- azure - 为什么我不能在 Azure 函数中使用计时器触发时的输出绑定?