我想知道如何才能到达事件日志条目。我有一个客户端服务器应用程序,它执行没有问题。我正在寻找的是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--)
答案 0 :(得分:5)
此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才能获得数组的最后一个元素。
答案 1 :(得分:2)
我强烈建议您使用C#Linq。
添加此命名空间
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)
}
Linq与SQL在数据处理方式上非常相似。在你的情况下:
string str = string.Join("/n", stringLogs);
然后,您可以将字符串日志转换为单个字符串,就像您在那里一样。
List<string> stringLogs =
ev.Entries
.Where(t => t.InstanceId == 1149)
.Take(2)
.Select(t => GenerateLogString(t))
.ToList();
如果您想选择前2个日志(如您的评论所示),请在查询中添加.Take(2),如下所示。
{{1}}
答案 2 :(得分:1)
你只需要等于ev.Entries.Count -1。 i =(ev.Entries.Count -1)