Name: js-handler/node_modules/restify/lib/plugins/audit.js 
1:
// Copyright 2012 Mark Cavage, Inc.  All rights reserved.
2:
 
3:
var assert = require('assert-plus');
4:
var bunyan = require('bunyan');
5:
 
6:
var HttpError = require('../errors').HttpError;
7:
 
8:
 
9:
///--- API
10:
 
11:
/**
12:
 * Returns a Bunyan audit logger suitable to be used in a server.on('after')
13:
 * event.  I.e.:
14:
 *
15:
 * server.on('after', restify.auditLogger({ log: myAuditStream }));
16:
 *
17:
 * This logs at the INFO level.
18:
 *
19:
 * @param {Object} options at least a bunyan logger (log).
20:
 * @return {Function} to be used in server.after.
21:
 */
22:
function auditLogger(options) {
23:
        assert.object(options, 'options');
24:
        assert.object(options.log, 'options.log');
25:
 
26:
        var log = options.log.child({
27:
                audit: true,
28:
                serializers: {
29:
                        err: bunyan.stdSerializers.err,
30:
                        req: function auditRequestSerializer(req) {
31:
                                if (!req)
32:
                                        return (false);
33:
 
34:
                                return ({
35:
                                        method: req.method,
36:
                                        url: req.url,
37:
                                        headers: req.headers,
38:
                                        httpVersion: req.httpVersion,
39:
                                        trailers: req.trailers,
40:
                                        version: req.version,
41:
                                        body: options.body === true ?
42:
                                                req.body : undefined
43:
                                });
44:
                        },
45:
                        res: function auditResponseSerializer(res) {
46:
                                if (!res)
47:
                                        return (false);
48:
 
49:
 
50:
                                var body;
51:
                                if (options.body === true) {
52:
                                        if (res._body instanceof HttpError) {
53:
                                                body = res._body.body;
54:
                                        } else {
55:
                                                body = res._body;
56:
                                        }
57:
                                }
58:
 
59:
                                return ({
60:
                                        statusCode: res.statusCode,
61:
                                        headers: res._headers,
62:
                                        trailer: res._trailer || false,
63:
                                        body: body
64:
                                });
65:
                        }
66:
                }
67:
        });
68:
 
69:
        function audit(req, res, route, err) {
70:
                var latency = res.get('Response-Time');
71:
                if (typeof (latency) !== 'number')
72:
                        latency = Date.now() - req._time;
73:
 
74:
                var obj = {
75:
                        remoteAddress: req.connection.remoteAddress,
76:
                        remotePort: req.connection.remotePort,
77:
                        req_id: req.getId(),
78:
                        req: req,
79:
                        res: res,
80:
                        err: err,
81:
                        latency: latency,
82:
                        secure: req.secure,
83:
                        _audit: true
84:
                };
85:
 
86:
                log.info(obj, 'handled: %d', res.statusCode);
87:
 
88:
                return (true);
89:
        }
90:
 
91:
        return (audit);
92:
}
93:
 
94:
 
95:
 
96:
///-- Exports
97:
 
98:
module.exports = auditLogger;