Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法判断是哪个事件日志导致了C#中的EntryWrite事件?_C#_.net_Event Log - Fatal编程技术网

有没有办法判断是哪个事件日志导致了C#中的EntryWrite事件?

有没有办法判断是哪个事件日志导致了C#中的EntryWrite事件?,c#,.net,event-log,C#,.net,Event Log,我正在开发一个显示事件日志数据的web应用程序,类似于事件查看器。应用程序还必须为用户提供一种方式,使用web服务订阅事件日志,并在将条目写入订阅的日志时接收通知 我正在使用以下代码订阅web服务中的事件日志: EventLog eventLog = new EventLog(observer.logName, observer.machineName); eventLog.EnableRaisingEvents = true; eventLog.EntryWritten += new Entr

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

我正在使用以下代码订阅web服务中的事件日志:

EventLog eventLog = new EventLog(observer.logName, observer.machineName);
eventLog.EnableRaisingEvents = true;
eventLog.EntryWritten += new EntryWrittenEventHandler(eventLog_EntryWritten);
eventList.Add(eventLog);
我尝试使用观察者作为事件日志的订户,当处理EventWrite事件时,调用一个观察者的更新方法。问题是,我不知道如何区分事件日志,因为它们都使用相同的事件处理程序。我这样做是因为不同机器的事件日志数量不同。此外,我希望观察者只处理一种类型的事件日志,即当事件写入应用程序日志时,一个观察者将发送一封电子邮件

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

remoteEventLogs = EventLog.GetEventLogs(machineName);
EventWrited事件处理程序具有此对象发送者参数,但Visual Studio将其类型显示为EventLoginInternal,我无法使用该类型,并且我无法将发送者强制转换为EventLog以获取EventLog.Log属性。如果我试着投下它,像这样:

void eventLog_EntryWritten(object sender, EntryWrittenEventArgs e)
    {
        var log = (EventLog)sender;
    }
eventLog.EntryWritten += (sender, e) => eventLog_EntryWritten(eventLog, e);
我得到一个异常,说我不能将EventLoginInternal强制转换为EventLog

有没有办法知道哪个事件日志触发该事件


谢谢

我想你要找的东西可以在EntryWrittenEventArgs中找到

MSDN显示有一个名为Entry的属性,它向您显示有关刚刚记录的内容的各种信息。在EventLogEntry类中有一些属性可能对您有所帮助,例如MachineName或UserName

下面是指向Args类的链接

这里有一个到Entry类的链接

我看不到特定事件日志的直接链接,但是如果您在该类中使用调试器,Entry对象可能会提供足够的信息来查找它


我希望这能有所帮助。

我认为问题在于,
EventLog
类的整个概念是,它假设它在单个日志上工作,而它确实是这样做的。因此,
eventWrittenEventTargets
EventEntry
类都不是包含日志名的成员,因为它是由关联的EventLog实例隐式提供的。当然,糟糕的是,您无法在EventWrited处理程序中访问它

您可以围绕
System.Diagnostics.EventLog
创建一个包装器,如下所示:

class MyEventLog : EventLog
{
    public MyEventLog(string logName, string machineName)
        : base(logName, machineName)
    {
        base.EnableRaisingEvents = true;
        base.EntryWritten += MyEventLog_EntryWritten;
    }

    void MyEventLog_EntryWritten(object sender, EntryWrittenEventArgs e)
    {
        Console.WriteLine("Entry in {0} log.", base.Log);

        // Your code
    }
}
然后在通常使用事件日志的地方使用
MyEventLog
。也许给它起个更好的名字吧


您还可以通过提供一个从内部调用的Action属性来分解“您的代码”部分,该属性可以设置为“外部”处理程序函数。

另一个选项是沿以下行使用反射:

string log = (string)sender.GetType().GetProperty("Log").GetValue(sender, null);

由于本例中的
sender
实际上具有
Log
属性。

我同意Christian建议的将EventLog类包装在另一个类中的想法。我最近做了这样一个要求

这是我创建的类

 public class EventLogWatcher : EventLog
{
    Action<string, EntryWrittenEventArgs> _changeHandler;
    public EventLogWatcher(string logName, Action<string, EntryWrittenEventArgs> changeHandler)
        : base(logName)
    {
        _changeHandler = changeHandler;
    }

    public void EnableCapture()
    {
        base.EnableRaisingEvents = true;
        base.EntryWritten += EventLogChangeHandler;
    }

    public void DisableCapture()
    {
        base.EnableRaisingEvents = false;
        base.EntryWritten -= EventLogChangeHandler;
    }

    private void EventLogChangeHandler(object sender, EntryWrittenEventArgs e)
    {
        _changeHandler(base.Log, e);
    }
}

另一个选项是更改事件注册,如下所示:

void eventLog_EntryWritten(object sender, EntryWrittenEventArgs e)
    {
        var log = (EventLog)sender;
    }
eventLog.EntryWritten += (sender, e) => eventLog_EntryWritten(eventLog, e);

是的,问题是,Entry属性不显示正在以任何方式写入的日志的相关信息。如果没有考虑在EventLog周围制作一个包装器,我会尝试一下。非常感谢。这不允许您从事件处理程序中访问日志名,或者我丢失了一些内容。
base.log
将为您提供日志名。或者您可以将其存储在构造函数中的成员变量中,并从事件处理程序(这是一个成员函数)中访问该变量。新的.Net框架可能会出现问题