9
9
const nullLogger = require ( 'abstract-logging' )
10
10
const pino = require ( 'pino' )
11
11
const { serializersSym } = pino . symbols
12
- const { FST_ERR_LOG_INVALID_DESTINATION } = require ( './errors' )
12
+ const {
13
+ FST_ERR_LOG_INVALID_DESTINATION ,
14
+ FST_ERR_LOG_INVALID_LOGGER
15
+ } = require ( './errors' )
13
16
14
- function createPinoLogger ( opts , stream ) {
15
- stream = stream || opts . stream
16
- delete opts . stream
17
-
18
- if ( stream && opts . file ) {
17
+ function createPinoLogger ( opts ) {
18
+ if ( opts . stream && opts . file ) {
19
19
throw new FST_ERR_LOG_INVALID_DESTINATION ( )
20
20
} else if ( opts . file ) {
21
21
// we do not have stream
22
- stream = pino . destination ( opts . file )
22
+ opts . stream = pino . destination ( opts . file )
23
23
delete opts . file
24
24
}
25
25
@@ -39,7 +39,7 @@ function createPinoLogger (opts, stream) {
39
39
opts . logger = prevLogger
40
40
opts . genReqId = prevGenReqId
41
41
} else {
42
- logger = pino ( opts , stream )
42
+ logger = pino ( opts , opts . stream )
43
43
}
44
44
45
45
return logger
@@ -70,50 +70,60 @@ function now () {
70
70
}
71
71
72
72
function createLogger ( options ) {
73
- if ( isValidLogger ( options . logger ) ) {
73
+ if ( ! options . logger ) {
74
+ const logger = nullLogger
75
+ logger . child = ( ) => logger
76
+ return { logger, hasLogger : false }
77
+ }
78
+
79
+ if ( validateLogger ( options . logger ) ) {
74
80
const logger = createPinoLogger ( {
75
81
logger : options . logger ,
76
82
serializers : Object . assign ( { } , serializers , options . logger . serializers )
77
83
} )
78
84
return { logger, hasLogger : true }
79
- } else if ( ! options . logger ) {
80
- const logger = nullLogger
81
- logger . child = ( ) => logger
82
- return { logger, hasLogger : false }
83
- } else {
84
- const localLoggerOptions = { }
85
- if ( Object . prototype . toString . call ( options . logger ) === '[object Object]' ) {
86
- Reflect . ownKeys ( options . logger ) . forEach ( prop => {
87
- Object . defineProperty ( localLoggerOptions , prop , {
88
- value : options . logger [ prop ] ,
89
- writable : true ,
90
- enumerable : true ,
91
- configurable : true
92
- } )
93
- } )
94
- }
95
- localLoggerOptions . level = localLoggerOptions . level || 'info'
96
- localLoggerOptions . serializers = Object . assign ( { } , serializers , localLoggerOptions . serializers )
97
- options . logger = localLoggerOptions
98
- const logger = createPinoLogger ( options . logger )
99
- return { logger, hasLogger : true }
100
85
}
101
- }
102
86
103
- function isValidLogger ( logger ) {
104
- if ( ! logger ) {
105
- return false
87
+ const localLoggerOptions = { }
88
+ if ( Object . prototype . toString . call ( options . logger ) === '[object Object]' ) {
89
+ Reflect . ownKeys ( options . logger ) . forEach ( prop => {
90
+ Object . defineProperty ( localLoggerOptions , prop , {
91
+ value : options . logger [ prop ] ,
92
+ writable : true ,
93
+ enumerable : true ,
94
+ configurable : true
95
+ } )
96
+ } )
106
97
}
98
+ localLoggerOptions . level = localLoggerOptions . level || 'info'
99
+ localLoggerOptions . serializers = Object . assign ( { } , serializers , localLoggerOptions . serializers )
100
+ options . logger = localLoggerOptions
101
+ const logger = createPinoLogger ( options . logger )
102
+ return { logger, hasLogger : true }
103
+ }
107
104
108
- let result = true
105
+ /**
106
+ * Determines if a provided logger object meets the requirements
107
+ * of a Fastify compatible logger.
108
+ *
109
+ * @param {object } logger Object to validate.
110
+ *
111
+ * @returns {boolean } `true` when the logger meets the requirements.
112
+ *
113
+ * @throws {FST_ERR_LOG_INVALID_LOGGER } When the logger object is
114
+ * missing required methods.
115
+ */
116
+ function validateLogger ( logger ) {
109
117
const methods = [ 'info' , 'error' , 'debug' , 'fatal' , 'warn' , 'trace' , 'child' ]
110
- for ( let i = 0 ; i < methods . length ; i += 1 ) {
111
- if ( ! logger [ methods [ i ] ] || typeof logger [ methods [ i ] ] !== 'function' ) {
112
- result = false
113
- break
114
- }
118
+ const missingMethods = methods . filter ( method => ! logger [ method ] || typeof logger [ method ] !== 'function' )
119
+
120
+ if ( ! missingMethods . length ) {
121
+ return true
122
+ } else if ( missingMethods . length === methods . length ) {
123
+ return false
124
+ } else {
125
+ throw FST_ERR_LOG_INVALID_LOGGER ( missingMethods . join ( ',' ) )
115
126
}
116
- return result
117
127
}
118
128
119
129
module . exports = {
0 commit comments