Cross domain logging.
This class is a customization of the XHRClient to easily submit events generated on the browser to a remote server.
<script type="text/javascript" src="//code.jquery.com/jquery-1.9.1.min.js"></script> // avoid cross scheme access denied errors // http://stackoverflow.com/questions/8464262/access-is-denied-error-on-xdomainrequest <script type="text/javascript" src="//md.xsolon.net/logs/scripts/xsolon.xhrclient.js"></script> <script type="text/javascript" src="//md.xsolon.net/logs/scripts/xSolon.RemoteLogger.js"></script>
var instance = new xSolon.RemoteLogger({ Debug: true,ServiceUrl: "http://localhost:3490/log.ashx", // Define any custom properties to be added to every log entry LoggedBy: "Test Logger", Categories: ["Cat1", "Cat2"], Session: 'session', UserName:'username', DomainKey: "Test1" // DomainKey is used to filter events on the event viewer }); // instance of remote logger client.gotPostResponse = function (e) { // function to handle a respone from the server var caller= e.currentTarget; // xhr control caller.Log(caller.responseText); // send response to console }; instance.SendEntry({Message:'My event just fired'}); instance.SendEntry({ Message:'Another one', Time = new DateTime(), AdditionalProps: [{k:'key1',v:'val},{k:'key2',v:'val });
// v 0.1.0.2 xSolon.RemoteLogger = function (options) { // Logger class inherits from xSolon.XHRClient var me = new xSolon.XHRClient(options.ServiceUrl || "https://md.xsolon.net/logs/log.ashx"); // override OOTB Handler me.gotPostResponse = function (e) { // function to handle a respone from the server var client = e.currentTarget; // xhr control }; me.LogVerbose = function (message, method) { me.Log(message); me.RemoteLog({Message: message, Level:20}); }; me.PreProcessEntry = function (e) { // merge me.options, entry in that order var entry = $.extend({}, me.options, e); // set current date //entry.Time = new Date(); // add additional properties entry.Url = window.location.href; if (false) { // send local time, off by a few minutes EDT // var date = new Date().getTime(); // date = date + (-1 * d.getTimezoneOffset() * 60000); // Want to send local time instead of UTC? why? ----------------------------------------------- // https://bitbucket.org/pellepim/jstimezonedetect for automation if (typeof (jstz) != 'undefined') entry.Zone = jstz.determine().name(); else // Zone by name entry.Zone = "Georgetown"; // less acurate, multiple zones have same offset (inverse sign done on server side ;) //entry.Props.push({ "Name": "Zone", "Value": new Date().getTimezoneOffset().toString() }); // -------------------------------------------------------------------------------------------- } return entry; }; me.SendEntry = function (entry) { ///Sends a log entry to Remote Log Server. Sample object: {"Categories":["Category 1"],"Props":[{"Name":"UserName","Value":"Martin"}],"LoggedBy":"Caller","Level":20,"Message":"Sample Entry","Method":"Log","Time":"2013-03-28T01:11:11.431Z"} entry = me.PreProcessEntry(entry); var rawLog = JSON.stringify(entry); me.postUrl("", rawLog); }; // Init ---------------------------------------------------------------------------------------- me.options = { // Default values "LoggedBy": "Me", "Level": 20, "Message": "Sample Entry", "Method": "Log" }; if (options) { me.Debug = options.Debug || false; $.extend(true, me.options, options); } // -------------------------------------------------------------------------------------------- return me; }