ErrorCodes.js
Description
This script prints an HTML table containing all the single <Request, StatusCode> pairs and the number of times they appear in the specified IIS W3C log file. In order for this example to work properly, the IIS W3C log file must have been configured to log the sc-substatus field.
Requirements
You must install and use the Log Parser.
Supported Platforms
Windows Server 2003 |
Yes |
Windows XP |
No |
Windows 2000 |
No |
Script Code
//Parse arguments first
var szInputLogFilename=null;
var szArgs = WScript.Arguments;
if(szArgs.length<1)
{
WScript.Echo("Usage:");
WScript.Echo(" -log:<log_filename>");
WScript.Quit(-2);
}
for (var i=0; i < 1; i++)
{
if(szArgs(i).substr(0,5).toLowerCase()=="-log:")
{
szInputLogFilename=szArgs(i).substr(5);
}
else
{
WScript.Echo("Unrecognized argument: " + szArgs(i));
WScript.Quit(-1);
}
}
if( szInputLogFilename==null )
{
WScript.Echo("Not all the parameters have been specified");
WScript.Quit(-1);
}
//Create the main Log Parser Query object
var myQuery=new ActiveXObject("MSUtil.LogQuery");
//Create the text of the query
var szQuery = "SELECT STRCAT(cs-uri-stem, REPLACE_IF_
NOT_NULL(cs-uri-query, STRCAT('?', cs-uri-query))) AS Request, " +
"STRCAT(TO_STRING(sc-status), STRCAT('.', TO_STRING
(sc-substatus))) AS Status, COUNT(*) AS Total " +
"FROM " + szInputLogFilename + " WHERE (sc-status >= 400)
AND (sc-substatus IS NOT NULL) " +
"GROUP BY Status, Request " +
"ORDER BY Total DESC";
//Execute the query and get a recordset
var recordSet=myQuery.Execute(szQuery);
//Print out the HTML table header
WScript.Echo("<TABLE border=1><TR><TH colspan=4>
Failures by statuscode</TH></TR>");
WScript.Echo("<TR><TH>Requested URL</TH><TH
>Status Code</TH><TH>Status Description</TH>
<TH>Hits</TH></TR>");
//Walk thru the recordset
for(; !recordSet.atEnd(); recordSet.moveNext())
{
//Retrieve the values
var record=recordSet.getRecord();
WScript.Echo("<TR>");
WScript.Echo("<TD>" + record.GetValue(0) + "</TD>");
WScript.Echo("<TD>" + record.GetValue(1) + "</TD>");
WScript.Echo("<TD>" + StatusToDesc(record.GetValue(1))
+ "</TD>");
WScript.Echo("<TD>" + record.GetValue(2) + "</TD>");
WScript.Echo("</TR>");
}
//Print out the HTML table footer
WScript.Echo("</TABLE>");
function StatusToDesc(status)
{
switch(status)
{
case "400.0":
return "Bad Request:";
case "401.1":
return "Unauthorized:Logon failed";
case "401.2":
return "Unauthorized:Logon failed due to server configuration";
case "401.3":
return "Unauthorized:Unauthorized due to ACL on resource";
case "401.4":
return "Unauthorized:Authorization failed by filter";
case "401.5":
return "Unauthorized:Authorization failed by ISAPI/CGI app";
case "401.7":
return "Unauthorized:Denied due to URL Authorization policy";
case "403.1":
return "Forbidden:Execute access denied";
case "403.2":
return "Forbidden:Read access denied";
case "403.3":
return "Forbidden:Write access denied";
case "403.4":
return "Forbidden:SSL required";
case "403.5":
return "Forbidden:SSL128 required";
case "403.6":
return "Forbidden:IP address rejected";
case "403.7":
return "Forbidden:Client certificate required";
case "403.8":
return "Forbidden:Site access denied";
case "403.9":
return "Forbidden:Too many users";
case "403.10":
return "Forbidden:Invalid Configuration";
case "403.11":
return "Forbidden:Password Change";
case "403.12":
return "Forbidden:Mapper Denied Access";
case "403.13":
return "Forbidden:Client certificate revoked";
case "403.14":
return "Forbidden:Directory Listing Denied";
case "403.15":
return "Forbidden:Client Access Licenses Exceeded";
case "403.16":
return "Forbidden:Client certificate untrusted or ill-formed";
case "403.17":
return "Forbidden:Client certificate
has expired or is not yet valid";
case "403.18":
return "Forbidden:Cannot execute request from
this application pool";
case "403.19":
return "Forbidden:CGI Access denied";
case "403.20":
return "Forbidden:Passport Login failed";
case "404.0":
return "Not Found:";
case "404.2":
return "Not Found:Denied due to Lockdown Policy";
case "404.3":
return "Not Found:Denied due to MIMEMAP Policy";
case "405.0":
return "Method Not Allowed:";
case "406.0":
return "Not Acceptable:";
case "407.0":
return "Proxy Authentication Required:";
case "412.0":
return "Precondition Failed:";
case "414.0":
return "Request-URI Too Long:";
case "415.0":
return "Unsupported Media Type:";
case "500.0":
return "Internal Server Error:";
case "500.12":
return "Internal Server Error:Application restarting";
case "500.13":
return "Internal Server Error:Server too busy";
case "500.15":
return "Internal Server Error:Direct requests for
GLOBAL.ASA forbidden";
case "500.16":
return "Internal Server Error:UNC Access Error";
case "500.17":
return "Internal Server Error:URL Authorization
store not found";
case "500.18":
return "Internal Server Error:URL Authorization
store cannot be opened";
case "500.19":
return "Internal Server Error:Bad file metadata";
case "500.100":
return "Internal Server Error:ASP error";
case "501.0":
return "Not Implemented:";
case "502.0":
return "Bad Gateway:";
default:
return "unknown";
}
}
For any feedback regarding the content of this sample script, please write to Microsoft TechNet.
Disclaimer
The sample scripts are not supported under any Microsoft standard support program or service. The sample scripts are provided AS IS without warranty of any kind. Microsoft further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. In no event shall Microsoft, its authors, or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) arising out of the use of or inability to use the sample scripts or documentation, even if Microsoft has been advised of the possibility of such damages.