Skip to content

Commit

Permalink
feat(logger): use on-finished to get final response result
Browse files Browse the repository at this point in the history
  • Loading branch information
yidinghan committed Apr 24, 2017
1 parent 18521af commit a21cfc2
Showing 1 changed file with 38 additions and 7 deletions.
45 changes: 38 additions & 7 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
/* eslint no-param-reassign: 0 */
const winston = require('winston');
const get = require('lodash.get');
const set = require('lodash.set');
const unset = require('lodash.unset');
const onFinished = require('on-finished');
const { format } = require('util');

/**
Expand Down Expand Up @@ -165,30 +167,59 @@ exports.serializer = {
},
};

exports.getLogLevel = (statusCode = 200, defaultLevel = 'info') => {
switch (parseInt(statusCode / 100, 10)) {
case 5:
return 'error';
case 4:
return 'warn';
default:
return defaultLevel;
}
};

exports.logger = (payload = {}) => {
const {
transports = [new winston.transports.Console({ json: true })],
level = 'info',
msg = 'HTTP %s %s',
} = payload;

const logger = payload.logger || new winston.Logger({
transports,
});
const logger =
payload.logger ||
new winston.Logger({
transports,
});
const reqSerializer = exports.serializer.req(payload);
const resSerializer = exports.serializer.res(payload);

const onResponseFinished = (ctx, loggerMsg, meta) => {
meta.res = resSerializer(ctx.response);
meta.duration = Date.now() - meta.started_at;

const logLevel = exports.getLogLevel(meta.res.status, level);
logger[logLevel](loggerMsg, meta);
};

return async (ctx, next) => {
const meta = {
req: reqSerializer(ctx.request),
started_at: Date.now(),
};
const loggerMsg = format(msg, meta.req.method, meta.req.url);

await next();
let error;
try {
await next();
} catch (e) {
// catch and throw it later
error = e;
} finally {
onFinished(ctx.response, onResponseFinished.bind(null, ctx, loggerMsg, meta));
}

meta.res = resSerializer(ctx.response);
meta.duration = Date.now() - meta.started_at;
logger[level](loggerMsg, meta);
if (error) {
throw error;
}
};
};

0 comments on commit a21cfc2

Please sign in to comment.