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;
}