forked from pinojs/pino-http
-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.js
107 lines (88 loc) · 2.35 KB
/
logger.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
'use strict'
var pino = require('pino')
function pinoLogger (opts, stream) {
if (opts && opts._writableState) {
stream = opts
opts = null
}
opts = opts || {}
opts.serializers = opts.serializers || {}
opts.serializers.req = opts.serializers.req || asReqValue
opts.serializers.res = opts.serializers.res || pino.stdSerializers.res
opts.serializers.err = opts.serializers.err || pino.stdSerializers.err
var useLevel = opts.useLevel || 'info'
delete opts.useLevel
var theStream = opts.stream || stream
delete opts.stream
var logger = wrapChild(opts, theStream)
var genReqId = reqIdGenFactory(opts.genReqId)
loggingMiddleware.logger = logger
return loggingMiddleware
function onResFinished (err) {
this.removeListener('finish', onResFinished)
this.removeListener('error', onResFinished)
var log = this.log
var responseTime = Date.now() - this.startTime
if (err) {
log.error({
res: this,
err: err,
responseTime: responseTime
}, 'request errored')
return
}
log[useLevel]({
res: this,
responseTime: responseTime
}, 'request completed')
}
function loggingMiddleware (req, res, next) {
req.id = genReqId(req)
req.log = res.log = logger.child({req: req})
res.startTime = Date.now()
if (!req.res) { req.res = res }
res.on('finish', onResFinished)
res.on('error', onResFinished)
if (next) {
next()
}
}
}
function asReqValue (req) {
return {
id: req.id,
method: req.method,
url: req.url,
headers: req.headers,
remoteAddress: req.connection.remoteAddress,
remotePort: req.connection.remotePort
}
}
function wrapChild (opts, stream) {
var prevLogger = opts.logger
var prevGenReqId = opts.genReqId
var logger = null
if (prevLogger) {
opts.logger = undefined
opts.genReqId = undefined
logger = prevLogger.child(opts)
opts.logger = prevLogger
opts.genReqId = prevGenReqId
} else {
logger = pino(opts, stream)
}
return logger
}
function reqIdGenFactory (func) {
if (typeof func === 'function') return func
var maxInt = 2147483647
var nextReqId = 0
return function genReqId (req) {
return req.id || (nextReqId = (nextReqId + 1) & maxInt)
}
}
module.exports = pinoLogger
module.exports.stdSerializers = {
req: asReqValue,
res: pino.stdSerializers.res
}