用ASP.NET將網頁錯誤信息寫入系統日志
2024-07-10 12:55:52
供稿:網友
 
國內最大的酷站演示中心!
設計網站的時候,不可能我們的網站不出現一點錯誤,常見的“頁面不存在”“頁面運行出錯”等錯誤信息一般網站多少總是存在的,關鍵是,這些錯誤出現以后,管理員怎樣方便及時的發現它們、盡量減少用戶對網站的不好印象。不管是iis 4還是iis 5,我們都可以設置網站的“自定義錯誤信息”,通過這樣的設置,一些系統默認的比較不友好的錯誤信息就可以更換為網站管理員自定義的頁面,這對于網站的實用和友好性都大有幫助。但是,我們在使用過程中卻發現一個比較不方便的問題,當我們查看網站日志的時候,我們發現了這些錯誤頁面的出現,但是,卻不能在系統事件查看這些錯誤信息。而在網站的日志部分查看這些錯誤信息又比較麻煩,有沒有辦法可以直接將產生的錯誤信息象安全日志一樣保存在系統日志部分呢?asp.net現在就可以做到。現在,我們一步步學習怎樣實現這個功能。 
一、建立eventlog虛擬目錄 
實現,我們在我們的網站建立一個名為“eventlog”的虛擬目錄,具體建立方法如下:在win2000中,打開“開始”->“程序”->“管理工具”->“internet信息服務”,找到建立的網站,郵件點擊選擇“新建”,在彈出的菜單選擇“虛擬目錄”,然后按照向導設置即可。 
二、修改web.config文件 
我們知道,在web.config文件中,我們可以象iis的“自定義錯誤信息”頁面一樣設置錯誤信息頁面的位置和錯誤信息是否顯示等。為了實現本文提到的功能,我們需要適當修改web.config文件,打開“customerrors mode”為“on”,目的是非地計算機用戶只能得到友好(自定義)的錯誤信息,具體設置如下: 
<configuration> 
<system.web> 
<customerrors mode="on" defaultredirect="/eventlog/customerrorpage.aspx"> 
<error statuscode="404" redirect="/eventlog/404page.aspx"/> 
<error statuscode="403" redirect="/eventlog/403page.aspx"/> 
</customerrors> 
</system.web> 
</configuration> 
在以上的設置中,我們看到,當404和403錯誤產生的時候,會將頁面轉到剛才我們設置eventlog虛擬目錄的相應頁面。 
三、建立其他文件 
為了試驗我們的設置是否成功,首先,我們必須設立一個可以產生錯誤的頁面default.aspx,這個頁面的代碼如下: 
default.aspx 頁面代碼 
<% @language="vb" %> 
<script language="vb" runat=server> 
sub page_load(sender as object, e as eventargs) 
if ispostback then 
'定義變量 
dim x as integer 
dim y as integer 
dim z as integer 
x = 1 
y = 0 
'產生錯誤 
z = x/y 
end sub 
</script> 
<html> 
<head> 
</head> 
<body> 
<form method="post" action="eventlog.aspx" name="form1" id="number"> 
<asp:button id="abutton" type="submit" text="點擊產生錯誤" runat="server" /> 
</form> 
</body> 
</html> 
以上代碼我們設計了一個除零的錯誤頁面,顯然,按鈕提交時這個頁面肯定出錯,我們需要查看是否錯誤會加入系統日志。現在,我們來看錯誤頁面的代碼,這里,我們可能用到三個錯誤頁面customerrorpage.aspx、404page.aspx、403page.aspx,這些頁面都放在虛擬目錄eventlog下。它們的代碼分別如下: 
customerrorpage.aspx 代碼 
<html> 
<head></head> 
<body> 
<h1>custom error page</h1> 
</body> 
</html> 
404page.aspx(頁面沒找到錯誤) 代碼 
<html> 
<head></head> 
<body> 
<h1>404 error page</h1> 
</body> 
</html> 
403page.aspx(權限錯誤)代碼 
<html> 
<head></head> 
<body> 
<h1>403 error page</h1> 
</body> 
</html> 
設置以上頁面以后,最重要的,我們需要設置全局配置文件global.asax,這樣錯誤信息才可以保存到系統日志,我們來看這個文件怎樣設置。 
<%@ import namespace="system" %> 
<%@ import namespace="system.diagnostics" %> 
<script language="vb" runat=server> 
public sub application_onerror(sender as object, e as eventargs) 
'捕捉錯誤 
dim lasterror as exception = server.getlasterror() 
dim errmessage as string = lasterror.tostring() 
'這里設置日志的名字為“mylog” 
dim logname as string = "mylog" 
dim message as string = "url " & request.path & " error: " & errmessage 
' 如果日志不存在,建立一個 
if (not eventlog.sourceexists(logname)) then 
eventlog.createeventsource(logname, logname) 
end if 
dim log as new eventlog 
log.source = logname 
'以下列出了五中錯誤 
log.writeentry(message, eventlogentrytype.information, 1) 
' log.writeentry(message, eventlogentrytype.error, 2) 
' log.writeentry(message, eventlogentrytype.warning, 3) 
' log.writeentry(message, eventlogentrytype.successaudit, 4) 
' log.writeentry(message, eventlogentrytype.failureaudit, 5) 
end sub 
</script> 
在以上設置中,定義了當錯誤發生的時候,web服務器將首先檢查是否存在名為“mylog”的日志,如果不存在,建立一個。然后,將錯誤信息寫入日志并保存。在以上的設置中,我們注意以下幾點:(1)以上代碼中,我們將日志命名為“mylog”,在實際應用中,我們可以根據自己的要求設置日志名字,比如“××的網站日志”等,這樣不但容易辨別,而且也不會被其他管理員認錯為別的內容;(2)以上我們給出的錯誤頁面很簡單,就是一個簡單語句。在實際網站應用中,我們可以有幾個選擇,首先,我們可以將所有這些錯誤頁面設置為網站的首頁,當頁面出錯或者頁面不存在的時候,直接將用戶引導到網站首頁,這樣不顯示錯誤信息,對用戶而言可能瀏覽感覺較好;另外,也可以設置將錯誤頁面設置比較友好,最好是一般用戶都可以理解方式而不是簡單的英文提示。 
四、查看效果 
現在,我們打開“事件查看”來驗證是否將事件寫入日志。打開“程序”->“管理”->“事件查看器”,選擇“mylog”,我們可以看到以下的界面(圖一): 
在上圖中,我們看到了mylog里面有幾個事件,打開查看,我們可以看到錯誤信息確實意見記錄下來(圖二):
五、總結 
以上,我們用完整的舉例詳細介紹了錯誤信息寫入系統日志的實現方法。這樣實現以后,相信對系統管理和網站管理都可以起到很好的幫助作用。同時,在實用asp.net的過程中,我們不得不一次次驚嘆它功能的完善,asp.net不但的頁面設計、數據庫訪問、緩存等方面功能和性能大大提高,而且,在與系統的結合、整個環境的管理等方面也進一步完善。所以,對于習慣asp或者php等其他語言編程的用戶,在使用asp.net以后,不能只僅僅關注頁面實現和數據處理等常規操作,而應該進一步在網站安全、系統管理等方面學習asp.net,真正在網絡開發方面達到一個更高的境界。