import * as bunyan from 'bunyan'; import { WriteStream } from 'fs'; import { Middleware } from './middleware'; import { Request, Response } from '../http'; import { getLogger } from '../system'; /** * Logs requests and responses as JSON. * * @export * @class JSONLogger * @extends {Middleware} */ export class JSONLogger extends Middleware { /** * Reference to underlying bunyan logger. * * @private * @type {bunyan} * @memberof JSONLogger */ private log: bunyan; /** * Reference to underlying log level. * * @private * @type {string} * @memberof JSONLogger */ private level: string; /** * Creates an instance of JSONLogger. * @param {string} name * @param {string} [level='info'] * @memberof JSONLogger */ constructor(name: string, level: string='info') { super(); this.log = getLogger(name, level); } /** * Add a NodeJS.WriteStream stream to the list of log targets. * * @param {NodeJS.WriteStream} stream * @memberof JSONLogger */ addStream(stream: NodeJS.WriteStream) { let writeStream: bunyan.Stream = { level: this.level as bunyan.LogLevel, stream: stream }; this.log.addStream(writeStream as bunyan.Stream); } /** * Logs selected request values as JSON. * * @param {Request} req * @param {Response} res * @memberof JSONLogger */ processRequest = async (req: Request, res: Response) => { let msg = { id: req.id, path: req.path, query: req.query, params: req.params, method: req.method, body: req.body, }; this.log.info(msg); } /** * Logs selected response values as JSON. * * @param {Request} req * @param {Response} res * @returns {Promise} * @memberof JSONLogger */ processResponse = async (req: Request, res: Response) => { let msg = { id: req.id, code: res.code, body: res.body }; this.log.info(msg); } }