有没有办法告诉哪个EventLog在C#中导致了EntryWritten事件?

mar*_*777 5 .net c# event-log

我正在开发一个显示事件日志数据的Web应用程序,类似于事件查看器.应用程序还必须为用户提供一种订阅事件日志的方法,并在使用Web服务将条目写入订阅日志时接收通知.

我正在使用此代码订阅Web服务中的事件日志:

EventLog eventLog = new EventLog(observer.logName, observer.machineName);
eventLog.EnableRaisingEvents = true;
eventLog.EntryWritten += new EntryWrittenEventHandler(eventLog_EntryWritten);
eventList.Add(eventLog);
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用观察者作为事件日志的订阅者,并且当处理EventWritten事件时,调用一个观察者的Update方法.问题是,我不知道如何区分事件日志,因为它们都使用相同的事件处理程序.我这样做是因为事件日志的数量因机器而异.此外,我希望观察者只处理一种类型的EventLog,即.当事件写入应用程序日志时,一个观察者将发送电子邮件.

我使用这行代码来获取当前计算机上的所有日志:

remoteEventLogs = EventLog.GetEventLogs(machineName);
Run Code Online (Sandbox Code Playgroud)

EventWritten事件处理程序具有此对象发送者参数,但Visual Studio将其类型显示为EventLogInternal,我无法使用它,并且我无法将发送者强制转换为EventLog以获取EventLog.Log属性.如果我尝试投射它,像这样:

void eventLog_EntryWritten(object sender, EntryWrittenEventArgs e)
    {
        var log = (EventLog)sender;
    }
Run Code Online (Sandbox Code Playgroud)

我得到一个例外,说我不能将EventLogInternal转换为EventLog.

有没有办法知道哪个EventLog会触发事件?

谢谢

小智 3

另一种选择是使用反射:

string log = (string)sender.GetType().GetProperty("Log").GetValue(sender, null);
Run Code Online (Sandbox Code Playgroud)

因为sender在这种情况下实际上拥有该Log财产。