@@ -16,14 +16,10 @@ const LOG_LEVELS: Record<string, LogLevel> = {
1616
1717class Logger {
1818 private environment : string ;
19- private service : string ;
20- private version : string ;
2119 private currentLogLevel : LogLevel ;
2220
2321 constructor ( ) {
2422 this . environment = process . env . NODE_ENV || "development" ;
25- this . service = "typelets-api" ;
26- this . version = process . env . npm_package_version || "1.0.0" ;
2723
2824 // Set log level based on environment
2925 const logLevelName =
@@ -35,102 +31,61 @@ class Logger {
3531 return level . priority <= this . currentLogLevel . priority ;
3632 }
3733
38- private sendToSentry (
39- level : "error" | "warning" | "info" | "debug" ,
40- message : string ,
41- meta : LogMetadata = { }
42- ) : void {
43- const enrichedData = {
44- service : this . service ,
45- environment : this . environment ,
46- version : this . version ,
47- ...meta ,
48- } ;
49-
50- // Add breadcrumb for context (appears in transaction/error details)
51- Sentry . addBreadcrumb ( {
52- level,
53- message,
54- category : ( meta . type as string ) || "app" ,
55- data : enrichedData ,
56- } ) ;
34+ private normalizePath ( path : string ) : string {
35+ // Take first two path segments and replace UUIDs/IDs with {id}
36+ const segments = path . split ( "/" ) . filter ( ( s ) => s . length > 0 ) ;
37+ const normalized = segments
38+ . slice ( 0 , 2 )
39+ . map ( ( segment ) => {
40+ // Replace UUIDs, numeric IDs, or other dynamic identifiers with {id}
41+ if (
42+ / ^ [ 0 - 9 a - f ] { 8 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 12 } $ / i. test ( segment ) ||
43+ / ^ \d + $ / . test ( segment ) ||
44+ / ^ [ a - z A - Z 0 - 9 _ - ] { 20 , } $ / . test ( segment )
45+ ) {
46+ return "{id}" ;
47+ }
48+ return segment ;
49+ } )
50+ . join ( "/" ) ;
5751
58- // Also send as message event so it appears in Sentry Issues
59- // Only send info/warn/error as events (not debug to reduce noise)
60- if ( level !== "debug" ) {
61- Sentry . captureMessage ( message , {
62- level,
63- contexts : {
64- metadata : enrichedData ,
65- } ,
66- tags : {
67- type : ( meta . type as string ) || "app" ,
68- service : this . service ,
69- } ,
70- } ) ;
71- }
52+ return `/${ normalized } ` ;
7253 }
7354
7455 error ( message : string , meta : LogMetadata = { } , error ?: Error ) : void {
7556 if ( this . shouldLog ( LOG_LEVELS . error ) ) {
76- const enrichedMeta = { ...meta } ;
77-
7857 if ( error ) {
79- // Send exception to Sentry with context
58+ // Send exception with stack trace and metadata
8059 Sentry . captureException ( error , {
8160 contexts : {
82- metadata : {
83- service : this . service ,
84- environment : this . environment ,
85- version : this . version ,
86- message,
87- ...meta ,
88- } ,
61+ metadata : meta ,
8962 } ,
9063 tags : {
9164 type : ( meta . type as string ) || "error" ,
92- service : this . service ,
9365 } ,
9466 } ) ;
9567 } else {
96- // No error object, send as error message
97- this . sendToSentry ( "error" , message , enrichedMeta ) ;
98- }
99-
100- // Also send to console for development debugging
101- if ( this . environment === "development" ) {
102- console . error ( message , enrichedMeta ) ;
68+ // Send error log with metadata
69+ Sentry . logger . error ( message , meta ) ;
10370 }
10471 }
10572 }
10673
10774 warn ( message : string , meta : LogMetadata = { } ) : void {
10875 if ( this . shouldLog ( LOG_LEVELS . warn ) ) {
109- this . sendToSentry ( "warning" , message , meta ) ;
110-
111- if ( this . environment === "development" ) {
112- console . warn ( message , meta ) ;
113- }
76+ Sentry . logger . warn ( message , meta ) ;
11477 }
11578 }
11679
11780 info ( message : string , meta : LogMetadata = { } ) : void {
11881 if ( this . shouldLog ( LOG_LEVELS . info ) ) {
119- this . sendToSentry ( "info" , message , meta ) ;
120-
121- if ( this . environment === "development" ) {
122- console . log ( message , meta ) ;
123- }
82+ Sentry . logger . info ( message , meta ) ;
12483 }
12584 }
12685
12786 debug ( message : string , meta : LogMetadata = { } ) : void {
12887 if ( this . shouldLog ( LOG_LEVELS . debug ) ) {
129- this . sendToSentry ( "debug" , message , meta ) ;
130-
131- if ( this . environment === "development" ) {
132- console . log ( message , meta ) ;
133- }
88+ Sentry . logger . debug ( message , meta ) ;
13489 }
13590 }
13691
@@ -142,7 +97,8 @@ class Logger {
14297 duration : number ,
14398 userId ?: string
14499 ) : void {
145- this . info ( "HTTP request completed" , {
100+ const normalizedPath = this . normalizePath ( path ) ;
101+ this . info ( `[API] ${ method } ${ normalizedPath } ` , {
146102 type : "http_request" ,
147103 method,
148104 path,
@@ -171,11 +127,11 @@ class Logger {
171127 if ( resourceType ) meta . resourceType = resourceType ;
172128 if ( status ) meta . status = status ;
173129
174- this . info ( " WebSocket event" , meta ) ;
130+ this . info ( ` WebSocket ${ eventType } ` , meta ) ;
175131 }
176132
177133 databaseQuery ( operation : string , table : string , duration : number , userId ?: string ) : void {
178- this . debug ( "Database query executed" , {
134+ this . debug ( `[DB] ${ operation } ${ table } ` , {
179135 type : "database_query" ,
180136 operation,
181137 table,
@@ -185,7 +141,8 @@ class Logger {
185141 }
186142
187143 codeExecution ( languageId : number , duration : number , success : boolean , userId ?: string ) : void {
188- this . info ( "Code execution completed" , {
144+ const status = success ? "success" : "failed" ;
145+ this . info ( `Code execution ${ status } ` , {
189146 type : "code_execution" ,
190147 languageId,
191148 duration,
@@ -195,7 +152,7 @@ class Logger {
195152 }
196153
197154 businessEvent ( eventName : string , userId : string , metadata : LogMetadata = { } ) : void {
198- this . info ( " Business event" , {
155+ this . info ( ` Business event ${ eventName } ` , {
199156 type : "business_event" ,
200157 eventName,
201158 userId,
@@ -208,7 +165,7 @@ class Logger {
208165 severity : "low" | "medium" | "high" | "critical" ,
209166 details : LogMetadata
210167 ) : void {
211- this . warn ( " Security event detected" , {
168+ this . warn ( ` Security event ${ eventType } ` , {
212169 type : "security_event" ,
213170 eventType,
214171 severity,
0 commit comments