設計網站的時候,不可能我們的網站不出現一點錯誤,常見的“頁面不存在”“頁面運行出錯”等錯誤資訊一般網站多少總是存在的,關鍵是,這些錯誤出現以後,管理員怎樣方便及時的發現它們、盡量減少使用者對網站的不好印象。不管是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,真正在網路開發方面達到一個更高的境界。