You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.2 KiB
80 lines
2.2 KiB
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;
|