forked from pinojs/pino-multi-stream
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
87 lines (71 loc) · 2.24 KB
/
index.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
'use strict'
const pino = require('pino')
const getPrettyStream = require('pino/lib/tools').getPrettyStream
const multistream = require('./multistream')
const {
streamSym,
setLevelSym,
getLevelSym,
levelValSym
} = pino.symbols
function pinoMultiStream (opts, stream) {
if (stream === undefined && opts && typeof opts.write === 'function') {
opts = { stream: opts }
}
const iopts = opts || {}
iopts.stream = iopts.stream || stream || process.stdout // same default of pino
// pretend it is Bunyan
const isBunyan = iopts.bunyan
delete iopts.bunyan
const toPino = Object.assign({}, iopts, { streams: undefined, stream: undefined })
if (Object.prototype.hasOwnProperty.call(iopts, 'streams') === true) {
return fixLevel(pino(toPino, multistream(iopts.streams)))
}
return fixLevel(pino(toPino, multistream({ stream: iopts.stream, level: iopts.level })))
function fixLevel (pino) {
pino.level = pino[streamSym].minLevel
// internal knowledge dependency
var setLevel = pino[setLevelSym]
pino[setLevelSym] = function (val) {
var prev = this[levelValSym]
// needed to support bunyan .level()
if (typeof val === 'function') {
val = this[levelValSym]
}
setLevel.call(this, val)
// to avoid child loggers changing the stream levels
// of parents
if (prev !== this[levelValSym]) {
this[streamSym] = this[streamSym].clone(this[levelValSym])
}
}
if (isBunyan) {
Object.defineProperty(pino, 'level', {
get: function () {
var that = this
return function (val) {
if (val !== undefined) {
that[setLevelSym](val)
}
return that[levelValSym]
}
},
set: pino[setLevelSym]
})
} else {
Object.defineProperty(pino, 'level', {
get: pino[getLevelSym],
set: pino[setLevelSym]
})
}
return pino
}
}
Object.assign(pinoMultiStream, pino)
pinoMultiStream.multistream = multistream
pinoMultiStream.prettyStream = (args = {}) => {
const prettyPrint = args.opts || args.prettyPrint
const { prettifier, dest = process.stdout } = args
return getPrettyStream(prettyPrint, prettifier, dest)
}
module.exports = pinoMultiStream