Wednesday, June 6, 2012

SharePoint Unified Logging Service from JavaScript


<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"
    Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test6.aspx.cs" Inherits="test.Layouts.test.test6"
    DynamicMasterPageFile="~masterurl/default.master" %>
<asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
    <%--http://msdn.microsoft.com/en-us/library/hh803115--%>
    <script src="/_layouts/LoggingSample/jquery-1.6.4.min.js" type="text/javascript"></script>
    <script type="text/javascript" language="javascript">
        // Creates a custom ulslog object
        // with the required properties.
        function ulsObject() {
            this.message = null;
            this.file = null;
            this.line = null;
            this.client = null;
            this.stack = null;
            this.team = null;
            this.originalFile = null;
        }
        // Detecting the browser to create the client information
        // in the required format.
        function getClientInfo() {
            var browserName = '';
            if (jQuery.browser.msie)
                browserName = "Internet Explorer";
            else if (jQuery.browser.mozilla)
                browserName = "Firefox";
            else if (jQuery.browser.safari)
                browserName = "Safari";
            else if (jQuery.browser.opera)
                browserName = "Opera";
            else
                browserName = "Unknown";
            var browserVersion = jQuery.browser.version;
            var browserLanguage = navigator.language;
            if (browserLanguage == undefined) {
                browserLanguage = navigator.userLanguage;
            }
            var client = "<client><browser name='{0}' version='{1}'></browser><language>{2}</language></client>";
            client = String.format(client, browserName, browserVersion, browserLanguage);
            return client;
        }
        // Utility function to assist string formatting.
        String.format = function () {
            var s = arguments[0];
            for (var i = 0; i < arguments.length - 1; i++) {
                var reg = new RegExp("\\{" + i + "\\}", "gm");
                s = s.replace(reg, arguments[i + 1]);
            }
            return s;
        }
        // Creates the callstack in the required format
        // using the caller function definition.
        function getCallStack(functionDef, depth) {
            if (functionDef != null) {
                var signature = '';
                functionDef = functionDef.toString();
                signature = functionDef.substring(0, functionDef.indexOf("{"));
                if (signature.indexOf("function") == 0) {
                    signature = signature.substring(8);
                }
                if (depth == 0) {
                    var stack = "<stack><function depth='0' signature='{0}'>{1}</function></stack>";
                    stack = String.format(stack, signature, functionDef);
                }
                else {
                    var stack = "<stack><function depth='1' signature='{0}'></function></stack>";
                    stack = String.format(stack, signature);
                }
                return stack;
            }
            return "";
        }
        // Creates the SOAP packet required by SendClientScriptErrorReport
        // web method.
        function generateErrorPacket(ulsObj) {
            var soapPacket = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                        "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
                                       "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                                       "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                          "<soap:Body>" +
                            "<SendClientScriptErrorReport " +
                              "xmlns=\"http://schemas.microsoft.com/sharepoint/diagnostics/\">" +
                              "<message>{0}</message>" +
                              "<file>{1}</file>" +
                              "<line>{2}</line>" +
                              "<stack>{3}</stack>" +
                              "<client>{4}</client>" +
                              "<team>{5}</team>" +
                              "<originalFile>{6}</originalFile>" +
                            "</SendClientScriptErrorReport>" +
                          "</soap:Body>" +
                        "</soap:Envelope>";

            soapPacket = String.format(soapPacket, encodeXmlString(ulsObj.message), encodeXmlString(ulsObj.file),
                 ulsObj.line, encodeXmlString(ulsObj.stack), encodeXmlString(ulsObj.client),
                 encodeXmlString(ulsObj.team), encodeXmlString(ulsObj.originalFile));
            return soapPacket;
        }
        // Utility function to encode special characters in XML.
        function encodeXmlString(txt) {
            txt = String(txt);
            txt = jQuery.trim(txt);
            txt = txt.replace(/&/g, "&amp;");
            txt = txt.replace(/</g, "&lt;");
            txt = txt.replace(/>/g, "&gt;");
            txt = txt.replace(/'/g, "&apos;");
            txt = txt.replace(/"/g, "&quot;");
            return txt;
        }
        // Function to form the Diagnostics service URL.
        function getWebSvcUrl() {
            var serverurl = location.href;
            if (serverurl.indexOf("?") != -1) {
                serverurl = serverurl.replace(location.search, '');
            }
            var index = serverurl.lastIndexOf("/");
            serverurl = serverurl.substring(0, index - 1);
            serverurl = serverurl.concat('/_vti_bin/diagnostics.asmx');
            return serverurl;
        }
        // Method to post the SOAP packet to the Diagnostic web service.
        function postMessageToULSSvc(soapPacket) {
            $(document).ready(function () {
                $.ajax({
                    url: getWebSvcUrl(),
                    type: "POST",
                    dataType: "xml",
                    data: soapPacket, //soap packet.
                    contentType: "text/xml; charset=\"utf-8\"",
                    success: handleResponse, // Invoke when the web service call is successful.
                    error: handleError// Invoke when the web service call fails.
                });
            });
        }
        // Invoked when the web service call succeeds.
        function handleResponse(data, textStatus, jqXHR) {
            // Custom code...
            alert('Successfully logged trace to ULS');
        }
        // Invoked when the web service call fails.
        function handleError(jqXHR, textStatus, errorThrown) {
            //Custom code...
            alert('Error occurred in executing the web request');
        }
        // Registering the ULS logging function on a global level.
        window.onerror = logErrorToULS;
        // Set default value for teamName.
        var teamName = "Custom SharePoint Application";
        // Further add the logErrorToULS method at the end of the script.
        // Function to log messages to Diagnostic web service.
        // Invoked by the window.onerror message.
        function logErrorToULS(msg, url, linenumber) {
            var ulsObj = new ulsObject();
            ulsObj.message = "Error occurred: " + msg;
            ulsObj.file = url.substring(url.lastIndexOf("/") + 1); // Get the current file name.
            ulsObj.line = linenumber;
            ulsObj.stack = getCallStack(logErrorToULS.caller); // Create error call stack.
            ulsObj.client = getClientInfo(); // Create client information.
            ulsObj.team = teamName; // Declared in the consumer script.
            ulsObj.originalFile = ulsObj.file;
            var soapPacket = generateErrorPacket(ulsObj); // Create the soap packet.
            postMessageToULSSvc(soapPacket); // Post to the web service.
            return true;
        }
        // Function to log message to Diagnostic web service.
        // Specifically invoked by a consumer method.
        function logMessageToULS(message, fileName) {
            if (message != null) {
                var ulsObj = new ulsObject();
                ulsObj.message = message;
                ulsObj.file = fileName;
                ulsObj.line = 0; // We don't know the line, so we set it to zero.
                ulsObj.stack = getCallStack(logMessageToULS.caller);
                ulsObj.client = getClientInfo();
                ulsObj.team = teamName;
                ulsObj.originalFile = ulsObj.file;
                var soapPacket = generateErrorPacket(ulsObj);
                postMessageToULSSvc(soapPacket);
            }
        }
    </script>
    <script type="text/javascript" language="javascript">
        var teamName = "Simple ULS Logging";
        function doWork() {
            unknownFunction();
            alert("unknownFunction");
        }
        function logMessage() {
            logMessageToULS('This is a trace message from CEWP', 'loggingsample.aspx');
            alert("logMessage");
        }
    </script>
</asp:Content>
<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
    <asp:Button ID="btn1" runat="server" Text="Log Exception" OnClientClick="return doWork();" />
    <asp:Button ID="btn2" runat="server" Text="Log Trance" OnClientClick="return logMessage();" />
</asp:Content>
<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
    Application Page
</asp:Content>
<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea"
    runat="server">
    My Application Page
</asp:Content>

No comments:

Post a Comment