const flatted = require('flatted'); const levels = require('./levels'); /** * @name LoggingEvent * @namespace Log4js */ class LoggingEvent { /** * Models a logging event. * @constructor * @param {string} categoryName name of category * @param {Log4js.Level} level level of message * @param {Array} data objects to log * @author Seth Chisamore */ constructor(categoryName, level, data, context, location) { this.startTime = new Date(); this.categoryName = categoryName; this.data = data; this.level = level; this.context = Object.assign({}, context); this.pid = process.pid; if (location) { this.functionName = location.functionName; this.fileName = location.fileName; this.lineNumber = location.lineNumber; this.columnNumber = location.columnNumber; this.callStack = location.callStack; } } serialise() { const logData = this.data.map((e) => { // JSON.stringify(new Error('test')) returns {}, which is not really useful for us. // The following allows us to serialize errors correctly. if (e && e.message && e.stack) { e = Object.assign({ message: e.message, stack: e.stack }, e); } return e; }); this.data = logData; return flatted.stringify(this); } static deserialise(serialised) { let event; try { const rehydratedEvent = flatted.parse(serialised); rehydratedEvent.data = rehydratedEvent.data.map((e) => { if (e && e.message && e.stack) { const fakeError = new Error(e); Object.keys(e).forEach((key) => { fakeError[key] = e[key]; }); e = fakeError; } return e; }); event = new LoggingEvent( rehydratedEvent.categoryName, levels.getLevel(rehydratedEvent.level.levelStr), rehydratedEvent.data, rehydratedEvent.context ); event.startTime = new Date(rehydratedEvent.startTime); event.pid = rehydratedEvent.pid; event.cluster = rehydratedEvent.cluster; } catch (e) { event = new LoggingEvent( 'log4js', levels.ERROR, ['Unable to parse log:', serialised, 'because: ', e] ); } return event; } } module.exports = LoggingEvent;