用ASP.NET将网页错误信息写入系统日志

来源:岁月联盟 编辑:zhu 时间:2005-09-07
设计网站的时候,不可能我们的网站不出现一点错误,常见的“页面不存在”“页面运行出错”等错误信息一般网站多少总是存在的,关键是,这些错误出现以后,管理员怎样方便及时的发现它们、尽量减少用户对网站的不好印象。不管是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,真正在网络开发方面达到一个更高的境界。