22
33const { storage } = require ( '../../../datadog-core' )
44const { LogChannel } = require ( './channels' )
5+ const { Log } = require ( './log' )
56const defaultLogger = {
67 debug : msg => console . debug ( msg ) , /* eslint-disable-line no-console */
78 info : msg => console . info ( msg ) , /* eslint-disable-line no-console */
@@ -22,15 +23,15 @@ function withNoop (fn) {
2223}
2324
2425function unsubscribeAll ( ) {
25- logChannel . unsubscribe ( { debug, info, warn, error } )
26+ logChannel . unsubscribe ( { debug : onDebug , info : onInfo , warn : onWarn , error : onError } )
2627}
2728
2829function toggleSubscription ( enable , level ) {
2930 unsubscribeAll ( )
3031
3132 if ( enable ) {
3233 logChannel = new LogChannel ( level )
33- logChannel . subscribe ( { debug, info, warn, error } )
34+ logChannel . subscribe ( { debug : onDebug , info : onInfo , warn : onWarn , error : onError } )
3435 }
3536}
3637
@@ -51,32 +52,62 @@ function reset () {
5152 toggleSubscription ( false )
5253}
5354
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
5961 }
62+ }
6063
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+ }
6478
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 ) )
6683}
6784
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 ) )
7189}
7290
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 )
76107}
77108
78- function debug ( message ) {
79- withNoop ( ( ) => logger . debug ( message ) )
109+ function debug ( ... args ) {
110+ onDebug ( Log . parse ( ... args ) )
80111}
81112
82113module . exports = { use, toggle, reset, error, warn, info, debug }
0 commit comments