访问和查询事件日志 Windows
Accessing and Querying Event Log in Windows
我想知道如何访问事件日志条目。我有一个客户端服务器应用程序,它可以毫无问题地执行。我正在寻找的是 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
可能是负数。当您使用负值作为数组的索引时,您将得到 "index is out of bounds exception"。当您尝试只处理最后 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 才能得到数组的最后一个元素。
你只需要让 i 等于 ev.Entries.Count -1。
我 = (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);
如果您想 select 前 2 个日志(正如您的评论所建议的那样),请将 .Take(2) 添加到查询中,如下所示。
List<string> stringLogs =
ev.Entries
.Where(t => t.InstanceId == 1149)
.Take(2)
.Select(t => GenerateLogString(t))
.ToList();
我想知道如何访问事件日志条目。我有一个客户端服务器应用程序,它可以毫无问题地执行。我正在寻找的是 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
可能是负数。当您使用负值作为数组的索引时,您将得到 "index is out of bounds exception"。当您尝试只处理最后 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 才能得到数组的最后一个元素。
你只需要让 i 等于 ev.Entries.Count -1。 我 = (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);
如果您想 select 前 2 个日志(正如您的评论所建议的那样),请将 .Take(2) 添加到查询中,如下所示。
List<string> stringLogs =
ev.Entries
.Where(t => t.InstanceId == 1149)
.Take(2)
.Select(t => GenerateLogString(t))
.ToList();