@@ -8,8 +8,43 @@ const pino = require('pino');
88const multistream = require ( 'pino-multi-stream' ) . multistream ;
99const serializers = require ( './serializers' ) ;
1010
11+ const levels = {
12+ silent : Infinity ,
13+ fatal : 60 ,
14+ error : 50 ,
15+ warn : 40 ,
16+ info : 30 ,
17+ debug : 20 ,
18+ trace : 10 ,
19+ } ;
20+
1121// options.disableFields = ['error.stack'];
1222
23+ const maxLevelWrite = function ( data ) {
24+ let dest ;
25+ let stream ;
26+ const needsMetadata = Symbol . for ( 'needsMetadata' ) ;
27+ const level = this . lastLevel ;
28+ const streams = this . streams ;
29+ for ( let i = 0 ; i < streams . length ; i ++ ) {
30+ dest = streams [ i ] ;
31+ stream = dest . stream ;
32+ if ( dest . level <= level ) {
33+ if ( ! dest . maxLevel || ( dest . maxLevel && level < dest . maxLevel ) ) {
34+ if ( stream [ needsMetadata ] ) {
35+ stream . lastLevel = level ;
36+ stream . lastMsg = this . lastMsg ;
37+ stream . lastObj = this . lastObj ;
38+ stream . lastLogger = this . lastLogger ;
39+ }
40+ stream . write ( data ) ;
41+ }
42+ } else {
43+ break ;
44+ }
45+ }
46+ } ;
47+
1348const defaultLogger = ( options = { } ) => {
1449 const pretty = pino . pretty ( ) ;
1550 pretty . pipe ( process . stdout ) ;
@@ -49,10 +84,16 @@ const defaultLogger = (options = {}) => {
4984
5085 let streams ;
5186 if ( isProduction ) {
52- streams = [ { level : defaultLevel , stream : process . stdout } , { level : 'warn' , stream : process . stderr } ] ;
87+ streams = [
88+ { level : defaultLevel , stream : process . stdout , maxLevel : levels . warn } ,
89+ { level : levels . warn , stream : process . stderr } ,
90+ ] ;
5391 } else {
5492 // dev behavior = default
55- streams = [ { level : defaultLevel , stream : pretty } , { level : 'warn' , stream : prettyErr } ] ;
93+ streams = [
94+ { level : defaultLevel , stream : pretty , maxLevel : levels . warn } ,
95+ { level : levels . warn , stream : prettyErr } ,
96+ ] ;
5697 }
5798
5899 if ( options . streams ) {
@@ -62,6 +103,10 @@ const defaultLogger = (options = {}) => {
62103 const logger = pino ( { level : defaultLevel , timestamp : false , base : { } , serializers } , multistream ( streams ) ) ;
63104 logger . warning = logger . warn ;
64105
106+ // Add maxLevel support to pino-multi-stream
107+ // This could be replaced with custom pass-through stream being passed to multistream, which would filter the messages
108+ logger . stream . write = maxLevelWrite . bind ( logger . stream ) ;
109+
65110 return logger ;
66111} ;
67112
0 commit comments