10
10
*/
11
11
'use strict' ;
12
12
const config = require ( 'config' ) ;
13
+ const util = require ( 'util' ) ;
14
+ const _ = require ( 'lodash' ) ;
13
15
const winston = require ( 'winston' ) ;
16
+ const getParams = require ( 'get-parameter-names' ) ;
17
+ const globalLog = require ( 'global-request-logger' ) ;
14
18
15
19
const logger = new winston . Logger ( {
16
20
transports : [
@@ -33,5 +37,94 @@ logger.logFullError = function logFullError(err, signature) {
33
37
err . logged = true ;
34
38
} ;
35
39
40
+ /**
41
+ * Remove invalid properties from the object and hide long arrays
42
+ * @param {Object } obj the object
43
+ * @returns {Object } the new object with removed properties
44
+ * @private
45
+ */
46
+ function sanitizeObject ( obj ) {
47
+ try {
48
+ return JSON . parse ( JSON . stringify ( obj , ( name , value ) => {
49
+ // Array of field names that should not be logged
50
+ const removeFields = [ 'refreshToken' , 'accessToken' , 'access_token' , 'authorization' ] ;
51
+ if ( _ . includes ( removeFields , name ) ) {
52
+ return '<removed>' ;
53
+ }
54
+ if ( _ . isArray ( value ) && value . length > 30 ) { // eslint-disable-line
55
+ return `Array(${ value . length } ` ;
56
+ }
57
+ return value ;
58
+ } ) ) ;
59
+ } catch ( e ) {
60
+ return obj ;
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Convert array with arguments to object
66
+ * @param {Array } params the name of parameters
67
+ * @param {Array } arr the array with values
68
+ * @returns {Object } converted object
69
+ * @private
70
+ */
71
+ function combineObject ( params , arr ) {
72
+ const ret = { } ;
73
+ _ . forEach ( arr , ( arg , i ) => {
74
+ ret [ params [ i ] ] = arg ;
75
+ } ) ;
76
+ return ret ;
77
+ }
78
+
79
+ /**
80
+ * Decorate all functions of a service and log debug information if DEBUG is enabled
81
+ * @param {Object } service the service
82
+ */
83
+ logger . decorateWithLogging = function decorateWithLogging ( service ) {
84
+ if ( config . LOG_LEVEL !== 'debug' ) {
85
+ return ;
86
+ }
87
+ _ . forEach ( service , ( method , name ) => {
88
+ const params = method . params || getParams ( method ) ;
89
+ service [ name ] = async function serviceMethodWithLogging ( ) {
90
+ logger . debug ( `ENTER ${ name } ` ) ;
91
+ logger . debug ( 'input arguments' ) ;
92
+ const args = Array . prototype . slice . call ( arguments ) ; // eslint-disable-line
93
+ logger . debug ( util . inspect ( sanitizeObject ( combineObject ( params , args ) ) ) ) ;
94
+ try {
95
+ const result = await method . apply ( this , arguments ) ; // eslint-disable-line
96
+ logger . debug ( `EXIT ${ name } ` ) ;
97
+ logger . debug ( 'output arguments' ) ;
98
+ logger . debug ( util . inspect ( sanitizeObject ( result ) ) ) ;
99
+ return result ;
100
+ } catch ( e ) {
101
+ logger . logFullError ( e , name ) ;
102
+ throw e ;
103
+ }
104
+ } ;
105
+ } ) ;
106
+ } ;
107
+
108
+ /**
109
+ * Apply logger and validation decorators
110
+ * @param {Object } service the service to wrap
111
+ */
112
+ logger . buildService = function buildService ( service ) {
113
+ logger . decorateWithLogging ( service ) ;
114
+ } ;
115
+
116
+ // globalLog.initialize();
117
+
118
+ // global any http success request interceptor
119
+ globalLog . on ( 'success' , ( request , response ) => {
120
+ logger . debug ( 'Request' , util . inspect ( sanitizeObject ( request ) ) ) ;
121
+ logger . debug ( 'Response' , util . inspect ( sanitizeObject ( response ) ) ) ;
122
+ } ) ;
123
+
124
+ // global any http error request interceptor
125
+ globalLog . on ( 'error' , ( request , response ) => {
126
+ logger . error ( 'Request' , util . inspect ( sanitizeObject ( request ) ) ) ;
127
+ logger . error ( 'Response' , util . inspect ( sanitizeObject ( response ) ) ) ;
128
+ } ) ;
36
129
37
130
module . exports = logger ;
0 commit comments