1
1
import * as Cause from "effect/Cause"
2
2
import * as Chunk from "effect/Chunk"
3
+ import * as Effect from "effect/Effect"
3
4
import * as FiberId from "effect/FiberId"
4
5
import * as FiberRefs from "effect/FiberRefs"
5
6
import { identity } from "effect/Function"
@@ -8,7 +9,7 @@ import { logLevelInfo } from "effect/internal/core"
8
9
import * as List from "effect/List"
9
10
import * as Logger from "effect/Logger"
10
11
import * as LogSpan from "effect/LogSpan"
11
- import { afterEach , beforeEach , describe , expect , it , vi } from "vitest"
12
+ import { afterEach , assert , beforeEach , describe , expect , it , vi } from "vitest"
12
13
13
14
describe ( "stringLogger" , ( ) => {
14
15
beforeEach ( ( ) => {
@@ -183,7 +184,7 @@ describe("logfmtLogger", () => {
183
184
} )
184
185
185
186
expect ( result ) . toEqual (
186
- `timestamp=${ date . toJSON ( ) } level=INFO fiber= message="[object Object] "`
187
+ `timestamp=${ date . toJSON ( ) } level=INFO fiber= message="{\\"hello\\":\\"world\\"} "`
187
188
)
188
189
} )
189
190
@@ -248,4 +249,202 @@ describe("logfmtLogger", () => {
248
249
`timestamp=${ date . toJSON ( ) } level=INFO fiber= message="hello world" hashmap="{\\"_id\\":\\"HashMap\\",\\"values\\":[[\\"key\\",2]]}" chunk="{\\"_id\\":\\"Chunk\\",\\"values\\":[1,2]}"`
249
250
)
250
251
} )
252
+
253
+ it ( "batched" , ( ) =>
254
+ Effect . gen ( function * ( _ ) {
255
+ const chunks : Array < Array < string > > = [ ]
256
+ const date = new Date ( )
257
+ vi . setSystemTime ( date )
258
+ const logger = yield * _ (
259
+ Logger . logfmtLogger ,
260
+ Logger . batched ( "100 millis" , ( _ ) =>
261
+ Effect . sync ( ( ) => {
262
+ chunks . push ( _ )
263
+ } ) )
264
+ )
265
+ const log = ( message : string ) =>
266
+ logger . log ( {
267
+ fiberId : FiberId . none ,
268
+ logLevel : logLevelInfo ,
269
+ message,
270
+ cause : Cause . empty ,
271
+ context : FiberRefs . unsafeMake ( new Map ( ) ) ,
272
+ spans : List . empty ( ) ,
273
+ annotations : HashMap . empty ( ) ,
274
+ date
275
+ } )
276
+
277
+ log ( "a" )
278
+ log ( "b" )
279
+ log ( "c" )
280
+ yield * _ ( Effect . promise ( ( ) => vi . advanceTimersByTimeAsync ( 100 ) ) )
281
+ log ( "d" )
282
+ log ( "e" )
283
+ yield * _ ( Effect . promise ( ( ) => vi . advanceTimersByTimeAsync ( 100 ) ) )
284
+
285
+ assert . deepStrictEqual ( chunks , [
286
+ [
287
+ `timestamp=${ date . toISOString ( ) } level=INFO fiber= message=a` ,
288
+ `timestamp=${ date . toISOString ( ) } level=INFO fiber= message=b` ,
289
+ `timestamp=${ date . toISOString ( ) } level=INFO fiber= message=c`
290
+ ] ,
291
+ [
292
+ `timestamp=${ date . toISOString ( ) } level=INFO fiber= message=d` ,
293
+ `timestamp=${ date . toISOString ( ) } level=INFO fiber= message=e`
294
+ ]
295
+ ] )
296
+ } ) . pipe ( Effect . scoped , Effect . runPromise ) )
297
+ } )
298
+
299
+ describe ( "jsonLogger" , ( ) => {
300
+ beforeEach ( ( ) => {
301
+ vi . useFakeTimers ( )
302
+ } )
303
+ afterEach ( ( ) => {
304
+ vi . useRealTimers ( )
305
+ } )
306
+
307
+ it ( "keys with special chars" , ( ) => {
308
+ const date = new Date ( )
309
+ vi . setSystemTime ( date )
310
+ const spans = List . make ( LogSpan . make ( "imma span=\"" , date . getTime ( ) - 7 ) )
311
+ const annotations = HashMap . make (
312
+ [ "just_a_key" , "just_a_value" ] ,
313
+ [ "I am bad key name" , { coolValue : "cool value" } ] ,
314
+ [ "good_key" , "I am a good value" ] ,
315
+ [ "good_bool" , true ] ,
316
+ [ "good_number" , 123 ]
317
+ )
318
+
319
+ const result = Logger . jsonLogger . log ( {
320
+ fiberId : FiberId . none ,
321
+ logLevel : logLevelInfo ,
322
+ message : "My message" ,
323
+ cause : Cause . empty ,
324
+ context : FiberRefs . unsafeMake ( new Map ( ) ) ,
325
+ spans,
326
+ annotations,
327
+ date
328
+ } )
329
+
330
+ expect ( result ) . toEqual (
331
+ JSON . stringify ( {
332
+ message : "My message" ,
333
+ logLevel : "INFO" ,
334
+ timestamp : date . toJSON ( ) ,
335
+ annotations : {
336
+ just_a_key : "just_a_value" ,
337
+ good_key : "I am a good value" ,
338
+ good_bool : true ,
339
+ "I am bad key name" : { coolValue : "cool value" } ,
340
+ good_number : 123
341
+ } ,
342
+ spans : { "imma span=\"" : 7 } ,
343
+ fiberId : ""
344
+ } )
345
+ )
346
+ } )
347
+
348
+ it ( "objects" , ( ) => {
349
+ const date = new Date ( )
350
+ vi . setSystemTime ( date )
351
+
352
+ const result = Logger . jsonLogger . log ( {
353
+ fiberId : FiberId . none ,
354
+ logLevel : logLevelInfo ,
355
+ message : { hello : "world" } ,
356
+ cause : Cause . empty ,
357
+ context : FiberRefs . unsafeMake ( new Map ( ) ) ,
358
+ spans : List . empty ( ) ,
359
+ annotations : HashMap . empty ( ) ,
360
+ date
361
+ } )
362
+
363
+ expect ( result ) . toEqual ( JSON . stringify ( {
364
+ message : { hello : "world" } ,
365
+ logLevel : "INFO" ,
366
+ timestamp : date . toJSON ( ) ,
367
+ annotations : { } ,
368
+ spans : { } ,
369
+ fiberId : ""
370
+ } ) )
371
+ } )
372
+
373
+ it ( "circular objects" , ( ) => {
374
+ const date = new Date ( )
375
+ vi . setSystemTime ( date )
376
+
377
+ const msg : Record < string , any > = { hello : "world" }
378
+ msg . msg = msg
379
+
380
+ const result = Logger . jsonLogger . log ( {
381
+ fiberId : FiberId . none ,
382
+ logLevel : logLevelInfo ,
383
+ message : msg ,
384
+ cause : Cause . empty ,
385
+ context : FiberRefs . unsafeMake ( new Map ( ) ) ,
386
+ spans : List . empty ( ) ,
387
+ annotations : HashMap . empty ( ) ,
388
+ date
389
+ } )
390
+
391
+ expect ( result ) . toEqual ( JSON . stringify ( {
392
+ message : { hello : "world" } ,
393
+ logLevel : "INFO" ,
394
+ timestamp : date . toJSON ( ) ,
395
+ annotations : { } ,
396
+ spans : { } ,
397
+ fiberId : ""
398
+ } ) )
399
+ } )
400
+
401
+ it ( "symbols" , ( ) => {
402
+ const date = new Date ( )
403
+ vi . setSystemTime ( date )
404
+
405
+ const result = Logger . jsonLogger . log ( {
406
+ fiberId : FiberId . none ,
407
+ logLevel : logLevelInfo ,
408
+ message : Symbol . for ( "effect/Logger/test" ) ,
409
+ cause : Cause . empty ,
410
+ context : FiberRefs . unsafeMake ( new Map ( ) ) ,
411
+ spans : List . empty ( ) ,
412
+ annotations : HashMap . empty ( ) ,
413
+ date
414
+ } )
415
+
416
+ expect ( result ) . toEqual ( JSON . stringify ( {
417
+ message : Symbol . for ( "effect/Logger/test" ) . toString ( ) ,
418
+ logLevel : "INFO" ,
419
+ timestamp : date . toJSON ( ) ,
420
+ annotations : { } ,
421
+ spans : { } ,
422
+ fiberId : ""
423
+ } ) )
424
+ } )
425
+
426
+ it ( "functions" , ( ) => {
427
+ const date = new Date ( )
428
+ vi . setSystemTime ( date )
429
+
430
+ const result = Logger . jsonLogger . log ( {
431
+ fiberId : FiberId . none ,
432
+ logLevel : logLevelInfo ,
433
+ message : ( ) => "hello world" ,
434
+ cause : Cause . empty ,
435
+ context : FiberRefs . unsafeMake ( new Map ( ) ) ,
436
+ spans : List . empty ( ) ,
437
+ annotations : HashMap . empty ( ) ,
438
+ date
439
+ } )
440
+
441
+ expect ( result ) . toEqual ( JSON . stringify ( {
442
+ message : "() => \"hello world\"" ,
443
+ logLevel : "INFO" ,
444
+ timestamp : date . toJSON ( ) ,
445
+ annotations : { } ,
446
+ spans : { } ,
447
+ fiberId : ""
448
+ } ) )
449
+ } )
251
450
} )
0 commit comments