gelfy
Version:
GELF (Graylog Extended Log Format) Integrations for Node.js Logging Libraries
59 lines (52 loc) • 2.08 kB
JavaScript
export default class BunyanAdapter {
constructor(gelfStream) {
this.stream = gelfStream;
this.gelfClient = this.stream.client;
}
/**
* Map bunyan log level to GELF log level
* @param {number} bunyanLevel
* @returns {number}
*/
mapGelfLevel(bunyanLevel) {
const gelfLevel = this.gelfClient.config.levels;
switch (bunyanLevel) {
case 10: return gelfLevel.debug;
case 20: return gelfLevel.debug;
case 30: return gelfLevel.info;
case 40: return gelfLevel.warning;
case 50: return gelfLevel.error;
case 60: return gelfLevel.emergency;
default: return gelfLevel.warning;
}
}
createTransformer() {
return (log) => {
const ignoreFields = ['msg', 'hostname', 'v'];
const gelfMsg = {
time: +new Date(log.time) / 1000,
short_message: log.msg,
facility: log.name,
host: log.hostname,
bunyan_level: log.level,
level: this.mapGelfLevel(log.level)
};
if (log.err && log.err.stack) {
const errFile = log.err.stack.match(/\n\s+at .+ \(([^:]+):([0-9]+)/);
if (errFile) {
if (typeof errFile[1] === 'string' && errFile[1].trim()) gelfMsg.file = errFile[1]; // eslint-disable-line prefer-destructuring
if (typeof errFile[2] === 'string' && errFile[1].trim()) gelfMsg.line = errFile[2]; // eslint-disable-line prefer-destructuring
}
}
// TODO: Improve this using `reduce`
for (const key in log) { // eslint-disable-line no-restricted-syntax
if (Object.hasOwnProperty.call(log, key)) {
if (ignoreFields.indexOf(key) < 0 && !Object.hasOwnProperty.call(gelfMsg, key)) {
gelfMsg[key] = log[key];
}
}
}
return gelfMsg;
};
}
}