实时事件日志监控工具






4.59/5 (27投票s)
演示如何进行实时事件日志监控。
引言
我是一个追求即时满足的人。我喜欢实时地查看谁在访问我的机器以及从哪里访问,这个工具可以做到这一点,并提供许多其他的事件日志监控功能。
背景
在测试一个提供 Windows 事件日志记录的软件时,我们的 QA 团队询问是否有办法在事件写入 Windows 事件日志时进行监控,因此就创建了这个小工具。该工具显示的通知是通过 Joel Matthias 的 NotifyIconEx 类 实现的,这个类非常出色。
捕获事件
EventLog
类包含一个名为 EntryWritten
的事件处理程序。这个处理程序需要一个类型为 EntryWrittenEventArgs
的参数。为了捕获事件的发生,我们只需将 EnableRaisingEvents
属性设置为 true,并声明将处理该事件的方法名称。
private void StartWatch()
{
EventLog myLog = new EventLog(watchLog);
// set event handler
myLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
myLog.EnableRaisingEvents = true;
}
显示事件
当发生匹配指定标准的事件时,会显示一个气泡通知,其中包含最后写入事件的详细信息。(要捕获和显示安全日志事件,您必须启用审计。)
private void OnEntryWritten(object source, EntryWrittenEventArgs e)
{
string logName = watchLog;
GetLogEntryStats(watchLog);
if (logType == eventFilter || eventFilter.Length == 0)
{
// show balloon
NotifyIcon.ShowBalloon("Event Log Monitor",
"An event was written to the "+logName+" event log."+
"\nType: "+LogType+
"\nSource: "+LogSource+
"\nCategory: "+LogCategory+
"\nEventID: "+EventID+
"\nUser: "+User,
NotifyIconEx.NotifyInfoFlags.Info,
5000);
LogNotification();
}
}
private void GetLogEntryStats(string logName)
{
int e = 0;
EventLog log = new EventLog(logName);
e = log.Entries.Count - 1; // last entry
logMessage = log.Entries[e].Message;
logMachine = log.Entries[e].MachineName;
logSource = log.Entries[e].Source;
logCategory = log.Entries[e].Category;
logType = Convert.ToString(log.Entries[e].EntryType);
eventID = log.Entries[e].EventID.ToString();
user = log.Entries[e].UserName;
logTime = log.Entries[e].TimeGenerated.ToShortTimeString();
log.Close(); // close log
}
GetEventLogs()
方法提供了一个重载,用于从远程计算机检索日志。假设事件监控在远程计算机上与在本地计算机上一样有效,只要具有适当的权限即可。随着时间的推移,我将扩展该工具的过滤功能,并提供监控多台机器的能力。
兼容性问题
该代码仅在 Windows XP SP1 上进行了测试,但应该可以在 Windows 2000 上运行。但是,虽然 NotifyIconEx
类包含一个名为 BalloonClick
的事件处理程序,但该处理程序在 Windows 2000 上不受支持。无法在 Win9x 或 NT4 上运行,因为它们无法显示气泡通知。