全部博文(2065)
分类: 系统运维
2010-07-24 17:12:05
监控IIS服务器500错误
对于ASP站点当遇到服务器错误的时候如何快速定位是哪个URL抛出的错误信息及到底是什么错误信息呢?这对于应用监控是非常重要的一个问题。
1. 编写自定义的文件
编写一个HTML文件可以解决500错误的自定义错误页面的。但是当我放一个.asp的文件就不行了不知道是什么原因??
我发现IIS光是500错误就有
Internal Server Error
Application restarting
Sever too busy
Direct request for global asa forbidden
UNC Access Error
URL Authorization store not found
URL Authorization store cannot be opend
Bad file metadata
ASP error
解决这个的办法是我们把文件类型修改成URL类型。然后填写当前站点的相对根目录的绝对地址就行了。现在我们是ASP页面灵活性可能会比较高来尝试一下能否抓取到前一个页面的错误URL与错误信息吧
2. ASP错误页面的脚本要如何编写呢?
因为主要考虑到要把错误页面抓取到。所以需要考虑一下能否提取到什么类型的错误的.
现在来分析一下如何编写这个错误页面的信息提取工作并将我要的数据通过ajax的方式或者是使用src 的方式将错误信息提交到服务器。=======既然我们是采用了ASP的方式进行提交的话就可以直接使用XMLHTTP封包的方式进行提交
以下内容是转载自网络资料MSDN
编译或运行的 ASP 页时,将发生错误时, IIS 将生成一个 500; 100 错误,并执行 Server.Transfer() 方法将控制传递给当前定义的自定义错误页。(默认情况下此页是 /iishelp/common/500-100.asp。有关 Server.Transfer() 方法的详细信息,请参阅 Microsoft 知识库中下面的文章:
说明:默认情况是在500-100.asp 但是我们是可以自定义的所以一个站点我们就可以编写这么一个自定义的错误采集页面这样的话我就知道是哪个域名哪个站点在什么时间哪个文件第几行报的是什么错误了!---------------然后形成自已的应用监控的报表!
( ) 如何使用 Server.Transfer 方法
简单介绍一下这个东西
This new method is an alternative to using the Response.Redirect method to transfer to another page, and allows the transfer of the ASP built-in and Error objects to a second page. In addition, the transfer takes place on the server instead of forcing the browser to redirect to a new page.
是我们自已配置的自定义错误页面。
When you transfer to a page in another application, the Application and Session objects will contain information from the originating application. Accordingly, the ASP page that it is transferred to is treated as part of the originating application.
还是可以将这些application或session信息保存起来的!即用户信息不丢失.
当 控件[这个家伙本身其实就是一个IIS的控件]传递给自定义错误页时,Server.GetLastError() 方法可用于获取有关发生错误的详细的信息。Server.GetLastError() 方法返回一个具有下表中列出的属性的 ASPError 对象。(此表也位于 IIS 5.0 联机文档)。
属性 |
说明 |
ASPCode |
返回由 IIS 生成一个错误代码。 |
数字 |
返回标准 COM 错误代码。 |
源 |
指示错误的来源是否 ASP,该脚本语言或对象的内部。 |
文件 |
指示发生错误时正在处理的.asp 文件的名称。 |
行 |
表示在.asp 文件中生成该错误的行。 |
说明 |
返回此错误的简短描述。 |
ASPDescription |
如果是 ASP 相关错误,请返回该错误的更详细的说明。 |
下列步骤将指导您完成自定义的 ASP 错误页的设置。
我测试过:是能够把include里面的错误页面也可以抛出来的!
即像 如果sub.asp出现了错误的话也是可以直接把它的错误信息打印出来的。所以非常方便了!
现在我把代码整理一下:
我需要的数据包括:域名、文件名、错误的行数、错误的信息简述、发生错误时间
示例代码如下:[能够将所需要的相关信息一并打印出来实现的]
<%@Language="VBSCRIPT"%>
<%
Option Explicit
On Error Resume Next
Response.Clear
Dim objError
Set objError = Server.GetLastError()
Dim curr_href
curr_href = CStr(Request.ServerVariables("Local_Addr"))
'如果当一个应用有多台服务器集群的时候可以采集哪一台服务器报的错
‘能够准确获取到在一个集群里面到底是哪一台服务器出现了问题即获取到其服务器的IP地址
Dim client_ip
client_ip = CStr(Request.ServerVariables("Remote_Addr"))
%>
BODY
{ FONT-FAMILY: Arial; FONT-SIZE:
BACKGROUND: #ffffff; COLOR: #000000;
MARGIN: 15px; }
H2
{ FONT-SIZE:
TABLE { BACKGROUND: #000000; PADDING: 5px; }
TH { BACKGROUND: #0000ff; COLOR: #ffffff; }
TR { BACKGROUND: #cccccc; COLOR: #000000; }
ASP 500 Error
An error
occurred processing the page you requested.
Please see the details below for more information.
<% If Len(CStr(objError.ASPCode)) > 0
Then %>
<% End If %> <% If Len(CStr(objError.Number)) > 0
Then %>
<%=" (0x" & Hex(objError.Number) &
")"%>
<% End If %> <% If Len(CStr(objError.Source)) > 0
Then %>
<% End If %> <% If Len(CStr(objError.File)) > 0
Then %>
<% End If %> <% If Len(CStr(objError.Line)) > 0
Then %>
<% End If %> <% If Len(CStr(objError.Description))
> 0 Then %>
<% End If %> <% If Len(CStr(objError.ASPDescription))
> 0 Then %>
<% End If %>
IIS Error
Number
<%=objError.ASPCode%>
COM Error
Number
<%=objError.Number%>
Error
Source
<%=objError.Source%>
File
Name
<%=objError.File%>
Line
Number
<%=objError.Line%>
Brief
Description
<%=objError.Description%>
Full
Description
<%=objError.ASPDescription%>
当前URL
<%=curr_href%>
客户IP
<%=client_ip%>
遗留的问题
1、 使用这种情况是否存在不安全的因素呢?