C#使用Log Parser 2.2 + MSchart打造簡易Windows日志分析工具前段時間做了一個簡易的Windows日志分析工具(主要針對Windows系統(tǒng)日志SysEvent.Evt這個文件),主要是使用了Log Parser 2.2和MSchart控件,在此和大家分享一下! 首先是Log Parser 2.2,關(guān)于它的介紹我就不多說了,下載地址:http://www.microsoft.com/en-us/download/details.aspx?id=24659 第一步是安裝Log Parser 2.2,然后新建一個C#窗體項目,在資源管理器中選中“引用”右鍵“添加引用”,選擇Log Parser 2.2安裝目錄下的“LogParser.dll” 然后確定返回主窗體頁面,添加一個button和一個dataGridView控件,在button的Click事件寫入如下代碼:
private void button1_Click(object sender, EventArgs e)
{
string sql = @"SELECT EventID, TimeGenerated, SourceName, Message FROM E:\SysEvent.Evt";//此為系統(tǒng)日志文件路徑
DataTable dt = readFromEvt(sql);
writeToDataBase(dt);
dataGridView2.DataSource = dt;
MessageBox.Show("讀取完畢!");
}
public DataTable readFromEvt(string sql)
{
try
{
DataTable datat = new DataTable();
datat.Columns.Add("事件ID", typeof(string));
datat.Columns.Add("日期", typeof(string));
datat.Columns.Add("來源", typeof(string));
datat.Columns.Add("描述", typeof(string));
// Instantiate the LogQuery object
LogQuery oLogQuery = new LogQuery();
// Instantiate the Event Log Input Format object
EvtInputFormat oEvtInputFormat = new EvtInputFormat();
// Set its "direction" parameter to "BW"
oEvtInputFormat.direction = "BW";
// Create the query
string query = sql;
// Execute the query
LogRecordSet oRecordSet = oLogQuery.Execute(query, oEvtInputFormat);
while (!oRecordSet.atEnd())
{
var itemData = oRecordSet.getRecord();
DataRow dr = datat.NewRow();
dr["事件ID"] = itemData.getValue("EventID").ToString();
dr["日期"] = itemData.getValue("TimeGenerated").ToString();
dr["來源"] = itemData.getValue("SourceName").ToString();
dr["描述"] = itemData.getValue("Message").ToString();
datat.Rows.Add(dr);
oRecordSet.moveNext();
}
// Close the recordset
oRecordSet.close();
return datat;
}
catch (System.Runtime.InteropServices.COMException exc)
{
MessageBox.Show("Unexpected error: " + exc.Message);
return null;
}
}
至此已經(jīng)完成了SysEvent.Evt日志文件內(nèi)容的讀取,這里是讀取到一個DataTable并且綁定到dataGridView控件上,其中上面代碼中還有一個函數(shù)writeToDataBase(dt);主要是將這些數(shù)據(jù)寫到數(shù)據(jù)庫中。 接下來是MSchart,VS2010自帶這個控件,具體在工具箱數(shù)據(jù)欄下,名字是“Chart”,如果是VS2008的話還需要下載安裝一下,下載地址:http://www.microsoft.com/en-us/download/details.aspx?id=14422,安裝好以后,在“工具箱”右鍵“選擇項”,“瀏覽”在Microsoft Chart Controls安裝目錄把Assemblies下的dll都添加進去(實際只用System.Windows.Forms.DataVisualization.dll),確定返回工具箱在數(shù)據(jù)欄下就可以看到“Chart”控件,拖拽一個到窗體上,然后再加入一個button,在button的Click事件寫入如下代碼:
private void button3_Click(object sender, EventArgs e)
{
DB db = new DB();
string sql = @"select top 5 EventID,count(*) as Num from EvevtLog group by EventID order by count(*) desc";
DataTable dt = db.GetDataTable(sql);
dataGridView2.DataSource = dt;
// Set series chart type
Chart1.Series[0].ChartType = SeriesChartType.Bar;
// Show as 3D
Chart1.ChartAreas[0].Area3DStyle.Enable3D = true;
// Draw as 3D Cylinder
Chart1.Series[0]["DrawingStyle"] = "Cylinder";
//Chart1.BackColor = Color.Azure; //圖表背景色
Chart1.Titles.Add("事件"); //圖表標題
//設(shè)置圖表的數(shù)據(jù)源
Chart1.DataSource = dt;
//設(shè)置圖表Y軸對應(yīng)項
Chart1.Series[0].YValueMembers = "Num";
//Chart1.Series[1].YValueMembers = "Volume2";
//設(shè)置圖表X軸對應(yīng)項
Chart1.Series[0].XValueMember = "EventID";
Chart1.Series[0].IsValueShownAsLabel = true; //是否顯示數(shù)據(jù)
Chart1.Series[0].IsVisibleInLegend = false; //是否顯示數(shù)據(jù)說明
Chart1.Series[0].MarkerStyle = MarkerStyle.Circle; //線條上的數(shù)據(jù)點標志類型
Chart1.Series[0].MarkerSize = 8; //標志大小
Chart1.ChartAreas[0].AxisX.LineColor = Color.Blue; //X 軸顏色
Chart1.ChartAreas[0].AxisY.LineColor = Color.Blue; //Y 軸顏色
Chart1.ChartAreas[0].AxisX.LineWidth = 2; //X 軸寬度
Chart1.ChartAreas[0].AxisY.LineWidth = 2; //Y 軸寬度
Chart1.ChartAreas[0].AxisY.Title = "事件出現(xiàn)頻率"; //Y 軸標題
//綁定數(shù)據(jù)
Chart1.DataBind();
}
我這里面db.GetDataTable(sql);是從數(shù)據(jù)庫里抽取數(shù)據(jù)出來展示,各位其實可以按需選擇,關(guān)于展示部分,Chart控件很強大,我這里只做了一個統(tǒng)計展示的例子,其他的各位可以深入研究一下,最后看一下效果。 |
|
|