1- import * as isObject from 'lodash.isobject' ;
2- import * as isString from 'lodash.isstring' ;
1+ import { ErrorRequestHandler } from 'express' ;
2+ import isObject = require( 'lodash.isobject' ) ;
3+ import isString = require( 'lodash.isstring' ) ;
34import * as pino from 'pino' ;
4- import { multistream } from 'pino-multi-stream ' ;
5- import { expressErrorMiddleware , expressMiddleware } from './express ' ;
6- import { levels } from './levels ' ;
5+ import { BaseLogger as PinoLogger } from 'pino' ;
6+ import { Level , LoggerOptions , multistream } from 'pino-multi-stream ' ;
7+ import { AckeeLoggerExpressMiddleware , expressErrorMiddleware , expressMiddleware } from './express ' ;
78import * as serializers from './serializers' ;
89import { StackDriverFormatStream } from './stackdriver' ;
9- import { decorateStreams , DefaultTransformStream } from './streams' ;
10-
11- interface LoggerOptions {
12- disableFields : string [ ] ;
13- enableFields : string [ ] ;
14- defaultLevel : string ;
15- disableStackdriverFormat : boolean ;
16- streams : any [ ] ;
17- ignoredHttpMethods : string [ ] ;
18- config : any ;
19- pretty : boolean ;
10+ import { AckeeLoggerStream , decorateStreams , DefaultTransformStream } from './streams' ;
11+
12+ export interface AckeeLoggerOptions {
13+ disableFields ?: string [ ] ;
14+ enableFields ?: string [ ] ;
15+ defaultLevel ?: Level ;
16+ disableStackdriverFormat ?: boolean ;
17+ streams ?: AckeeLoggerStream [ ] ;
18+ ignoredHttpMethods ?: string [ ] ;
19+ config ?: LoggerOptions ;
20+ pretty ?: boolean ;
21+ }
22+
23+ export interface AckeeLogger extends PinoLogger {
24+ warning : pino . LogFn ;
25+ options : AckeeLoggerOptions ;
26+ express : AckeeLoggerExpressMiddleware ;
27+ expressError : ErrorRequestHandler ;
2028}
2129
2230// This is a custom slightly edited version of pino-multistream's wirte method, whch adds support for maximum log level
2331// The original version was pino-multistream 3.1.2 (commit 71d98ae) - https://github.com/pinojs/pino-multi-stream/blob/71d98ae191e02c56e39e849d2c30d59c8c6db1b9/multistream.js#L43
24- const maxLevelWrite = function ( data ) {
32+ const maxLevelWrite : pino . WriteFn = function ( this : any , data : object ) : void {
2533 let stream ;
2634 const needsMetadata = Symbol . for ( 'needsMetadata' ) ;
2735 const level = this . lastLevel ;
@@ -44,7 +52,7 @@ const maxLevelWrite = function(data) {
4452 }
4553} ;
4654
47- const defaultLogger = ( options : LoggerOptions = ( { } as any ) as LoggerOptions ) => {
55+ const defaultLogger = ( options : AckeeLoggerOptions = { } ) : AckeeLogger => {
4856 const pretty = pino . pretty ( ) ;
4957 pretty . pipe ( process . stdout ) ;
5058 const prettyErr = pino . pretty ( ) ;
@@ -54,7 +62,7 @@ const defaultLogger = (options: LoggerOptions = ({} as any) as LoggerOptions) =>
5462 serializers . enablePaths ( options . enableFields ) ;
5563
5664 const isTesting = process . env . NODE_ENV === 'test' ;
57- let defaultLevel = 'debug' ;
65+ let defaultLevel : Level = 'debug' ;
5866
5967 if ( isTesting ) {
6068 defaultLevel = 'silent' ;
@@ -64,20 +72,17 @@ const defaultLogger = (options: LoggerOptions = ({} as any) as LoggerOptions) =>
6472 defaultLevel = options . defaultLevel ;
6573 }
6674
67- let streams ;
75+ let streams : AckeeLoggerStream [ ] ;
6876 let defaultMessageKey = 'message' ; // best option for Google Stackdriver
6977 if ( options . streams ) {
7078 streams = options . streams ;
7179 } else if ( options . pretty ) {
72- streams = [
73- { level : defaultLevel , stream : pretty , maxLevel : levels . warn } ,
74- { level : levels . warn , stream : prettyErr } ,
75- ] ;
80+ streams = [ { level : defaultLevel , maxLevel : 'warn' , stream : pretty } , { level : 'warn' , stream : prettyErr } ] ;
7681 defaultMessageKey = 'msg' ; // default pino - best option for pretty print
7782 } else {
7883 streams = [
79- { level : defaultLevel , stream : process . stdout , maxLevel : levels . warn } ,
80- { level : levels . warn , stream : process . stderr } ,
84+ { level : defaultLevel , maxLevel : 'warn' , stream : process . stdout } ,
85+ { level : ' warn' , stream : process . stderr } ,
8186 ] ;
8287 }
8388 if ( ! options . disableStackdriverFormat ) {
@@ -106,28 +111,27 @@ const defaultLogger = (options: LoggerOptions = ({} as any) as LoggerOptions) =>
106111 multistream ( streams )
107112 ) ;
108113 logger . warning = logger . warn ;
109- logger . options = options ;
114+ ( logger as any ) . options = options ;
110115
111116 // Add maxLevel support to pino-multi-stream
112117 // This could be replaced with custom pass-through stream being passed to multistream, which would filter the messages
113- logger . stream . write = maxLevelWrite . bind ( logger . stream ) ;
114-
118+ ( logger as any ) . stream . write = maxLevelWrite . bind ( logger . stream ) ;
115119 logger . express = expressMiddleware . bind ( logger ) ;
116- logger . expressError = expressErrorMiddleware ;
120+ logger . expressError = expressErrorMiddleware as any ;
117121
118- return logger ;
122+ return ( logger as any ) as AckeeLogger ;
119123} ;
120124
121- let rootLogger ;
125+ let rootLogger : AckeeLogger ;
122126
123- const loggerFactory = ( data = { } ) => {
124- let moduleName ;
125- let options ;
127+ const loggerFactory = ( data : string | AckeeLoggerOptions = { } ) : AckeeLogger => {
128+ let moduleName : string | undefined ;
129+ let options : AckeeLoggerOptions = { } ;
126130 if ( data ) {
127131 if ( isString ( data ) ) {
128- moduleName = data ;
132+ moduleName = data as string ;
129133 } else if ( isObject ( data ) ) {
130- options = data ;
134+ options = data as AckeeLoggerOptions ;
131135 } else {
132136 throw new TypeError ( `Invalid argument of type ${ typeof data } ` ) ;
133137 }
@@ -139,11 +143,11 @@ const loggerFactory = (data = {}) => {
139143 if ( ! moduleName ) {
140144 return rootLogger ;
141145 }
142- return rootLogger . child ( { name : moduleName } ) ;
146+ return ( rootLogger . child ( { name : moduleName } ) as any ) as AckeeLogger ;
143147} ;
144148
145149const factoryProxy = new Proxy ( loggerFactory , {
146- get : ( target , key ) => target ( ) [ key ] ,
150+ get : ( target , key ) => ( target ( ) as any ) [ key ] ,
147151} ) ;
148152
149153export default factoryProxy ;
0 commit comments