1- /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-dynamic-delete */
1+ /* eslint-disable @typescript-eslint/no-explicit-any */
2+
3+ import { ApplicationError } from '@openops/shared' ;
4+
25export const maxFieldLength = 2048 ;
36
4- export const truncate = ( value : string , maxLength : number = maxFieldLength ) => {
5- return value . length > maxLength
7+ export const truncate = (
8+ value : string | undefined ,
9+ maxLength : number = maxFieldLength ,
10+ ) => {
11+ return value && value . length > maxLength
612 ? `${ value . substring ( 0 , maxLength - 3 ) } ...`
713 : value ;
814} ;
@@ -18,57 +24,76 @@ export const cleanLogEvent = (logEvent: any) => {
1824
1925 const eventData : any = { } ;
2026
27+ if ( logEvent . event instanceof Error ) {
28+ logEvent . event = { error : logEvent . event } ;
29+ }
30+
2131 for ( const key in logEvent . event ) {
2232 const value = logEvent . event [ key ] ;
2333 if ( value === null || value === undefined ) {
2434 continue ;
2535 }
2636
27- delete eventData [ key ] ;
28-
29- if ( key == 'res' && value && value . raw ) {
30- const rawResponse = value . raw ;
31- eventData . requestMethod = rawResponse . req . method ;
32- eventData . requestPath = truncate ( rawResponse . req . url ) ;
33- eventData . statusCode = rawResponse . statusCode ;
34- const responseTime = parseFloat ( logEvent . event . responseTime ) . toFixed ( ) ;
35- eventData . responseTime = responseTime ;
36- logEvent [
37- 'message'
38- ] = `Request completed [${ eventData . requestMethod } ${ eventData . requestPath } ${ eventData . statusCode } ${ responseTime } ms]` ;
39- logEvent [ 'level' ] = 'debug' ;
40- continue ;
41- }
42-
43- if ( typeof value === 'object' ) {
37+ if ( key === 'res' && value && value . raw ) {
38+ extractRequestFields ( value , eventData , logEvent ) ;
39+ } else if ( value instanceof Error ) {
40+ extractErrorFields ( key , value , eventData , logEvent ) ;
41+ } else if ( typeof value === 'number' ) {
42+ eventData [ key ] = Math . round ( value * 100 ) / 100 ;
43+ } else if ( typeof value === 'object' ) {
4444 try {
4545 eventData [ key ] = truncate ( JSON . stringify ( value ) ) ;
4646 } catch ( error ) {
4747 eventData [ key ] = `Logger error - could not stringify object. ${ error } ` ;
4848 }
49- continue ;
49+ } else {
50+ eventData [ key ] = truncate ( value ) ;
5051 }
52+ }
5153
52- if ( typeof value === 'number' ) {
53- // Max 2 decimal points
54- eventData [ key ] = Math . round ( value * 100 ) / 100 ;
55- continue ;
56- }
54+ logEvent . event = eventData ;
55+ return logEvent ;
56+ } ;
57+
58+ function extractRequestFields ( value : any , eventData : any , logEvent : any ) {
59+ const rawResponse = value . raw ;
60+ eventData . requestMethod = rawResponse . req . method ;
61+ eventData . requestPath = truncate ( rawResponse . req . url ) ;
62+ eventData . statusCode = rawResponse . statusCode ;
63+ const responseTime = parseFloat ( logEvent . event . responseTime ) ;
5764
58- eventData [ key ] = truncate ( value ) ;
65+ if ( ! isNaN ( responseTime ) ) {
66+ eventData . responseTime = responseTime . toFixed ( ) ;
5967 }
6068
61- if ( logEvent . event instanceof Error ) {
62- const { stack, message, name, ...context } = logEvent . event ;
63- eventData . stack = truncate ( stack , 2000 ) ;
64- eventData . name = name ;
69+ logEvent [ 'message' ] = `Request completed [${ eventData . requestMethod } ${
70+ eventData . requestPath
71+ } ${ eventData . statusCode } ${ eventData . responseTime ?? 0 } ms]`;
72+ logEvent [ 'level' ] = 'debug' ;
73+ }
74+
75+ function extractErrorFields (
76+ key : string ,
77+ value : Error | ApplicationError ,
78+ eventData : any ,
79+ logEvent : any ,
80+ ) {
81+ const errorKey = key === 'err' ? 'error' : key ;
82+ const { stack, message, name, ...context } = value ;
83+ eventData [ errorKey + 'Stack' ] = truncate ( stack ) ;
84+ if ( message ) {
85+ eventData [ errorKey + 'Message' ] = truncate ( message ) ;
6586 if ( ! logEvent . message ) {
6687 logEvent . message = truncate ( message ) ;
67- } else {
68- eventData . message = truncate ( message ) ;
6988 }
70- Object . assign ( eventData , context ) ;
7189 }
72- logEvent . event = eventData ;
73- return logEvent ;
74- } ;
90+ eventData [ errorKey + 'Name' ] = truncate ( name ) ;
91+ if ( value instanceof ApplicationError ) {
92+ eventData [ errorKey + 'Code' ] = truncate ( value . error . code ) ;
93+ eventData [ errorKey + 'Params' ] = truncate (
94+ JSON . stringify ( value . error . params ) ,
95+ ) ;
96+ } else if ( context && Object . keys ( context ) . length ) {
97+ eventData [ errorKey + 'Context' ] = truncate ( JSON . stringify ( context ) ) ;
98+ }
99+ }
0 commit comments