从事件日志获取事件的详细信息
本文关键字:事件 详细信息 日志 获取 | 更新日期: 2023-09-27 17:59:07
我试图根据列表框中项目的选择从事件日志中获取详细信息。我试着把细节放进一个文本框里。我还没有成功地独自找到解决方案。我所做的是在事件日志中重复并找到与日志索引匹配的内容,然后显示消息,但这是一个非常耗时的操作,而且速度非常慢。有没有一种更快的方法可以根据日志的索引直接访问特定的日志条目。我使用WPF和C#。
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
EventLog eventLog1 = new EventLog();
eventLog1.Log = "System";
foreach (System.Diagnostics.EventLogEntry entry in eventLog1.Entries)
{
var newEntry = entry.Index + " - " + entry.EntryType + " - " + entry.TimeWritten + " - " + entry.Source;
backgroundWorker2.ReportProgress(0, newEntry);
}
}
void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var newEntry = (string)e.UserState;
MainWindow.Instance.Dispatcher.BeginInvoke(new Action(delegate() { MainWindow.Instance.listBox1.Items.Add(newEntry); }));
}
这将每个项目添加到带有项目索引的列表框中,然后我遍历并提取索引:
private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string p1 = listBox1.SelectedItem.ToString();
string[] id = Regex.Split(p1, @"(['s])");
label1.Content = id[0];
EventLog el = new EventLog();
el.Log = "System";
foreach (System.Diagnostics.EventLogEntry entry in el.Entries)
{
if (entry.Index.ToString() == id[0])
{
label1.Content = entry.Message;
}
}
}
foreach循环是导致UI挂起的原因,但即使我在另一个线程上设置它,就像我在列表框中添加项目时所做的那样,仍然需要一些时间来完成所有操作,以获得我想要的确切索引。所以我真正想做的只是直接进入那个索引并获取消息,而不是在整个列表中迭代搜索
查看您的代码后,以下是我将要做的事情的快速摘要:
删除ProgressChanged
处理程序它用于向用户报告当前状态,您不需要这样做。而是在DoWork
处理程序中调用Items.Add
。
创建一次EventLog
这看起来更好,如果你不小心的话,就可以避免在循环中创建它。
创建一个特殊的类,而不是使用regex解析文本这非常重要,当您需要更准确的行为或根本不想显示索引时,这将为您省去很多痛苦。正则表达式的速度很慢,而且永远不能解析用于向用户显示的数据。必须使用类
使用有意义的名称我知道你没有清理代码,但如果你想有人在互联网上帮助你,你真的应该。
最后,按索引获取项目如果您查看了文档,您会注意到有一个indexer属性可以直接通过其索引获取项。
class EntryItem {
public EntryItem (EventLogEntry entry)
{
EntryIndex = entry.Index;
ItemText = string.Format ("{0} - {1} - {2} - {3}",
entry.Index,
entry.EntryType,
entry.TimeWritten,
entry.Source);
}
public string ItemText { get; private set; }
public int EntryIndex { get; private set; }
public override string ToString ()
{
return ItemText;
}
}
private EventLog log = new EventLog {
Log = "System"
};
private void eventLoader_DoWork (object sender, DoWorkEventArgs e)
{
foreach (EventLogEntry entry in this.log.Entries)
this.Dispatcher.BeginInvoke (() => eventListBox.Items.Add (new EntryItem (entry)));
}
private void eventListBox_SelectionChanged (object sender, SelectionChangedEventArgs e)
{
EntryItem item = eventListBox.SelectedItem as EntryItem;
if (item == null)
return;
var entry = log.Entries [item.EntryIndex];
currentEntryLabel.Content = entry.Message;
}