Last active
March 13, 2025 07:11
-
-
Save tomdale/804906f1ab2794baa77a to your computer and use it in GitHub Desktop.
Excerpt of the formatted, hierarchical logger in Skylight
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Example usage: | |
import logger from "app/system/logger"; | |
var LOG = logger.loggerFor("topic"'); | |
LOG.log({ | |
event: "data received", | |
secondary: { | |
resource: "photo", | |
requestId: "1234" | |
}, | |
args: payload | |
}); | |
*/ | |
var DATE_FORMAT = 'MM/DD HH:mm:ss'; | |
var FONT_WEIGHT_NORMAL = "font-weight: normal;"; | |
var FONT_WEIGHT_BOLD = "font-weight: bold;"; | |
var COLOR_PURPLE = "color: purple;"; | |
var COLOR_RED = "color: red;"; | |
var COLOR_GREEN = "color: green;"; | |
var COLOR_BLUE = "color: blue;"; | |
function logFormatted(name, type, message, additional) { | |
var output = [], style = []; | |
var date = moment().format(DATE_FORMAT); | |
// Timestamp | |
output.push("%c[" + date +"] "); | |
if (type === "error") { | |
style.push(FONT_WEIGHT_BOLD + COLOR_RED); | |
} else { | |
style.push(FONT_WEIGHT_NORMAL); | |
} | |
// Name | |
output.push("%c" + name + " "); | |
style.push(FONT_WEIGHT_NORMAL + COLOR_PURPLE); | |
if (typeof message === 'string') { | |
// Simple Message | |
output.push("%c" + message); | |
style.push(FONT_WEIGHT_NORMAL); | |
} else { | |
// Structured Message | |
// Event Name | |
output.push("%c" + message.event); | |
style.push(FONT_WEIGHT_NORMAL + COLOR_RED); | |
// Secondary Information | |
var secondary = normalizeSecondary(message.secondary); | |
for (var idx = 0; idx < secondary.length; idx += 2) { | |
output.push(" %c" + secondary[idx]); | |
style.push(FONT_WEIGHT_NORMAL + COLOR_GREEN); | |
output.push("%c="); | |
style.push(FONT_WEIGHT_NORMAL); | |
output.push("%c" + secondary[idx+1]); | |
style.push(FONT_WEIGHT_NORMAL + COLOR_BLUE); | |
} | |
} | |
output = [output.join('')].concat(style); | |
var args = message.args; | |
if (args && args.length) { | |
console.groupCollapsed.apply(console, output); | |
console.log.apply(console, args); | |
console.groupEnd(); | |
} else { | |
console.log.apply(console, output); | |
} | |
if (additional) { console.log(additional); } | |
} | |
function normalizeSecondary(secondary) { | |
if (Ember.typeOf(secondary) === 'array') { | |
Ember.assert("Secondary arguments passed to the logger must have an even number of items. For example, ['foo=', bar].", secondary.length % 2 === 0); | |
return secondary; | |
} | |
var array = []; | |
for (var key in secondary) { | |
array.push(key); | |
array.push(secondary[key]); | |
} | |
return array; | |
} | |
var Logger = Ember.Object.extend({ | |
history: null, | |
verbose: false, | |
sendReports: true, | |
name: "default", | |
loggerFor: function(name) { | |
return Logger.create({ | |
parent: this, | |
name: name | |
}); | |
}, | |
setup: function() { | |
this.history = []; | |
this._log('useragent', window.navigator.userAgent); | |
return this; | |
}, | |
log: function(message) { | |
this._log('info', message); | |
}, | |
warn: function(message) { | |
this._log('warning', message); | |
}, | |
error: function(message) { | |
this._log('error', message); | |
}, | |
exception: function(error) { | |
var stacktrace = printStackTrace({ e: error }); | |
this._log('exception', error.message, { exception: error, trace: stacktrace }); | |
}, | |
report: function() { | |
if (!this.sendReports) { return; } | |
if (this.verbose) { console.log("Sending report to server."); } | |
return $.ajax('/internal/error.json', { | |
type: 'POST', | |
contentType: 'application/json', | |
data: JSON.stringify({ | |
error: { | |
history: this.history | |
} | |
}), | |
context: this, | |
success: function() { | |
if (this.verbose) { console.log("Report sent successfully."); } | |
}, | |
error: function() { | |
this.error("Unable to send error report to server."); | |
console.error("Unable to send error report to server."); | |
} | |
}); | |
}, | |
reportError: function(error) { | |
this.exception(error); | |
return this.report(); | |
}, | |
_log: function(type, message, additional, name) { | |
var parent = this.get('parent'); | |
if (!name) { | |
name = this.get('name'); | |
} | |
if (parent) { | |
parent._log(type, message, additional, name); | |
return; | |
} | |
var date = new Date(); | |
var item = { | |
name: name, | |
dateStr: date.toString(), | |
timestamp: date.getTime(), | |
type: type, | |
message: message | |
}; | |
if (additional) { | |
$.extend(item, additional); | |
} | |
this.history.push(item); | |
if (this.verbose) { | |
logFormatted(name, type, message, additional); | |
} | |
}, | |
}); | |
var logger = Logger.create().setup(); | |
export default logger; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment