Skip to content

Commit

Permalink
express support: use req.originalUrl for "req" serializer (#575)
Browse files Browse the repository at this point in the history
  • Loading branch information
twelve17 authored and trentm committed Jul 8, 2020
1 parent 15547da commit 8a4bebf
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 63 deletions.
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ Known issues:

## not yet released

- [pull #575, #278] Change the default "req" serializer to accept expressjs's
`req.originalUrl` for the "url" field per
<https://expressjs.com/en/api.html#req.originalUrl>. (By @twelve17 and
@kingcody.)
- Development change: Switch to node-tap for testing (from nodeunit, which is
now obsolete). Currently just tap v9 because that is the last major version
of node-tap that supports back to node v0.10.
Expand Down
4 changes: 3 additions & 1 deletion lib/bunyan.js
Original file line number Diff line number Diff line change
Expand Up @@ -1092,7 +1092,9 @@ Logger.stdSerializers.req = function (req) {
return req;
return {
method: req.method,
url: req.url,
// Accept `req.originalUrl` for expressjs usage.
// https://expressjs.com/en/api.html#req.originalUrl
url: req.originalUrl || req.url,
headers: req.headers,
remoteAddress: req.connection.remoteAddress,
remotePort: req.connection.remotePort
Expand Down
111 changes: 49 additions & 62 deletions test/serializers.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,22 @@ CapturingStream.prototype.write = function (rec) {
this.recs.push(rec);
}


test('req serializer', function (t) {
var records = [];
var log = bunyan.createLogger({
function createLogger(serializers, records) {
return bunyan.createLogger({
name: 'serializer-test',
streams: [
{
stream: new CapturingStream(records),
type: 'raw'
}
],
serializers: {
req: bunyan.stdSerializers.req
}
serializers: serializers
});
}

test('req serializer', function (t) {
var records = [];
var log = createLogger({ req: bunyan.stdSerializers.req }, records);

// None of these should blow up.
var bogusReqs = [
Expand Down Expand Up @@ -78,20 +79,42 @@ test('req serializer', function (t) {
});


test('res serializer', function (t) {
test('req serializer - express.originalUrl', function (t) {
var records = [];
var log = bunyan.createLogger({
name: 'serializer-test',
streams: [
{
stream: new CapturingStream(records),
type: 'raw'
}
],
serializers: {
res: bunyan.stdSerializers.res
}
var log = createLogger({ req: bunyan.stdSerializers.req }, records);

// Get http request and response objects to play with and test.
var theReq, theRes;
var server = http.createServer(function (req, res) {
theReq = req;
theRes = res;
req.originalUrl = '/original-url' + req.url;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
})
server.listen(8765, function () {
http.get({host: '127.0.0.1', port: 8765, path: '/'}, function (res) {
res.resume();
log.info({req: theReq}, 'the request');
var lastRecord = records[records.length-1];
t.equal(lastRecord.req.method, 'GET');
t.equal(lastRecord.req.url, '/original-url' + theReq.url);
t.equal(lastRecord.req.remoteAddress,
theReq.connection.remoteAddress);
t.equal(lastRecord.req.remotePort, theReq.connection.remotePort);
server.close();
t.end();
}).on('error', function (err) {
t.ok(false, 'error requesting to our test server: ' + err);
server.close();
t.end();
});
});
});

test('res serializer', function (t) {
var records = [];
var log = createLogger({ res: bunyan.stdSerializers.res }, records);

// None of these should blow up.
var bogusRess = [
Expand Down Expand Up @@ -136,18 +159,7 @@ test('res serializer', function (t) {

test('err serializer', function (t) {
var records = [];
var log = bunyan.createLogger({
name: 'serializer-test',
streams: [
{
stream: new CapturingStream(records),
type: 'raw'
}
],
serializers: {
err: bunyan.stdSerializers.err
}
});
var log = createLogger({ err: bunyan.stdSerializers.err }, records);

// None of these should blow up.
var bogusErrs = [
Expand Down Expand Up @@ -186,18 +198,7 @@ test('err serializer: custom serializer', function (t) {
};
}

var log = bunyan.createLogger({
name: 'serializer-test',
streams: [
{
stream: new CapturingStream(records),
type: 'raw'
}
],
serializers: {
err: customSerializer
}
});
var log = createLogger({ err: customSerializer }, records);

var e1 = new Error('message1');
e1.beep = 'bop';
Expand All @@ -214,16 +215,7 @@ test('err serializer: custom serializer', function (t) {

test('err serializer: long stack', function (t) {
var records = [];
var log = bunyan.createLogger({
name: 'serializer-test',
streams: [ {
stream: new CapturingStream(records),
type: 'raw'
} ],
serializers: {
err: bunyan.stdSerializers.err
}
});
var log = createLogger({ err: bunyan.stdSerializers.err }, records);

var topErr, midErr, bottomErr;

Expand Down Expand Up @@ -301,19 +293,14 @@ test('err serializer: long stack', function (t) {
// serializers that don't handle an `undefined` value will blow up.
test('do not apply serializers if no record key', function (t) {
var records = [];
var log = bunyan.createLogger({
name: 'serializer-test',
streams: [ {
stream: new CapturingStream(records),
type: 'raw'
} ],
serializers: {
var log = createLogger({
err: bunyan.stdSerializers.err,
boom: function (value) {
throw new Error('boom');
}
}
});
},
records
);

log.info({foo: 'bar'}, 'record one');
log.info({err: new Error('record two err')}, 'record two');
Expand Down

0 comments on commit 8a4bebf

Please sign in to comment.