Почему ETW регистрирует логи через 2 секунды - PullRequest
0 голосов
/ 25 февраля 2019

Я использую протоколирование 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, происходит сбой.Но после провала теста я снова проверил просмотрщик событий, и у меня есть журнал:

Log in Event Viewer

Затем я изменил свой тест:

  [TestMethod]
    public void EventLogTest()
    {
        MyApp myApp = new MyApp();
        Thread.Sleep(2000);
        var appStartedLog = GetEventRecordFromEventID(120);
        Assert.IsNotNull(appStartedLog);
    }

Теперь я очищаю логи и запускаю тест.Это проходит.Мой вопрос: почему он регистрируется через 2 секунды и как написать для этого модульный тест?

...