代码之家  ›  专栏  ›  技术社区  ›  James Pogran

为什么此事件日志的EntryWrite事件永远不会触发?

  •  3
  • James Pogran  · 技术社区  · 15 年前

    我在C#控制台应用程序和C#windows服务中都有以下代码。它在控制台应用程序中工作。它拾取指定的事件,并正确调用MatchEvent()。C#windows服务中的同一代码不会拾取相同的指定事件,它不会看到它,而是看到其他事件。有问题的事件已写入应用程序日志,因此我不尝试读取安全日志。

    我有什么遗漏吗?我也研究了EventLogPermission,但这似乎不适用,因为我正在从eventLog中获取事件。

    守则:

    private void WatchLogs()
    {
        try
        {
            _eventLogs = EventLog.GetEventLogs();
    
            foreach (EventLog eventLog in _eventLogs)
            {
                if (eventLog.LogDisplayName.Contains("Security"))
                {
                    _logger.DebugFormat(string.Format("{0}: not watching", eventLog.LogDisplayName));
                }
                else
                {
                    eventLog.EntryWritten += EventLogEntryWritten;
                    eventLog.EnableRaisingEvents = true;
    
                    if (_logger.IsInfoEnabled)
                    {
                        _logger.InfoFormat("Monitoring: {0} | Raising Events: {1}", eventLog.LogDisplayName,
                                           eventLog.EnableRaisingEvents);
                    }
                }
            }
        }
        catch (Win32Exception ee)
        {
            _logger.DebugFormat(string.Format("{0}: not watching({1})", eventLog.LogDisplayName, ee.Message));
        }
        catch (SecurityException securityException)
        {
            _logger.ErrorFormat("Error accessing eventlog: {0} : {1}", eventLog.LogDisplayName, securityException.Message);
        }
    }
    
    private void EventLogEntryWritten(object sender, EntryWrittenEventArgs currentEvent)
    {
      var log = (EventLog) sender;
    
      if (_logger.IsDebugEnabled)
        _logger.DebugFormat(
          "Event Raised: |Log:{0}|Source:{1}|EventID:{2}|",log.LogDisplayName,
            currentEvent.Entry.Source,currentEvent.Entry.EventID);
    
      MatchEvent(currentEvent);
    }
    
    2 回复  |  直到 12 年前
        1
  •  0
  •   James Pogran    15 年前

    断断续续地胡闹。尽管我仍然不能百分之百确定,但似乎发生了以下情况:

    • 可以从任一节点写入到 类仅拾取writer中的事件 在当地。
    • 写入事件至少发生了六次 每秒钟。我所经历的事件 他们互相攻击,并被 事件。

    对此的任何确认都会有所帮助。在这里获得的信息: msdn

        2
  •  0
  •   Richard Anthony Hein    15 年前

    是的,如果事件发生在轮询范围内,您将错过这些事件。您可以使用WMI(通过System.Management)更改轮询间隔。 This

    您还需要在单独的线程上执行WriteEntry(如果您也在写入事件日志),这样就不会阻止接收事件。