@@ -123,6 +123,71 @@ describe('winston integration', () => {
123123 await runner . completed ( ) ;
124124 } ) ;
125125
126+ test ( "should capture winston logs with filter but don't show custom level warnings" , async ( ) => {
127+ const runner = createRunner ( __dirname , 'subject.ts' )
128+ . withEnv ( { WITH_FILTER : 'true' } )
129+ . expect ( {
130+ log : {
131+ items : [
132+ {
133+ timestamp : expect . any ( Number ) ,
134+ level : 'info' ,
135+ body : 'Test info message' ,
136+ severity_number : expect . any ( Number ) ,
137+ trace_id : expect . any ( String ) ,
138+ attributes : {
139+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
140+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
141+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
142+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
143+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
144+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
145+ } ,
146+ } ,
147+ {
148+ timestamp : expect . any ( Number ) ,
149+ level : 'error' ,
150+ body : 'Test error message' ,
151+ severity_number : expect . any ( Number ) ,
152+ trace_id : expect . any ( String ) ,
153+ attributes : {
154+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
155+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
156+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
157+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
158+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
159+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
160+ } ,
161+ } ,
162+ {
163+ timestamp : expect . any ( Number ) ,
164+ level : 'error' ,
165+ body : 'Test error message' ,
166+ severity_number : expect . any ( Number ) ,
167+ trace_id : expect . any ( String ) ,
168+ attributes : {
169+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
170+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
171+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
172+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
173+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
174+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
175+ } ,
176+ } ,
177+ ] ,
178+ } ,
179+ } )
180+ . start ( ) ;
181+
182+ await runner . completed ( ) ;
183+
184+ const logs = runner . getLogs ( ) ;
185+
186+ const warning = logs . find ( log => log . includes ( 'Winston log level info is not captured by Sentry.' ) ) ;
187+
188+ expect ( warning ) . not . toBeDefined ( ) ;
189+ } ) ;
190+
126191 test ( 'should capture winston logs with metadata' , async ( ) => {
127192 const runner = createRunner ( __dirname , 'subject.ts' )
128193 . withEnv ( { WITH_METADATA : 'true' } )
@@ -183,4 +248,162 @@ describe('winston integration', () => {
183248
184249 await runner . completed ( ) ;
185250 } ) ;
251+
252+ test ( 'should skip unmapped custom levels when not in the levels option' , async ( ) => {
253+ const runner = createRunner ( __dirname , 'subject.ts' )
254+ . withEnv ( { UNMAPPED_CUSTOM_LEVEL : 'true' } )
255+ . expect ( {
256+ log : {
257+ items : [
258+ // First, the default logger captures info and error
259+ {
260+ timestamp : expect . any ( Number ) ,
261+ level : 'info' ,
262+ body : 'Test info message' ,
263+ severity_number : expect . any ( Number ) ,
264+ trace_id : expect . any ( String ) ,
265+ attributes : {
266+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
267+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
268+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
269+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
270+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
271+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
272+ } ,
273+ } ,
274+ {
275+ timestamp : expect . any ( Number ) ,
276+ level : 'error' ,
277+ body : 'Test error message' ,
278+ severity_number : expect . any ( Number ) ,
279+ trace_id : expect . any ( String ) ,
280+ attributes : {
281+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
282+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
283+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
284+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
285+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
286+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
287+ } ,
288+ } ,
289+ // Then the unmapped logger only captures error (myUnknownLevel defaults to info, which is skipped)
290+ {
291+ timestamp : expect . any ( Number ) ,
292+ level : 'error' ,
293+ body : 'This error message should be captured' ,
294+ severity_number : expect . any ( Number ) ,
295+ trace_id : expect . any ( String ) ,
296+ attributes : {
297+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
298+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
299+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
300+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
301+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
302+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
303+ } ,
304+ } ,
305+ ] ,
306+ } ,
307+ } )
308+ . start ( ) ;
309+
310+ await runner . completed ( ) ;
311+
312+ const logs = runner . getLogs ( ) ;
313+
314+ const warning = logs . find ( log => log . includes ( 'Winston log level myUnknownLevel is not captured by Sentry.' ) ) ;
315+
316+ expect ( warning ) . toBeDefined ( ) ;
317+ } ) ;
318+
319+ test ( 'should map custom winston levels to Sentry severity levels' , async ( ) => {
320+ const runner = createRunner ( __dirname , 'subject.ts' )
321+ . withEnv ( { CUSTOM_LEVEL_MAPPING : 'true' } )
322+ . expect ( {
323+ log : {
324+ items : [
325+ // First, the default logger captures info and error
326+ {
327+ timestamp : expect . any ( Number ) ,
328+ level : 'info' ,
329+ body : 'Test info message' ,
330+ severity_number : expect . any ( Number ) ,
331+ trace_id : expect . any ( String ) ,
332+ attributes : {
333+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
334+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
335+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
336+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
337+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
338+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
339+ } ,
340+ } ,
341+ {
342+ timestamp : expect . any ( Number ) ,
343+ level : 'error' ,
344+ body : 'Test error message' ,
345+ severity_number : expect . any ( Number ) ,
346+ trace_id : expect . any ( String ) ,
347+ attributes : {
348+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
349+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
350+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
351+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
352+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
353+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
354+ } ,
355+ } ,
356+ // Then the mapped logger uses custom level mappings
357+ {
358+ timestamp : expect . any ( Number ) ,
359+ level : 'fatal' , // 'critical' maps to 'fatal'
360+ body : 'This is a critical message' ,
361+ severity_number : expect . any ( Number ) ,
362+ trace_id : expect . any ( String ) ,
363+ attributes : {
364+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
365+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
366+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
367+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
368+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
369+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
370+ } ,
371+ } ,
372+ {
373+ timestamp : expect . any ( Number ) ,
374+ level : 'warn' , // 'warning' maps to 'warn'
375+ body : 'This is a warning message' ,
376+ severity_number : expect . any ( Number ) ,
377+ trace_id : expect . any ( String ) ,
378+ attributes : {
379+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
380+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
381+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
382+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
383+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
384+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
385+ } ,
386+ } ,
387+ {
388+ timestamp : expect . any ( Number ) ,
389+ level : 'info' , // 'notice' maps to 'info'
390+ body : 'This is a notice message' ,
391+ severity_number : expect . any ( Number ) ,
392+ trace_id : expect . any ( String ) ,
393+ attributes : {
394+ 'sentry.origin' : { value : 'auto.log.winston' , type : 'string' } ,
395+ 'sentry.release' : { value : '1.0.0' , type : 'string' } ,
396+ 'sentry.environment' : { value : 'test' , type : 'string' } ,
397+ 'sentry.sdk.name' : { value : 'sentry.javascript.node' , type : 'string' } ,
398+ 'sentry.sdk.version' : { value : expect . any ( String ) , type : 'string' } ,
399+ 'server.address' : { value : expect . any ( String ) , type : 'string' } ,
400+ } ,
401+ } ,
402+ ] ,
403+ } ,
404+ } )
405+ . start ( ) ;
406+
407+ await runner . completed ( ) ;
408+ } ) ;
186409} ) ;
0 commit comments