首页 > 解决方案 > 为什么 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 秒后记录以及如何为此编写单元测试?

标签: c#unit-testingetw

解决方案


推荐阅读