beaver-logger
Front-end logger, which will:
- Buffer your front-end logs and periodically send them to the server side
- Allow you to log page transitions and gather performance stats
- Automatically log window performance stats, where available, and watch for event loop delays
- Automatically flush logs for any errors or warnings
This is a great tool to use if you want to do logging on the client side in the same way you do on the server, without worrying about sending off a million beacons. You can quickly get an idea of what's going on on your client, including error cases, page transitions, or anything else you care to log!
Overview
Basic logging
$logger.info(<event>, <payload>);
Queues a log. Options are debug
, info
, warn
, error
.
For example:
$logger.error('something_went_wrong', { error: err.toString() })
$logger.track(<payload>);
Call this to attach general tracking information to the current page. This is useful if the data is not associated with a specific event, and will be sent to the server the next time the logs are flushed.
Transitions
$logger.startTransition();
Call this when you start an ajax call or some other loading period, with the intention of moving to another page.
$logger.endTransition(<nextStateName>);
Call this when you transition to the next page. beaver-logger will automatically log the transition, and how long it took. The logs will be auto-flushed after this call.
$logger.transition(<nextStateName>);
This is a short-hand for logger.startTransition(); $logger.endTransition(<nextStateName>);
when there is no loading time, and the transition from one state to another is instant. The logs will be auto-flushed after this call.
Initialization and configuration
$logger.init(<config>);
Set the logger up with your configuration options. This is optional. Configuration options are listed below.
Advanced
$logger.addMetaBuilder(<function>);
Attach a method which is called and will attach general information to the logging payload whenever the logs are flushed
$logger.addMetaBuilder(function() {
return {
current_page: getMyCurrentPage()
};
});
$logger.addPayloadBuilder(<function>);
Attach a method which is called and will attach values to each individual log's payload whenever the logs are flushed
$logger.addPayloadBuilder(function() {
return {
performance_ts: window.performance.now()
};
});
$logger.addTrackingBuilder(<function>);
Attach a method which is called and will attach values to each individual log's tracking whenever the logs are flushed
$logger.addTrackingBuilder(function() {
return {
pageLoadTime: getPageLoadTime()
};
});
Attach a method which is called and will attach values to each individual log requests' headers whenever the logs are flushed
$logger.addHeaderBuilder(function() {
return {
'x-csrf-token': getCSRFToken()
};
});
$logger.flush();
Flushes the logs to the server side. Recommended you don't call this manually, as it will happen automatically on page transitions, or after a configured interval.
Installing
npm install --save beaver-logger
or bower install --save beaver-logger
<script src="/js/beaver-logger.min.js"></script>
or
let $logger = require('beaver-logger');
Front-End Configuration
$logger.init({
uri: '/api/log',
initial_state_name: 'init',
flushInterval: 10 * 60 * 1000,
debounceInterval: 10,
sizeLimit: 300,
silent: false,
heartbeat: true,
heartbeatInterval: 5000,
heartbeatMaxThreshold: 50,
heartbeatTooBusy: false,
heartbeatTooBusyThreshold: 10000,
autoLog: ['warn', 'error'],
logUnload: true,
logUnloadSync: false,
logPerformance: true
});
Server Side
beaver-logger includes a small node endpoint which will automatically accept the logs sent from the client side. You can mount this really easily:
let beaverLogger = require('beaver-logger/server');
myapp.use(beaverLogger.expressEndpoint({
uri: '/api/log',
logger: myLogger,
enableCors: false
}))
Or if you're using kraken, you can add this in your config.json
as a middleware:
"beaver-logger": {
"priority": 106,
"module": {
"name": "beaver-logger/server",
"method": "expressEndpoint",
"arguments": [
{
"uri": "/api/log",
"logger": "require:my-custom-logger-module"
}
]
}
}
Custom backend logger
Setting up a custom logger is really easy, if you need to transmit these logs to some backend logging service rather than just logging them to your server console:
module.exports = {
log: function(req, level, event, payload) {
logSocket.send(JSON.stringify({
level: level,
event: event,
payload: payload
}));
}
}
Data Flow
