我查询不同域控制器的事件日志,我必须在一段时间间隔后继续查询。
以下是我用来查询它的代码。
public static void FindAllLog(string machineName)
{
//EventLog log = new EventLog("", "");
//log.
EventLog[] remoteEventLogs;
// Gets logs on the local computer, gives remote computer name to get the logs on the remote computer.
remoteEventLogs = EventLog.GetEventLogs(machineName);
Console.WriteLine("Number of logs on computer: " + remoteEventLogs.Length);
for (int i = 0; i < remoteEventLogs.Length; i++)
{
Console.WriteLine("Log : " + remoteEventLogs[i].Log);
ReadEventLog(machineName, remoteEventLogs[i].Log, DateTime.Now.AddDays(-30));
//ReadAppEventLog(machineName, remoteEventLogs[i].Log);
}
}
public static void ReadEventLog(string machine, string logType,DateTime fromDate)
{
EventLog ev = new EventLog(logType, machine);
var entry = (from EventLogEntry e in ev.Entries
where e.TimeGenerated >= fromDate
orderby e.TimeGenerated
select e);//.LastOrDefault();
foreach (EventLogEntry CurrentEntry in entry)
{
Console.WriteLine("Event ID : " + CurrentEntry.EventID);
Console.WriteLine("Event Source : " + CurrentEntry.Source);
Console.WriteLine("Event TimeGenerated : " + CurrentEntry.TimeGenerated);
Console.WriteLine("Event TimeWritten : " + CurrentEntry.TimeWritten);
Console.WriteLine("Event MachineName : " + CurrentEntry.MachineName);
Console.WriteLine("Entry Type : " + CurrentEntry.EntryType.ToString());
Console.WriteLine("Message : " + CurrentEntry.Message + "\n");
Console.WriteLine("-----------------------------------------");
}
}
当我第一次查询域控制器时,我必须阅读过去30天的日志。其他只是从我们上次离开时读取的最新日志。 它花了很多时间来查询它? 我试过WMI,同样的问题很多时间,有时会给出“无效的查询错误”? 如何改善这个? 您建议执行此任务的任何模型,我在这里为每个域控制器进行多线程处理?
由于
答案 0 :(得分:2)
回答这个问题。我尝试了所有阅读事件日志的方式。
使用.NET2.0方法使用EventLog类,然后使用.NET3.0方法使用EventLogQuery和EventLogReader类进行读取,最后我尝试了WMI方法。
我必须每隔5分钟左右根据时间或时间片段读取事件日志。
你们会惊讶地发现,WMI将比其他.NETx方法更快地检索数据,我们将获得更多字段,没有操作系统依赖性或防火墙问题。
但其他两种方法都有缺点。
只是想分享一下。
由于
答案 1 :(得分:1)
从EventLog读取时避免使用LINQ。 试试这个:
// Store indices of last accessed EventLogEntries in Dictionary {logType, lastIndex}
private static readonly Dictionary<string, int> _lastIndices = new Dictionary<string, int>();
public static void FindAllLog(string machineName)
{
//EventLog log = new EventLog("", "");
//log.
EventLog[] remoteEventLogs;
// Gets logs on the local computer, gives remote computer name to get the logs on the remote computer.
remoteEventLogs = EventLog.GetEventLogs(machineName);
Console.WriteLine("Number of logs on computer: " + remoteEventLogs.Length);
for (int i = 0; i < remoteEventLogs.Length; i++)
{
Console.WriteLine("Log : " + remoteEventLogs[i].Log);
ReadEventLog(machineName, remoteEventLogs[i].Log, DateTime.Now.AddDays(-30));
//ReadAppEventLog(machineName, remoteEventLogs[i].Log);
}
}
public static void ReadEventLog(string machine, string logType, DateTime fromDate)
{
int lastIndex;
EventLog ev = new EventLog(logType, machine);
IList<EventLogEntry> entries = new List<EventLogEntry>();
if (_lastIndices.ContainsKey(logType))
lastIndex = _lastIndices[logType];
else {
lastIndex = 0;
_lastIndices.Add(logType, 0);
}
// Try to avoid LINQ because it uses Enumerator and Loops EVERYTIME trough all items.
// Start Looping from top of the list and break if Entry has Index less than lastIndex or
// if Entry has TimeWritten less than fromDate
for (var i = ev.Entries.Count - 1; ev.Entries[i].Index > lastIndex && ev.Entries[i].TimeWritten > fromDate; i--)
entries.Add(ev.Entries[i]);
if (entries.Count > 0) // Set lastIndex for corresponding logType
_lastIndices[logType] = entries.Max(e => e.Index);
foreach (EventLogEntry CurrentEntry in entry.OrderBy(e => e.TimeWritten))
{
Console.WriteLine("Event ID : " + CurrentEntry.EventID);
Console.WriteLine("Event Source : " + CurrentEntry.Source);
Console.WriteLine("Event TimeGenerated : " + CurrentEntry.TimeGenerated);
Console.WriteLine("Event TimeWritten : " + CurrentEntry.TimeWritten);
Console.WriteLine("Event MachineName : " + CurrentEntry.MachineName);
Console.WriteLine("Entry Type : " + CurrentEntry.EntryType.ToString());
Console.WriteLine("Message : " + CurrentEntry.Message + "\n");
Console.WriteLine("-----------------------------------------");
}
}
我在这里使用了TimeWritten属性,因为它比TimeGenerated更可靠。 TimeGenerated可能出现故障,但TimeWritten总是在升序以及索引。我希望这会有所帮助。