@@ -50,6 +50,8 @@ function getResponseHeaders(res) {
50
50
* the audit log object programmatically
51
51
* @param {boolean } [opts.printLog=true] - Whether to print the log
52
52
* via the logger.
53
+ * @param {Object } [opts.serializers] - Override the default logger serializers
54
+ * for err, req and res
53
55
* @returns {Function } Handler
54
56
* @fires audit when an audit log has been generated
55
57
* @example
@@ -175,6 +177,7 @@ function auditLogger(opts) {
175
177
assert . optionalFunc ( opts . context , 'opts.context' ) ;
176
178
assert . optionalObject ( opts . server , 'opts.server' ) ;
177
179
assert . optionalBool ( opts . printLog , 'opts.printLog' ) ;
180
+ assert . optionalObject ( opts . serializers , 'opts.serializers' ) ;
178
181
179
182
if (
180
183
opts . event !== 'after' &&
@@ -198,67 +201,80 @@ function auditLogger(opts) {
198
201
}
199
202
var errSerializer = bunyan . stdSerializers . err ;
200
203
204
+ // don't break legacy use, where there was no top level opts.serializer
201
205
if ( opts . log . serializers && opts . log . serializers . err ) {
202
206
errSerializer = opts . log . serializers . err ;
203
207
}
204
208
205
- var log = opts . log . child ( {
206
- audit : true ,
207
- component : opts . event ,
208
- serializers : {
209
- err : errSerializer ,
210
- req : function auditRequestSerializer ( req ) {
211
- if ( ! req ) {
212
- return false ;
213
- }
209
+ if ( opts . serializers && opts . serializers . err ) {
210
+ errSerializer = opts . serializers . err ;
211
+ }
214
212
215
- var timers = { } ;
216
- ( req . timers || [ ] ) . forEach ( function forEach ( time ) {
217
- var t = time . time ;
218
- var _t = Math . floor ( 1000000 * t [ 0 ] + t [ 1 ] / 1000 ) ;
219
- timers [ time . name ] = ( timers [ time . name ] || 0 ) + _t ;
220
- } ) ;
221
- return {
222
- // account for native and queryParser plugin usage
223
- query :
224
- typeof req . query === 'function'
225
- ? req . query ( )
226
- : req . query ,
227
- method : req . method ,
228
- url : req . url ,
229
- headers : req . headers ,
230
- httpVersion : req . httpVersion ,
231
- trailers : req . trailers ,
232
- version : req . version ( ) ,
233
- body : opts . body === true ? req . body : undefined ,
234
- timers : timers ,
235
- connectionState :
236
- req . connectionState && req . connectionState ( )
237
- } ;
238
- } ,
239
- res : function auditResponseSerializer ( res ) {
240
- if ( ! res ) {
241
- return false ;
242
- }
213
+ var reqSerializer = function auditRequestSerializer ( req ) {
214
+ if ( ! req ) {
215
+ return false ;
216
+ }
217
+
218
+ var timers = { } ;
219
+ ( req . timers || [ ] ) . forEach ( function forEach ( time ) {
220
+ var t = time . time ;
221
+ var _t = Math . floor ( 1000000 * t [ 0 ] + t [ 1 ] / 1000 ) ;
222
+ timers [ time . name ] = ( timers [ time . name ] || 0 ) + _t ;
223
+ } ) ;
224
+ return {
225
+ // account for native and queryParser plugin usage
226
+ query : typeof req . query === 'function' ? req . query ( ) : req . query ,
227
+ method : req . method ,
228
+ url : req . url ,
229
+ headers : req . headers ,
230
+ httpVersion : req . httpVersion ,
231
+ trailers : req . trailers ,
232
+ version : req . version ( ) ,
233
+ body : opts . body === true ? req . body : undefined ,
234
+ timers : timers ,
235
+ connectionState : req . connectionState && req . connectionState ( )
236
+ } ;
237
+ } ;
243
238
244
- var body ;
239
+ if ( opts . serializers && opts . serializers . req ) {
240
+ reqSerializer = opts . serializers . req ;
241
+ }
242
+
243
+ var resSerialzer = function auditResponseSerializer ( res ) {
244
+ if ( ! res ) {
245
+ return false ;
246
+ }
245
247
246
- if ( opts . body === true ) {
247
- if ( res . _body instanceof HttpError ) {
248
- body = res . _body . body ;
249
- } else {
250
- body = res . _body ;
251
- }
252
- }
248
+ var body ;
253
249
254
- return {
255
- statusCode : res . statusCode ,
256
- headers : getResponseHeaders ( res ) ,
257
- trailer : res . _trailer || false ,
258
- body : body
259
- } ;
250
+ if ( opts . body === true ) {
251
+ if ( res . _body instanceof HttpError ) {
252
+ body = res . _body . body ;
253
+ } else {
254
+ body = res . _body ;
260
255
}
261
256
}
257
+
258
+ return {
259
+ statusCode : res . statusCode ,
260
+ headers : getResponseHeaders ( res ) ,
261
+ trailer : res . _trailer || false ,
262
+ body : body
263
+ } ;
264
+ } ;
265
+
266
+ if ( opts . serializers && opts . serializers . res ) {
267
+ resSerialzer = opts . serializers . res ;
268
+ }
269
+
270
+ var log = opts . log . child ( {
271
+ audit : true ,
272
+ component : opts . event ,
273
+ serializers : {
274
+ err : errSerializer ,
275
+ req : reqSerializer ,
276
+ res : resSerialzer
277
+ }
262
278
} ) ;
263
279
264
280
function audit ( req , res , route , err ) {
0 commit comments