| 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; |