2
2
3
3
const { storage } = require ( '../../../datadog-core' )
4
4
const { LogChannel } = require ( './channels' )
5
+ const { Log } = require ( './log' )
5
6
const defaultLogger = {
6
7
debug : msg => console . debug ( msg ) , /* eslint-disable-line no-console */
7
8
info : msg => console . info ( msg ) , /* eslint-disable-line no-console */
@@ -22,15 +23,15 @@ function withNoop (fn) {
22
23
}
23
24
24
25
function unsubscribeAll ( ) {
25
- logChannel . unsubscribe ( { debug, info, warn, error } )
26
+ logChannel . unsubscribe ( { debug : onDebug , info : onInfo , warn : onWarn , error : onError } )
26
27
}
27
28
28
29
function toggleSubscription ( enable , level ) {
29
30
unsubscribeAll ( )
30
31
31
32
if ( enable ) {
32
33
logChannel = new LogChannel ( level )
33
- logChannel . subscribe ( { debug, info, warn, error } )
34
+ logChannel . subscribe ( { debug : onDebug , info : onInfo , warn : onWarn , error : onError } )
34
35
}
35
36
}
36
37
@@ -51,32 +52,62 @@ function reset () {
51
52
toggleSubscription ( false )
52
53
}
53
54
54
- function error ( err ) {
55
- if ( typeof err !== 'object' || ! err ) {
56
- err = String ( err )
57
- } else if ( ! err . stack ) {
58
- err = String ( err . message || err )
55
+ function getErrorLog ( err ) {
56
+ if ( err && typeof err . delegate === 'function' ) {
57
+ const result = err . delegate ( )
58
+ return Array . isArray ( result ) ? Log . parse ( ...result ) : Log . parse ( result )
59
+ } else {
60
+ return err
59
61
}
62
+ }
60
63
61
- if ( typeof err === 'string' ) {
62
- err = new Error ( err )
63
- }
64
+ function onError ( err ) {
65
+ const { formatted, cause } = getErrorLog ( err )
66
+
67
+ // calling twice logger.error() because Error cause is only available in nodejs v16.9.0
68
+ // TODO: replace it with Error(message, { cause }) when cause has broad support
69
+ if ( formatted ) withNoop ( ( ) => logger . error ( new Error ( formatted ) ) )
70
+ if ( cause ) withNoop ( ( ) => logger . error ( cause ) )
71
+ }
72
+
73
+ function onWarn ( log ) {
74
+ const { formatted, cause } = getErrorLog ( log )
75
+ if ( formatted ) withNoop ( ( ) => logger . warn ( formatted ) )
76
+ if ( cause ) withNoop ( ( ) => logger . warn ( cause ) )
77
+ }
64
78
65
- withNoop ( ( ) => logger . error ( err ) )
79
+ function onInfo ( log ) {
80
+ const { formatted, cause } = getErrorLog ( log )
81
+ if ( formatted ) withNoop ( ( ) => logger . info ( formatted ) )
82
+ if ( cause ) withNoop ( ( ) => logger . info ( cause ) )
66
83
}
67
84
68
- function warn ( message ) {
69
- if ( ! logger . warn ) return debug ( message )
70
- withNoop ( ( ) => logger . warn ( message ) )
85
+ function onDebug ( log ) {
86
+ const { formatted, cause } = getErrorLog ( log )
87
+ if ( formatted ) withNoop ( ( ) => logger . debug ( formatted ) )
88
+ if ( cause ) withNoop ( ( ) => logger . debug ( cause ) )
71
89
}
72
90
73
- function info ( message ) {
74
- if ( ! logger . info ) return debug ( message )
75
- withNoop ( ( ) => logger . info ( message ) )
91
+ function error ( ...args ) {
92
+ onError ( Log . parse ( ...args ) )
93
+ }
94
+
95
+ function warn ( ...args ) {
96
+ const log = Log . parse ( ...args )
97
+ if ( ! logger . warn ) return onDebug ( log )
98
+
99
+ onWarn ( log )
100
+ }
101
+
102
+ function info ( ...args ) {
103
+ const log = Log . parse ( ...args )
104
+ if ( ! logger . info ) return onDebug ( log )
105
+
106
+ onInfo ( log )
76
107
}
77
108
78
- function debug ( message ) {
79
- withNoop ( ( ) => logger . debug ( message ) )
109
+ function debug ( ... args ) {
110
+ onDebug ( Log . parse ( ... args ) )
80
111
}
81
112
82
113
module . exports = { use, toggle, reset, error, warn, info, debug }
0 commit comments