在窗口中访问和查询事件日志

本文关键字:查询 事件 日志 访问 窗口 | 更新日期: 2023-09-27 18:34:34

我想知道如何访问事件日志条目。我有一个客户端服务器应用程序,它可以毫无问题地执行。我正在寻找的是 id 为 1149 的所有日志实例。此日志是远程连接条目的日志。我拿了一段代码,就在这里。

string logType = "System";
string str = "";
EventLog ev = new EventLog(logType, System.Environment.MachineName);
int LastLogToShow = ev.Entries.Count;
if (LastLogToShow <= 0)
    Console.WriteLine("No Event Logs in the Log :" + logType);
// Read the last 2 records in the specified log. 
int i;
for (i = ev.Entries.Count; i >= LastLogToShow - 1000 ; i--)
{
    EventLogEntry CurrentEntry = ev.Entries[i];
    if (CurrentEntry.InstanceId == 1149)
    {
        str += "Event type: " + CurrentEntry.EntryType.ToString() + "'n" +
               "Event Message: " + CurrentEntry.Message + CurrentEntry + "'n" +
               "Event Time: " + CurrentEntry.TimeGenerated.ToShortTimeString() + "'n" +
               "Event : " + CurrentEntry.UserName +"'n" +"'n";
    }
}
ev.Close();
return str;

问题是我每次都得到 42567 索引越界异常。我也不知道在那之后它是否会起作用,所以问题可能会随之而来。

编辑:事实上,问题是我像你们说的那样用我的索引伸出事件日志。使用这一行进行循环解决了我在这里的问题,我现在能够到达事件日志,如果有人在环顾四周,这个解决方案对我有用,所以非常感谢大家。

for (i = ev.Entries.Count - 1; i >= 0; i--)

在窗口中访问和查询事件日志

for (i = ev.Entries.Count; i >= LastLogToShow - 1000 ; i--)导致您的错误。我真的不明白你在这里想做什么。首先,如果您的条目少于 1000 个,则您的i可能是负数。当您使用负值作为数组的索引时,您将获得"索引越界异常"。当您尝试仅处理最后 2 条记录时(正如您在 for 循环上方的评论所建议的那样(,您应该只使用它:

for (i = ev.Entries.Count - 1; i >= ev.Entries.Count - 2; i--)

当然,您仍然需要检查是否有超过 2 个条目,因为如果有 0 个条目,代码仍将进入 for 循环并尝试访问具有负索引的数组:

if(ev.Entries.Count < 2)
  return str;
for (i = ev.Entries.Count - 1; i >= ev.Entries.Count - 2; i--)

编辑:也刚刚注意到即使有超过1000条记录,当你第一次进入for循环时,你会有ev.Entries[ev.Entries.Count]。由于数组索引是从零开始的,因此您必须从计数中减去 1 才能获得数组的最后一个元素。

我强烈建议你使用C# Linq。

添加此命名空间

using System.Linq;

Linq 在处理数据的方式上与 SQL 非常相似。在您的情况下:

List<string> stringLogs = 
    ev.Entries
        .Where(t => t.InstanceId == 1149)
        .Select(t => GenerateLogString(t))
        .ToList();
public string GenerateLogString(EventLogEntry CurrentEntry)
{
    return
        string.Format("Event type: {0}'nEvent Message: {1}'nEvent Time: {2}'nEvent: {3}'n",
            CurrentEntry.EntryType.ToString(),
            CurrentEntry.Message + CurrentEntry,
            CurrentEntry.TimeGenerated.ToShortTimeString(),
            CurrentEntry.UserName)
}

然后,您可以将字符串日志转换为单个字符串,就像您在那里一样。

string str = string.Join("/n", stringLogs);

如果要选择前 2 个日志(如注释所示(,请添加 .将 (2( 带到查询中,如下所示。

List<string> stringLogs = 
    ev.Entries
        .Where(t => t.InstanceId == 1149)
        .Take(2)
        .Select(t => GenerateLogString(t))
        .ToList();

你只需要将 i 等于 ev。条目计数 -1。i = (ev.条目计数 -1(