一些小网站、B/S系统,测试的覆盖面往往并不是很到位,于是,用户往往成为bug的重要反馈者。
一般的做法,是当系统出现错误时,让用户截图发过来。但这样其实会漏掉大多数的错误情况。其实这一步,完全不需要用户动手,可以在出现错误时利用IIS的自定义错误页,将错误记录到自己的错误日志文件中,就可以给我们提供很丰富的bug数据。
IIS的自定义错误页类型详解参见:http://blog.csdn.net/zouqingfang/article/details/7185659
一般ASP出错时,是500-100错误。所以只要替换这一个文件即可。
这个文件可以在windows目录中找到:
C:/WINNT/Help/iisHelp/common/500-100.asp
将它拷贝到网站根目录,并修改IIS中该网站的配置,设置“自定义错误页面”,将500;100的类型设为URL,同时URL设为 /500-100.asp,这样每次出错IIS就不会调用他默认的处理代码了,而是调用我们刚拷贝过去这个文件。
现在打开500-100.asp,可以看到他怎么获得错误的具体信息,做一些修改,将这些错误信息不要使用Response.Write输出,而使其生成字符串并最终写到一个html文件里,就可以获得每一次用户浏览时ASP出错后,用户看到的信息了。
如果你的网站使用的是utf-8编码的话,这里可能会遇到一些编码上的麻烦,记住IIS执行这个文件并不是include进来,而是作为一个独立文件执行的,所以这个文件头可以加上 <%@codepage=65001%> 以确保是utf-8格式。
然后每当发现错误日志,便逐一处理其中的错误,然后把错误日志删掉,beta流程就很完美了~
附上我修改后使用的500-100.asp
<%@LANGUAGE="VBscript" CODEPAGE="65001"%>
<!--#include file="myHeaders.asp"-->
<%
'上面的头文件是我网站内的各种工具,这里主要用到最后的写日志文件工具。
Const lngMaxFormBytes = 200
Dim objASPError, blnErrorWritten, strServername, strServerIP, strRemoteIP
Dim strMethod, lngPos, datNow, strQueryString, strURL
'这里就不清除界面了,要不然会把已经输出的部分都清掉只显示错误页面。
If false and Response.Buffer Then
Response.Clear
Response.Status = "500 Internal Server Error"
Response.ContentType = "text/html"
End If
Response.Expires = 0
Set objASPError = Server.GetLastError
ErrorContent = "<div style='margin:20px;padding:20px;border:1px solid red;'>"
ErrorContent = ErrorContent & " 错误类型: "
ErrorContent = ErrorContent & Server.HTMLEncode(objASPError.Category)
If objASPError.ASPCode > "" Then ErrorContent = ErrorContent & Server.HTMLEncode(", " & objASPError.ASPCode)
ErrorContent = ErrorContent & Server.HTMLEncode(" (0x" & Hex(objASPError.Number) & ")" ) & "<br>"
If objASPError.ASPDescription > "" Then
ErrorContent = ErrorContent & Server.HTMLEncode(objASPError.ASPDescription) & "<br>"
elseIf (objASPError.Description > "") Then
ErrorContent = ErrorContent & Server.HTMLEncode(objASPError.Description) & "<br>"
end if
blnErrorWritten = False
' Only show the Source if it is available and the request is from the same machine as IIS
If objASPError.Source > "" Then
strServername = LCase(Request.ServerVariables("SERVER_NAME"))
strServerIP = Request.ServerVariables("LOCAL_ADDR")
strRemoteIP = Request.ServerVariables("REMOTE_ADDR")
If (strServerIP = strRemoteIP) And objASPError.File <> "?" Then
ErrorContent = ErrorContent & Server.HTMLEncode(objASPError.File)
If objASPError.Line > 0 Then ErrorContent = ErrorContent & ", line " & objASPError.Line
If objASPError.Column > 0 Then ErrorContent = ErrorContent & ", column " & objASPError.Column
ErrorContent = ErrorContent & "<br>"
ErrorContent = ErrorContent & "<font style=""COLOR:000000; FONT: 8pt/11pt courier new""><b>"
ErrorContent = ErrorContent & Server.HTMLEncode(objASPError.Source) & "<br>"
If objASPError.Column > 0 Then ErrorContent = ErrorContent & String((objASPError.Column - 1), "-") & "^<br>"
ErrorContent = ErrorContent & "</b></font>"
blnErrorWritten = True
End If
End If
If Not blnErrorWritten And objASPError.File <> "?" Then
ErrorContent = ErrorContent & "<b>" & Server.HTMLEncode( objASPError.File)
If objASPError.Line > 0 Then ErrorContent = ErrorContent & Server.HTMLEncode(", line " & objASPError.Line)
If objASPError.Column > 0 Then ErrorContent = ErrorContent & ", column " & objASPError.Column
ErrorContent = ErrorContent & "</b><br>"
End If
ErrorContent = ErrorContent & "<br>页面: "
strMethod = Request.ServerVariables("REQUEST_METHOD")
ErrorContent = ErrorContent & strMethod & " "
If strMethod = "POST" Then
ErrorContent = ErrorContent & Request.TotalBytes & " bytes to "
End If
ErrorContent = ErrorContent & Request.ServerVariables("SCRIPT_NAME")
ErrorContent = ErrorContent & "</li>"
If strMethod = "POST" Then
ErrorContent = ErrorContent & "<p><li>POST Data:<br>"
' On Error in case Request.BinaryRead was executed in the page that triggered the error.
On Error Resume Next
If Request.TotalBytes > lngMaxFormBytes Then
ErrorContent = ErrorContent & Server.HTMLEncode(Left(Request.Form, lngMaxFormBytes)) & " . . ."
Else
ErrorContent = ErrorContent & Server.HTMLEncode(Request.Form)
End If
On Error Goto 0
ErrorContent = ErrorContent & "</li>"
End If
ErrorContent = ErrorContent & "<br>时间: "
datNow = Now()
ErrorContent = ErrorContent & Server.HTMLEncode(FormatDateTime(datNow, 1) & ", " & FormatDateTime(datNow, 3))
ErrorContent = ErrorContent & "</div>"
%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%=ErrorContent%>
<%
gLog.Log "AspError", ErrorContent '这个写日志工具是我另外做的,作用就是写某一类型(例如这里的ASPError)的日志,同时记录环境变量,最终记录日志主题内容。这个日志文件用html保存比较好看。
%>