用c 讀取並分析sql2005日誌

2021-09-08 22:01:15 字數 3065 閱讀 4481

用過logexplorer的朋友都會被他強悍的功能吸引,我寫過一篇詳細的操作文件可以參考

我們可以自己用開發工具來實現sql日誌的讀取,這個應用還是很酷的,具體思路

1、首先要了解乙個沒有公開的系統函式::fn_dblog,他可以讀取sql日誌,並返回二進位制的行資料

2、然後要了解sql的二進位制資料是如何儲存的,這個可以參考我的blog文章

3、用自己擅長的開發工具來分析資料,得到我們需要的資訊

我用c#寫了乙個測試樣例,分析了int,char,datetime和varchar的日誌情況而且沒有考慮null和空字串的儲存,希望感興趣的朋友能和我一起交流打造屬於自己的日誌分析工具

詳細的試驗步驟以及**如下:

1、首先建立sqlserver的測試環境,我用的sql2005,這個過程不能保證在之前的版本中執行

以下sql語句會建立乙個dblogtest資料庫,並建立一張log_test表,然後插入3條資料之後把錶清空

usemaster

gocreatedatabasedblogtest

gousedblogtest

gocreatetablelog_test(idint,codechar(10),namevarchar(20),datedatetime,memovarchar(100))

insertintolog_testselect100,'id001','jinjazz',getdate(),'剪刀'

insertintolog_testselect65549,'id002','遊客',getdate()-1,'這傢伙很懶,沒有設定暱稱'

insertintolog_testselect-999,'id003','這傢伙來自火星',getdate()-1000,'a'

deletefromlog_test

--usemaster

--go

--dropdatabasedblogtest

2、我們最終的目的是要找到被我們刪掉的資料

3、分析日誌的c#**:我已經盡量詳細的寫了注釋

usingsystem;

usingsystem.collections.generic;

usingsystem.text;

;//迴圈讀取日誌

while(reader.read())

的操作:",reader["operation"],reader["allocunitname"]);

foreach(datacolumncincolumns)

=",c.name,c.value);

}console.writeline();

}catch

}reader.close();

}conn.close();

}console.writeline("************************日誌分析完成");

console.readline();

}//自定義的column結構

publicclassdatacolumn

publicdatacolumn(stringname,system.data.sqldbtypetype,shortlength)

}///

///sql二進位制結構翻譯,這個比較關鍵,測試環境為sql2005,其他版本沒有測過。

//////

///staticvoidtranslatedata(bytedata,datacolumncolumns)

}//跳過三個位元組

index+=3;

//取變長字段的數量,儲存兩個位元組

shortvarcolumncount=bitconverter.toint16(data,index);

index+=2;

//接下來,每兩個位元組儲存乙個變長字段的結束位置,

//所以第乙個變長字段的開始位置可以算出來

shortstartindex=(short)(index+varcolumncount*2);

//第乙個變長字段的結束位置也可以算出來

shortendindex=bitconverter.toint16(data,index);

//迴圈變長字段列表讀取資料

foreach(datacolumncincolumns)

}//獲取完畢}}

} 4、更改你的sql連線字串後執行以上**,會看到如下輸出資訊:

資料物件dbo.log_test的lop_insert_rows操作:

id=100

code=id001

name=jinjazz

date=2008-8-718:14:03

memo=剪刀

資料物件dbo.log_test的lop_insert_rows操作:

id=65549

code=id002

name=遊客

date=2008-8-618:14:03

memo=這傢伙很懶,沒有設定暱稱

資料物件dbo.log_test的lop_insert_rows操作:

id=-999

code=id003

name=這傢伙來自火星

date=2005-11-1118:14:03

memo=a

資料物件dbo.log_test的lop_delete_rows操作:

id=100

code=id001

name=jinjazz

date=2008-8-718:14:03

memo=剪刀

資料物件dbo.log_test的lop_delete_rows操作:

id=65549

code=id002

name=遊客

date=2008-8-618:14:03

memo=這傢伙很懶,沒有設定暱稱

資料物件dbo.log_test的lop_delete_rows操作:

id=-999

code=id003

name=這傢伙來自火星

date=2005-11-1118:14:03

memo=a

************************日誌分析完成

試驗成功~~

用c 讀取並分析sql2005日誌

我們可以自己用開發工具來實現sql日誌的讀取,這個應用還是很酷的,具體思路 1 首先要了解乙個沒有公開的系統函式 fn dblog,他可以讀取sql日誌,並返回二進位制的行資料 2 然後要了解sql的二進位制資料是如何儲存的,這個可以參考我的blog文章 3 用自己擅長的開發工具來分析資料,得到我們...

用c 讀取並分析sql2005日誌

我們可以自己用開發工具來實現sql日誌的讀取,這個應用還是很酷的,具體思路 1 首先要了解乙個沒有公開的系統函式 fn dblog,他可以讀取sql日誌,並返回二進位制的行資料 2 然後要了解sql的二進位制資料是如何儲存的,這個可以參考我的blog文章 3 用自己擅長的開發工具來分析資料,得到我們...

用c 讀取並分析sql2005日誌

用過logexplorer的朋友都會被他強悍的功能吸引,我寫過一篇詳細的操作文件可以參考 我們可以自己用開發工具來實現sql日誌的讀取,這個應用還是很酷的,具體思路 1 首先要了解乙個沒有公開的系統函式 fn dblog,他可以讀取sql日誌,並返回二進位制的行資料 3 用自己擅長的開發工具來分析資...