mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
* 🎨 rotation config - every parameter is configureable - increase default number of files to 100 * 🎨 ghost.log location - example: content/logs/http___my_ghost_blog_com_ghost.log - user can change the path to something custom by setting logging.path * 🛠 add response-time as dependency * 🎨 readable PrettyStream - tidy up - generic handling (was important to support more use cases, for example: logging.info({ anyKey: anyValue })) - common log format - less code 🕵🏻 * 🎨 GhostLogger cleanup - remove setLoggers -> this function had too much of redundant code - instead: add smart this.log function - remove logging.request (---> GhostLogger just forwards the values, it doesn't matter if that is a request or not a request) - make .warn .debug .info .error small and smart * 🎨 app.js: add response time as middleware and remove logging.request * 🎨 setStdoutStream and setFileStream - redesign GhostLogger to add CustomLoggers very easily ----> Example CustomLogger function CustomLogger(options) { // Base iterates over defined transports // EXAMPLE: ['stdout', 'elasticsearch'] Base.call(this, options); } util.inherits(...); // OVERRIDE default stdout stream and your own!!! CustomLogger.prototype.setStdoutStream = function() {} // add a new stream // get's called automatically when transport elasticsearch is defined CustomLogger.prototype.setElasticsearchStream = function() {} * 🎨 log into multiple file by default - content/logs/domain.error.log --> contains only the errors - content/logs/domain.log --> contains everything - rotation for both files * 🔥 remove logging.debug and use npm debug only * ✨ shortcuts for mode and level * 🎨 jshint/jscs * 🎨 stdout as much as possible for an error * 🎨 fix tests * 🎨 remove req.ip from log output, remove response-time dependency * 🎨 create middleware for logging - added TODO to move logging middleware to ignition
185 lines
6.8 KiB
JavaScript
185 lines
6.8 KiB
JavaScript
var GhostPrettyStream = require('../../../server/logging/PrettyStream'),
|
|
should = require('should');
|
|
|
|
should.equal(true, true);
|
|
|
|
describe('PrettyStream', function () {
|
|
describe('short mode', function () {
|
|
it('data.msg', function (done) {
|
|
var ghostPrettyStream = new GhostPrettyStream({mode: 'short'});
|
|
|
|
ghostPrettyStream.emit = function (eventName, data) {
|
|
data.should.eql('[2016-07-01 00:00:00] \u001b[36mINFO\u001b[39m Ghost starts now.\n');
|
|
done();
|
|
};
|
|
|
|
ghostPrettyStream.write(JSON.stringify({
|
|
time: '2016-07-01 00:00:00',
|
|
level: 30,
|
|
msg: 'Ghost starts now.'
|
|
}));
|
|
});
|
|
|
|
it('data.err', function (done) {
|
|
var ghostPrettyStream = new GhostPrettyStream({mode: 'short'});
|
|
|
|
ghostPrettyStream.emit = function (eventName, data) {
|
|
data.should.eql('[2016-07-01 00:00:00] \u001b[31mERROR\u001b[39m\n\u001b[31m\n\u001b[31mHey Jude!\u001b[39m\n\u001b[37mstack\u001b[39m\n\u001b[39m\n');
|
|
done();
|
|
};
|
|
|
|
ghostPrettyStream.write(JSON.stringify({
|
|
time: '2016-07-01 00:00:00',
|
|
level: 50,
|
|
err: {
|
|
message: 'Hey Jude!',
|
|
stack: 'stack'
|
|
}
|
|
}));
|
|
});
|
|
|
|
it('data.req && data.res', function (done) {
|
|
var ghostPrettyStream = new GhostPrettyStream({mode: 'short'});
|
|
|
|
ghostPrettyStream.emit = function (eventName, data) {
|
|
data.should.eql('\u001b[36mINFO\u001b[39m [2016-07-01 00:00:00] "GET /test" 200 39ms\n');
|
|
done();
|
|
};
|
|
|
|
ghostPrettyStream.write(JSON.stringify({
|
|
time: '2016-07-01 00:00:00',
|
|
level: 30,
|
|
req: {
|
|
originalUrl: '/test',
|
|
method: 'GET',
|
|
body: {
|
|
a: 'b'
|
|
}
|
|
},
|
|
res: {
|
|
statusCode: 200,
|
|
responseTime: '39ms'
|
|
}
|
|
}));
|
|
});
|
|
|
|
it('data.req && data.res && data.err', function (done) {
|
|
var ghostPrettyStream = new GhostPrettyStream({mode: 'short'});
|
|
|
|
ghostPrettyStream.emit = function (eventName, data) {
|
|
data.should.eql('\u001b[31mERROR\u001b[39m [2016-07-01 00:00:00] "GET /test" 400 39ms\n\u001b[31m\n\u001b[31mmessage\u001b[39m\n\u001b[37mstack\u001b[39m\n\u001b[39m\n');
|
|
done();
|
|
};
|
|
|
|
ghostPrettyStream.write(JSON.stringify({
|
|
time: '2016-07-01 00:00:00',
|
|
level: 50,
|
|
req: {
|
|
originalUrl: '/test',
|
|
method: 'GET',
|
|
body: {
|
|
a: 'b'
|
|
}
|
|
},
|
|
res: {
|
|
statusCode: 400,
|
|
responseTime: '39ms'
|
|
},
|
|
err: {
|
|
message: 'message',
|
|
stack: 'stack'
|
|
}
|
|
}));
|
|
});
|
|
});
|
|
|
|
describe('long mode', function () {
|
|
it('data.msg', function (done) {
|
|
var ghostPrettyStream = new GhostPrettyStream({mode: 'long'});
|
|
|
|
ghostPrettyStream.emit = function (eventName, data) {
|
|
data.should.eql('[2016-07-01 00:00:00] \u001b[36mINFO\u001b[39m Ghost starts now.\n');
|
|
done();
|
|
};
|
|
|
|
ghostPrettyStream.write(JSON.stringify({
|
|
time: '2016-07-01 00:00:00',
|
|
level: 30,
|
|
msg: 'Ghost starts now.'
|
|
}));
|
|
});
|
|
|
|
it('data.err', function (done) {
|
|
var ghostPrettyStream = new GhostPrettyStream({mode: 'long'});
|
|
|
|
ghostPrettyStream.emit = function (eventName, data) {
|
|
data.should.eql('[2016-07-01 00:00:00] \u001b[31mERROR\u001b[39m\n\u001b[31m\n\u001b[31mHey Jude!\u001b[39m\n\u001b[37mstack\u001b[39m\n\u001b[39m\n\u001b[90m\u001b[39m\n');
|
|
done();
|
|
};
|
|
|
|
ghostPrettyStream.write(JSON.stringify({
|
|
time: '2016-07-01 00:00:00',
|
|
level: 50,
|
|
err: {
|
|
message: 'Hey Jude!',
|
|
stack: 'stack'
|
|
}
|
|
}));
|
|
});
|
|
|
|
it('data.req && data.res', function (done) {
|
|
var ghostPrettyStream = new GhostPrettyStream({mode: 'long'});
|
|
|
|
ghostPrettyStream.emit = function (eventName, data) {
|
|
data.should.eql('\u001b[36mINFO\u001b[39m [2016-07-01 00:00:00] "GET /test" 200 39ms\n\u001b[90m\n\u001b[33mREQ\u001b[39m\n\u001b[32mip: \u001b[39m 127.0.01\n\u001b[32moriginalUrl: \u001b[39m/test\n\u001b[32mmethod: \u001b[39m GET\n\u001b[32mbody: \u001b[39m\n \u001b[32ma: \u001b[39mb\n\n\u001b[33mRES\u001b[39m\n\u001b[32mresponseTime: \u001b[39m39ms\n\u001b[39m\n');
|
|
done();
|
|
};
|
|
|
|
ghostPrettyStream.write(JSON.stringify({
|
|
time: '2016-07-01 00:00:00',
|
|
level: 30,
|
|
req: {
|
|
ip: '127.0.01',
|
|
originalUrl: '/test',
|
|
method: 'GET',
|
|
body: {
|
|
a: 'b'
|
|
}
|
|
},
|
|
res: {
|
|
statusCode: 200,
|
|
responseTime: '39ms'
|
|
}
|
|
}));
|
|
});
|
|
|
|
it('data.req && data.res && data.err', function (done) {
|
|
var ghostPrettyStream = new GhostPrettyStream({mode: 'long'});
|
|
|
|
ghostPrettyStream.emit = function (eventName, data) {
|
|
data.should.eql('\u001b[31mERROR\u001b[39m [2016-07-01 00:00:00] "GET /test" 400 39ms\n\u001b[31m\n\u001b[31mHey Jude!\u001b[39m\n\u001b[37mstack\u001b[39m\n\u001b[39m\n\u001b[90m\n\u001b[33mREQ\u001b[39m\n\u001b[32moriginalUrl: \u001b[39m/test\n\u001b[32mmethod: \u001b[39m GET\n\u001b[32mbody: \u001b[39m\n \u001b[32ma: \u001b[39mb\n\n\u001b[33mRES\u001b[39m\n\u001b[32mresponseTime: \u001b[39m39ms\n\u001b[39m\n');
|
|
done();
|
|
};
|
|
|
|
ghostPrettyStream.write(JSON.stringify({
|
|
time: '2016-07-01 00:00:00',
|
|
level: 50,
|
|
req: {
|
|
originalUrl: '/test',
|
|
method: 'GET',
|
|
body: {
|
|
a: 'b'
|
|
}
|
|
},
|
|
res: {
|
|
statusCode: 400,
|
|
responseTime: '39ms'
|
|
},
|
|
err: {
|
|
message: 'Hey Jude!',
|
|
stack: 'stack'
|
|
}
|
|
}));
|
|
});
|
|
});
|
|
});
|