diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index 1abb4c8..410d119 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -7,7 +7,7 @@ module.exports = function (grunt) { }, main : { files : { - 'src/loggly.tracker-2.1.min.js' : ['src/loggly.tracker.js'] + 'src/loggly.tracker-2.2.min.js' : ['src/loggly.tracker.js'] } } } diff --git a/README.md b/README.md index 2058965..01613a4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ loggly-jslogger =============== -Client-side (browser) logger to use with Loggly gen2. Check out Loggly's [Javascript logging documentation](https://www.loggly.com/docs/javascript/) to learn more. +Client-side (browser) logger to use with Loggly gen2. Check out Loggly's [Javascript logging documentation](https://www.loggly.com/docs/javascript/) to learn more. Installation ------------ @@ -48,7 +48,7 @@ myBetterLogger.push({'logglyKey': 'your-customer-token' }); // push a loggly ke Send Console Errors to Loggly ---- -Keeping sendConsoleErrors value to true will send all the unhandled errors to the Loggly with the detailed information like error message, URL, line number and column number. This script also take cares of all the previously defined window.onerror functions. +Keeping sendConsoleErrors value to true will send all the unhandled errors to the Loggly with the detailed information like error message, URL, line number and column number. This script also take cares of all the previously defined window.onerror functions. Send Tags to Loggly ---- @@ -90,3 +90,17 @@ location /loggly/ { proxy_pass http://logs-01.loggly.com; } ``` + +Force HTTPS +---- + +If you don't want Loggly to detect what protocol to use and enforce https + +```Javascript +_LTracker.push({ + 'logglyKey': 'your-customer-token', + 'sendConsoleErrors' : true, + 'tag' : 'javascript-logs', + 'forceHTTPS':false +}); +``` \ No newline at end of file diff --git a/bower.json b/bower.json index a389243..61ccd70 100644 --- a/bower.json +++ b/bower.json @@ -5,9 +5,9 @@ "_target": "*", "_originalSource": "loggly-jslogger", "_direct": true, - "version": "3.0.0", + "version": "3.1.0", "description": "A Javascript client to send logs to Loggly.", - "main": "src/loggly.tracker.js", + "main": "src/loggly.tracker-2.2.min.js", "keywords": [ "loggly-jslogger", "jslogger", diff --git a/package.json b/package.json index 6dfae91..cf12751 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "loggly-jslogger", - "version": "2.1.0", + "version": "2.2.1", "description": "A Javascript client to send logs to Loggly.", "browser": "index.js", "repository": { @@ -12,7 +12,7 @@ "loggly-jslogger", "jslogger", "loggly", - "log" + "log" ], "license": "MIT", "devDependencies": { diff --git a/src/loggly.tracker-2.2.min.js b/src/loggly.tracker-2.2.min.js new file mode 100644 index 0000000..0edd5c0 --- /dev/null +++ b/src/loggly.tracker-2.2.min.js @@ -0,0 +1,2 @@ +!function(a,b){function c(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"==a?b:3&b|8;return c.toString(16)})}function d(){this.key=!1,this.sendConsoleErrors=!1,this.tag="jslogger",this.useDomainProxy=!1,this.forceHTTPS=!1}function e(a,b){a.key=b,a.setSession(),j(a)}function f(a,b){a.tag=b}function g(a,b){a.forceHTTPS=b}function h(a,b){a.useDomainProxy=b,j(a)}function i(b,c){if(b.sendConsoleErrors=c,b.sendConsoleErrors===!0){var d=a.onerror;a.onerror=function(c,e,f,g){b.push({category:"BrowserJsException",exception:{message:c,url:e,lineno:f,colno:g}}),d&&"function"==typeof d&&d.apply(a,arguments)}}}function j(b){1==b.useDomainProxy?b.inputUrl=k(b)+a.location.host+"/"+o+"/inputs/"+b.key+"/tag/"+b.tag:b.inputUrl=k(b)+(b.logglyCollectorDomain||l)+"/inputs/"+b.key+"/tag/"+b.tag}function k(a){return"http"+("https:"===b.location.protocol||a.forceHTTPS?"s":"")+"://"}var l="logs-01.loggly.com",m="logglytrackingsession",n=m.length+1,o="loggly";d.prototype={setSession:function(a){a?(this.session_id=a,this.setCookie(this.session_id)):this.session_id||(this.session_id=this.readCookie(),this.session_id||(this.session_id=c(),this.setCookie(this.session_id)))},push:function(a){var b=typeof a;if(a&&("object"===b||"string"===b)){var c=this;if("string"===b)a={text:a};else{if(a.logglyCollectorDomain)return void(c.logglyCollectorDomain=a.logglyCollectorDomain);if(void 0!==a.sendConsoleErrors&&i(c,a.sendConsoleErrors),a.tag&&f(c,a.tag),a.forceHTTPS&&g(c,a.forceHTTPS),a.useDomainProxy&&h(c,a.useDomainProxy),a.logglyKey)return void e(c,a.logglyKey);if(a.session_id)return void c.setSession(a.session_id)}c.key&&c.track(a)}},track:function(b){b.sessionId=this.session_id;try{var c=new XMLHttpRequest;c.open("POST",this.inputUrl,!0),c.setRequestHeader("Content-Type","text/plain"),c.send(JSON.stringify(b))}catch(c){a&&a.console&&"function"==typeof a.console.log&&(console.log("Failed to log to loggly because of this exception:\n"+c),console.log("Failed log data:",b))}},readCookie:function(){var a=b.cookie,c=a.indexOf(m);if(c<0)return!1;var d=a.indexOf(";",c+1);return d=d<0?a.length:d,a.slice(c+n,d)},setCookie:function(a){b.cookie=m+"="+a}};var p=a._LTracker,q=new d;if(p&&p.length){var r=0,s=p.length;for(r=0;r http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); - }); + }); } - + function LogglyTracker() { this.key = false; - this.sendConsoleErrors = false; + this.sendConsoleErrors = false; this.tag = 'jslogger'; this.useDomainProxy = false; + this.forceHTTPS = false; } - + function setKey(tracker, key) { tracker.key = key; tracker.setSession(); setInputUrl(tracker); } - - function setTag(tracker, tag){ - tracker.tag = tag; - } - + + function setTag(tracker, tag){ + tracker.tag = tag; + } + + function setForceHTTPS(tracker, forceHTTPS){ + tracker.forceHTTPS = forceHTTPS; + } + function setDomainProxy(tracker, useDomainProxy){ tracker.useDomainProxy = useDomainProxy; //refresh inputUrl value setInputUrl(tracker); } - + function setSendConsoleError(tracker, sendConsoleErrors) { tracker.sendConsoleErrors = sendConsoleErrors; - + if(tracker.sendConsoleErrors === true){ var _onerror = window.onerror; //send console error messages to Loggly window.onerror = function (msg, url, line, col){ - tracker.push({ + tracker.push({ category: 'BrowserJsException', exception: { message: msg, @@ -52,36 +56,40 @@ colno: col, } }); - + if (_onerror && typeof _onerror === 'function') { _onerror.apply(window, arguments); } }; } } - + function setInputUrl(tracker) { - + if(tracker.useDomainProxy == true){ - tracker.inputUrl = LOGGLY_INPUT_PREFIX + tracker.inputUrl = getInputPrefix(tracker) + window.location.host + '/' + LOGGLY_PROXY_DOMAIN + '/inputs/' - + tracker.key + + tracker.key + '/tag/' + tracker.tag; } else{ - tracker.inputUrl = LOGGLY_INPUT_PREFIX + tracker.inputUrl = getInputPrefix(tracker) + (tracker.logglyCollectorDomain || LOGGLY_COLLECTOR_DOMAIN) + '/inputs/' - + tracker.key + + tracker.key + '/tag/' + tracker.tag; } } - + + function getInputPrefix(tracker){ + return 'http' + ('https:' === document.location.protocol || tracker.forceHTTPS ? 's' : '') + '://'; + } + LogglyTracker.prototype = { setSession: function(session_id) { if(session_id) { @@ -97,14 +105,14 @@ }, push: function(data) { var type = typeof data; - + if( !data || !(type === 'object' || type === 'string') ) { return; } - + var self = this; - - + + if(type === 'string') { data = { 'text': data @@ -114,49 +122,53 @@ self.logglyCollectorDomain = data.logglyCollectorDomain; return; } - - if(data.sendConsoleErrors !== undefined) { - setSendConsoleError(self, data.sendConsoleErrors); + + if(data.sendConsoleErrors !== undefined) { + setSendConsoleError(self, data.sendConsoleErrors); } - - if(data.tag) { + + if(data.tag) { setTag(self, data.tag); } - - if(data.useDomainProxy){ + + if(data.forceHTTPS) { + setForceHTTPS(self, data.forceHTTPS); + } + + if(data.useDomainProxy){ setDomainProxy(self, data.useDomainProxy); } - + if(data.logglyKey) { setKey(self, data.logglyKey); return; } - + if(data.session_id) { self.setSession(data.session_id); return; } } - + if(!self.key) { return; } - + self.track(data); - - + + }, track: function(data) { // inject session id data.sessionId = this.session_id; - + try { //creating an asynchronous XMLHttpRequest var xmlHttp = new XMLHttpRequest(); - xmlHttp.open('POST', this.inputUrl, true); //true for asynchronous request - xmlHttp.setRequestHeader('Content-Type', 'text/plain'); - xmlHttp.send(JSON.stringify(data)); - + xmlHttp.open('POST', this.inputUrl, true); //true for asynchronous request + xmlHttp.setRequestHeader('Content-Type', 'text/plain'); + xmlHttp.send(JSON.stringify(data)); + } catch (ex) { if (window && window.console && typeof window.console.log === 'function') { console.log("Failed to log to loggly because of this exception:\n" + ex); @@ -182,11 +194,11 @@ document.cookie = LOGGLY_SESSION_KEY + '=' + value; } }; - + var existing = window._LTracker; - + var tracker = new LogglyTracker(); - + if(existing && existing.length ) { var i = 0, eLength = existing.length; @@ -194,9 +206,9 @@ tracker.push(existing[i]); } } - + window._LTracker = tracker; // default global tracker - + window.LogglyTracker = LogglyTracker; // if others want to instantiate more than one tracker - + })(window, document);