tabular
command output file from processing bench.txt
and verify.txt
Benchmark Attributes
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 792,762 │ 1,440.00 │ 5 │ 416 │ 270.19 ║
║ madkins/flash ║ 813,104 │ 1,362.00 │ 5 │ 504 │ 328.20 ║
║ madkins/replattr ║ 576,532 │ 2,029.00 │ 6 │ 508 │ 220.27 ║
║ madkins/sloggy ║ 427,345 │ 2,826.00 │ 64 │ 1,384 │ 158.55 ║
║ phsym/zeroslog ║ 1,202,805 │ 1,001.00 │ 3 │ 352 │ 395.58 ║
║ phuslu/slog ║ 1,328,202 │ 883.60 │ 1 │ 240 │ 488.90 ║
║ samber/slog-logrus ║ 65,823 │ 17,797.00 │ 94 │ 9,079 │ 22.87 ║
║ samber/slog-zap ║ 210,345 │ 6,138.00 │ 50 │ 7,223 │ 63.38 ║
║ samber/slog-zerolog ║ 216,938 │ 5,288.00 │ 60 │ 5,582 │ 74.89 ║
║ slog/JSONHandler ║ 803,263 │ 1,502.00 │ 6 │ 472 │ 277.59 ║
║ snqk/meld ║ 438,716 │ 2,552.00 │ 31 │ 2,186 │ 163.38 ║
║ svcrunner/jsonlog ║ 1,000,000 │ 1,059.00 │ 3 │ 280 │ 392.75 ║
║ veqryn/dedup/Append ║ 168,424 │ 6,042.00 │ 41 │ 9,721 │ 69.01 ║
║ veqryn/dedup/Ignore ║ 181,042 │ 6,071.00 │ 41 │ 9,721 │ 68.69 ║
║ veqryn/dedup/Increment ║ 160,406 │ 6,368.00 │ 41 │ 9,729 │ 65.48 ║
║ veqryn/dedup/Overwrite ║ 178,592 │ 6,048.00 │ 41 │ 9,722 │ 68.95 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark Big Group
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 51,025 │ 23,697.00 │ 215 │ 5,214 │ 444.16 ║
║ madkins/flash ║ 35,166 │ 34,488.00 │ 12 │ 45,359 │ 348.85 ║
║ madkins/replattr ║ 18,610 │ 62,888.00 │ 13 │ 45,360 │ 191.31 ║
║ madkins/sloggy ║ 17,518 │ 68,957.00 │ 2,358 │ 25,120 │ 174.48 ║
║ phsym/zeroslog ║ 76,651 │ 16,221.00 │ 1 │ 48 │ 649.10 ║
║ phuslu/slog ║ 111,912 │ 10,797.00 │ 1 │ 48 │ 975.70 ║
║ samber/slog-logrus ║ 3,158 │ 371,154.00 │ 4,024 │ 251,921 │ 28.36 ║
║ samber/slog-zap ║ 4,429 │ 270,907.00 │ 4,001 │ 252,209 │ 38.85 ║
║ samber/slog-zerolog ║ 4,422 │ 275,299.00 │ 4,001 │ 263,418 │ 38.25 ║
║ slog/JSONHandler ║ 51,270 │ 23,819.00 │ 1 │ 48 │ 442.28 ║
║ snqk/meld ║ 12,470 │ 99,223.00 │ 1,973 │ 98,816 │ 106.16 ║
║ svcrunner/jsonlog ║ 34,441 │ 35,892.00 │ 14 │ 56,137 │ 293.63 ║
║ veqryn/dedup/Append ║ 2,942 │ 398,169.00 │ 2,783 │ 890,292 │ 26.46 ║
║ veqryn/dedup/Ignore ║ 2,373 │ 422,996.00 │ 2,783 │ 891,053 │ 24.91 ║
║ veqryn/dedup/Increment ║ 2,330 │ 437,938.00 │ 2,944 │ 914,280 │ 24.05 ║
║ veqryn/dedup/Overwrite ║ 2,521 │ 409,270.00 │ 2,783 │ 890,609 │ 25.74 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark Disabled
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 41,174,551 │ 29.07 │ 0 │ 0 │ 0.00 ║
║ madkins/flash ║ 319,933,057 │ 3.75 │ 0 │ 0 │ 0.00 ║
║ madkins/replattr ║ 318,953,740 │ 7.65 │ 0 │ 0 │ 0.00 ║
║ madkins/sloggy ║ 320,593,141 │ 3.75 │ 0 │ 0 │ 0.00 ║
║ phsym/zeroslog ║ 319,660,309 │ 3.77 │ 0 │ 0 │ 0.00 ║
║ phuslu/slog ║ 404,661,037 │ 3.00 │ 0 │ 0 │ 0.00 ║
║ samber/slog-logrus ║ 319,968,763 │ 3.75 │ 0 │ 0 │ 0.00 ║
║ samber/slog-zap ║ 319,758,386 │ 3.75 │ 0 │ 0 │ 0.00 ║
║ samber/slog-zerolog ║ 320,353,143 │ 3.75 │ 0 │ 0 │ 0.00 ║
║ slog/JSONHandler ║ 307,638,812 │ 3.99 │ 0 │ 0 │ 0.00 ║
║ snqk/meld ║ 265,251,296 │ 4.53 │ 0 │ 0 │ 0.00 ║
║ svcrunner/jsonlog ║ 404,765,176 │ 2.97 │ 0 │ 0 │ 0.00 ║
║ veqryn/dedup/Append ║ 262,570,900 │ 4.53 │ 0 │ 0 │ 0.00 ║
║ veqryn/dedup/Ignore ║ 264,523,258 │ 4.57 │ 0 │ 0 │ 0.00 ║
║ veqryn/dedup/Increment ║ 264,934,015 │ 4.53 │ 0 │ 0 │ 0.00 ║
║ veqryn/dedup/Overwrite ║ 265,213,424 │ 4.55 │ 0 │ 0 │ 0.00 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark Key Values
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 756,090 │ 1,507.00 │ 5 │ 417 │ 258.15 ║
║ madkins/flash ║ 847,036 │ 1,418.00 │ 5 │ 504 │ 315.18 ║
║ madkins/replattr ║ 560,954 │ 2,070.00 │ 6 │ 508 │ 215.97 ║
║ madkins/sloggy ║ 416,635 │ 2,863.00 │ 64 │ 1,384 │ 156.14 ║
║ phsym/zeroslog ║ 1,000,000 │ 1,035.00 │ 3 │ 352 │ 382.51 ║
║ phuslu/slog ║ 1,291,179 │ 944.20 │ 1 │ 240 │ 457.53 ║
║ samber/slog-logrus ║ 67,507 │ 17,759.00 │ 94 │ 9,079 │ 22.92 ║
║ samber/slog-zap ║ 186,898 │ 6,201.00 │ 50 │ 7,224 │ 62.73 ║
║ samber/slog-zerolog ║ 221,190 │ 5,371.00 │ 60 │ 5,582 │ 73.73 ║
║ slog/JSONHandler ║ 778,650 │ 1,530.00 │ 6 │ 472 │ 272.62 ║
║ snqk/meld ║ 479,914 │ 2,659.00 │ 31 │ 2,186 │ 156.80 ║
║ svcrunner/jsonlog ║ 1,000,000 │ 1,089.00 │ 3 │ 280 │ 382.01 ║
║ veqryn/dedup/Append ║ 169,804 │ 5,977.00 │ 41 │ 9,724 │ 69.77 ║
║ veqryn/dedup/Ignore ║ 169,578 │ 6,076.00 │ 41 │ 9,724 │ 68.63 ║
║ veqryn/dedup/Increment ║ 161,138 │ 6,376.00 │ 41 │ 9,728 │ 65.40 ║
║ veqryn/dedup/Overwrite ║ 175,852 │ 6,021.00 │ 41 │ 9,722 │ 69.25 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark Logging
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 39,780 │ 33,850.00 │ 51 │ 1,635 │ 244.96 ║
║ madkins/flash ║ 35,166 │ 34,246.00 │ 153 │ 11,839 │ 280.55 ║
║ madkins/replattr ║ 23,190 │ 52,027.00 │ 204 │ 12,043 │ 184.81 ║
║ madkins/sloggy ║ 17,457 │ 68,537.00 │ 1,865 │ 26,992 │ 140.25 ║
║ phsym/zeroslog ║ 69,572 │ 17,394.00 │ 0 │ 0 │ 488.44 ║
║ phuslu/slog ║ 83,864 │ 14,260.00 │ 0 │ 0 │ 617.25 ║
║ samber/slog-logrus ║ 2,917 │ 403,544.00 │ 2,704 │ 202,592 │ 20.89 ║
║ samber/slog-zap ║ 10,000 │ 114,341.00 │ 1,071 │ 131,958 │ 72.52 ║
║ samber/slog-zerolog ║ 14,112 │ 86,631.00 │ 1,173 │ 91,033 │ 98.07 ║
║ slog/JSONHandler ║ 46,228 │ 27,730.00 │ 0 │ 0 │ 317.28 ║
║ snqk/meld ║ 24,211 │ 48,508.00 │ 561 │ 30,214 │ 181.37 ║
║ svcrunner/jsonlog ║ 59,827 │ 20,482.00 │ 0 │ 0 │ 439.46 ║
║ veqryn/dedup/Append ║ 8,750 │ 135,863.00 │ 867 │ 224,777 │ 64.76 ║
║ veqryn/dedup/Ignore ║ 7,861 │ 135,937.00 │ 867 │ 224,862 │ 64.71 ║
║ veqryn/dedup/Increment ║ 8,728 │ 138,331.00 │ 867 │ 224,806 │ 63.59 ║
║ veqryn/dedup/Overwrite ║ 7,371 │ 139,041.00 │ 867 │ 224,864 │ 63.29 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark Simple
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 3,169,288 │ 373.40 │ 1 │ 32 │ 195.52 ║
║ madkins/flash ║ 2,651,500 │ 453.10 │ 3 │ 232 │ 194.21 ║
║ madkins/replattr ║ 1,934,299 │ 625.20 │ 4 │ 236 │ 140.75 ║
║ madkins/sloggy ║ 1,759,131 │ 692.10 │ 14 │ 240 │ 128.60 ║
║ phsym/zeroslog ║ 6,082,543 │ 199.40 │ 0 │ 0 │ 386.17 ║
║ phuslu/slog ║ 7,861,970 │ 153.10 │ 0 │ 0 │ 542.24 ║
║ samber/slog-logrus ║ 355,820 │ 3,242.00 │ 26 │ 1,481 │ 22.52 ║
║ samber/slog-zap ║ 2,526,602 │ 475.20 │ 2 │ 336 │ 153.63 ║
║ samber/slog-zerolog ║ 3,217,803 │ 382.30 │ 2 │ 336 │ 201.42 ║
║ slog/JSONHandler ║ 3,962,881 │ 302.00 │ 0 │ 0 │ 274.86 ║
║ snqk/meld ║ 3,638,482 │ 327.40 │ 0 │ 0 │ 253.49 ║
║ svcrunner/jsonlog ║ 4,827,558 │ 242.30 │ 0 │ 0 │ 359.02 ║
║ veqryn/dedup/Append ║ 2,437,410 │ 499.60 │ 6 │ 280 │ 166.13 ║
║ veqryn/dedup/Ignore ║ 2,416,216 │ 500.50 │ 6 │ 280 │ 165.84 ║
║ veqryn/dedup/Increment ║ 2,411,690 │ 500.40 │ 6 │ 280 │ 165.88 ║
║ veqryn/dedup/Overwrite ║ 2,446,732 │ 504.60 │ 6 │ 280 │ 164.50 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark Simple Source
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 1,968,339 │ 610.80 │ 3 │ 280 │ 175.19 ║
║ madkins/flash ║ 1,296,170 │ 924.70 │ 7 │ 704 │ 304.96 ║
║ madkins/replattr ║ 1,000,000 │ 1,151.00 │ 8 │ 712 │ 246.71 ║
║ madkins/sloggy ║ 646,135 │ 1,756.00 │ 30 │ 1,280 │ 162.31 ║
║ phsym/zeroslog ║ 2,509,022 │ 476.30 │ 4 │ 312 │ 317.01 ║
║ phuslu/slog ║ 5,635,213 │ 213.10 │ 0 │ 0 │ 1,135.63 ║
║ samber/slog-logrus ║ 157,461 │ 7,436.00 │ 63 │ 4,276 │ 35.91 ║
║ samber/slog-zap ║ 1,643,460 │ 735.10 │ 5 │ 592 │ 145.55 ║
║ samber/slog-zerolog ║ 476,286 │ 2,564.00 │ 39 │ 2,763 │ 105.71 ║
║ slog/JSONHandler ║ 1,424,109 │ 865.70 │ 6 │ 568 │ 319.96 ║
║ snqk/meld ║ 1,363,777 │ 990.90 │ 6 │ 568 │ 279.55 ║
║ svcrunner/jsonlog ║ 4,799,905 │ 260.40 │ 0 │ 0 │ 330.23 ║
║ veqryn/dedup/Append ║ 1,000,000 │ 1,090.00 │ 12 │ 848 │ 254.05 ║
║ veqryn/dedup/Ignore ║ 1,000,000 │ 1,109.00 │ 12 │ 848 │ 249.68 ║
║ veqryn/dedup/Increment ║ 1,000,000 │ 1,120.00 │ 12 │ 848 │ 247.36 ║
║ veqryn/dedup/Overwrite ║ 1,000,000 │ 1,115.00 │ 12 │ 848 │ 248.42 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark With Attrs Attributes
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 765,348 │ 1,532.00 │ 5 │ 416 │ 481.21 ║
║ madkins/flash ║ 845,872 │ 1,385.00 │ 5 │ 504 │ 605.00 ║
║ madkins/replattr ║ 600,543 │ 2,038.00 │ 6 │ 508 │ 411.17 ║
║ madkins/sloggy ║ 397,540 │ 2,933.00 │ 64 │ 1,384 │ 286.06 ║
║ phsym/zeroslog ║ 1,000,000 │ 1,021.00 │ 3 │ 352 │ 731.43 ║
║ phuslu/slog ║ 1,333,819 │ 896.90 │ 1 │ 240 │ 906.44 ║
║ samber/slog-logrus ║ 44,931 │ 26,774.00 │ 139 │ 16,437 │ 24.05 ║
║ samber/slog-zap ║ 109,345 │ 12,163.00 │ 78 │ 14,983 │ 49.99 ║
║ samber/slog-zerolog ║ 124,011 │ 9,302.00 │ 95 │ 11,308 │ 66.44 ║
║ slog/JSONHandler ║ 807,038 │ 1,494.00 │ 6 │ 472 │ 523.43 ║
║ snqk/meld ║ 340,815 │ 3,619.00 │ 38 │ 3,363 │ 180.70 ║
║ svcrunner/jsonlog ║ 1,000,000 │ 1,085.00 │ 4 │ 288 │ 715.87 ║
║ veqryn/dedup/Append ║ 96,944 │ 11,417.00 │ 100 │ 16,465 │ 59.47 ║
║ veqryn/dedup/Ignore ║ 118,314 │ 8,956.00 │ 61 │ 14,069 │ 73.02 ║
║ veqryn/dedup/Increment ║ 95,857 │ 11,429.00 │ 74 │ 15,323 │ 69.29 ║
║ veqryn/dedup/Overwrite ║ 120,084 │ 8,889.00 │ 63 │ 14,165 │ 73.58 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark With Attrs Key Values
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 789,968 │ 1,529.00 │ 5 │ 416 │ 482.14 ║
║ madkins/flash ║ 838,875 │ 1,436.00 │ 5 │ 504 │ 583.56 ║
║ madkins/replattr ║ 564,667 │ 2,074.00 │ 6 │ 508 │ 403.98 ║
║ madkins/sloggy ║ 411,616 │ 2,891.00 │ 64 │ 1,384 │ 289.85 ║
║ phsym/zeroslog ║ 996,313 │ 1,042.00 │ 3 │ 352 │ 716.93 ║
║ phuslu/slog ║ 1,272,306 │ 949.10 │ 1 │ 240 │ 856.62 ║
║ samber/slog-logrus ║ 44,371 │ 26,775.00 │ 139 │ 16,435 │ 24.05 ║
║ samber/slog-zap ║ 106,971 │ 11,254.00 │ 78 │ 14,985 │ 54.03 ║
║ samber/slog-zerolog ║ 124,344 │ 9,640.00 │ 95 │ 11,307 │ 64.11 ║
║ slog/JSONHandler ║ 777,950 │ 1,558.00 │ 6 │ 472 │ 502.55 ║
║ snqk/meld ║ 352,626 │ 3,696.00 │ 38 │ 3,363 │ 176.94 ║
║ svcrunner/jsonlog ║ 1,000,000 │ 1,118.00 │ 4 │ 288 │ 695.00 ║
║ veqryn/dedup/Append ║ 94,188 │ 11,414.00 │ 100 │ 16,465 │ 59.49 ║
║ veqryn/dedup/Ignore ║ 120,589 │ 8,922.00 │ 61 │ 14,070 │ 73.31 ║
║ veqryn/dedup/Increment ║ 100,866 │ 11,450.00 │ 74 │ 15,321 │ 69.17 ║
║ veqryn/dedup/Overwrite ║ 122,040 │ 9,170.00 │ 63 │ 14,166 │ 71.21 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark With Attrs Simple
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 3,114,000 │ 384.10 │ 1 │ 32 │ 1,096.03 ║
║ madkins/flash ║ 2,566,215 │ 460.50 │ 3 │ 232 │ 1,040.11 ║
║ madkins/replattr ║ 1,897,164 │ 632.10 │ 4 │ 236 │ 757.76 ║
║ madkins/sloggy ║ 1,716,230 │ 692.30 │ 14 │ 240 │ 693.31 ║
║ phsym/zeroslog ║ 5,802,163 │ 209.60 │ 0 │ 0 │ 2,042.39 ║
║ phuslu/slog ║ 7,521,164 │ 159.70 │ 0 │ 0 │ 2,905.31 ║
║ samber/slog-logrus ║ 67,767 │ 17,645.00 │ 93 │ 8,841 │ 24.88 ║
║ samber/slog-zap ║ 205,501 │ 5,922.00 │ 49 │ 6,983 │ 71.08 ║
║ samber/slog-zerolog ║ 239,511 │ 5,049.00 │ 59 │ 5,342 │ 84.77 ║
║ slog/JSONHandler ║ 3,699,673 │ 299.80 │ 0 │ 0 │ 1,497.58 ║
║ snqk/meld ║ 669,667 │ 1,766.00 │ 8 │ 1,001 │ 254.27 ║
║ svcrunner/jsonlog ║ 3,873,990 │ 339.10 │ 1 │ 8 │ 1,320.96 ║
║ veqryn/dedup/Append ║ 179,883 │ 5,735.00 │ 39 │ 9,049 │ 78.30 ║
║ veqryn/dedup/Ignore ║ 179,449 │ 5,806.00 │ 39 │ 9,049 │ 77.33 ║
║ veqryn/dedup/Increment ║ 178,158 │ 6,141.00 │ 39 │ 9,050 │ 72.95 ║
║ veqryn/dedup/Overwrite ║ 174,152 │ 5,762.00 │ 39 │ 9,044 │ 77.93 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark With Group Attributes
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 781,776 │ 1,535.00 │ 7 │ 505 │ 262.48 ║
║ madkins/flash ║ 853,068 │ 1,402.00 │ 5 │ 504 │ 329.44 ║
║ madkins/replattr ║ 581,949 │ 2,038.00 │ 6 │ 508 │ 226.71 ║
║ madkins/sloggy ║ 379,204 │ 2,839.00 │ 64 │ 1,384 │ 163.06 ║
║ phsym/zeroslog ║ 1,000,000 │ 1,148.00 │ 4 │ 640 │ 357.11 ║
║ phuslu/slog ║ 1,321,803 │ 906.30 │ 1 │ 240 │ 492.08 ║
║ samber/slog-logrus ║ 58,345 │ 20,933.00 │ 168 │ 15,348 │ 18.01 ║
║ samber/slog-zap ║ 101,349 │ 11,621.00 │ 142 │ 13,737 │ 32.44 ║
║ samber/slog-zerolog ║ 100,422 │ 11,401.00 │ 144 │ 13,961 │ 33.42 ║
║ slog/JSONHandler ║ 773,347 │ 1,537.00 │ 6 │ 472 │ 280.37 ║
║ snqk/meld ║ 437,341 │ 2,678.00 │ 34 │ 2,074 │ 160.97 ║
║ svcrunner/jsonlog ║ 1,000,000 │ 1,076.00 │ 4 │ 296 │ 399.67 ║
║ veqryn/dedup/Append ║ 146,115 │ 7,467.00 │ 50 │ 13,270 │ 57.72 ║
║ veqryn/dedup/Ignore ║ 139,568 │ 7,565.00 │ 50 │ 13,276 │ 56.98 ║
║ veqryn/dedup/Increment ║ 136,323 │ 7,890.00 │ 50 │ 13,288 │ 54.63 ║
║ veqryn/dedup/Overwrite ║ 137,160 │ 7,539.00 │ 50 │ 13,275 │ 57.17 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Benchmark With Group Key Values
╔═════════════════════════╦═════════════╤═══════════════╤═════════════╤═════════════╤═════════════╗
║ Handler ║ Runs │ Ns/Op │ Allocs/Op │ Bytes/Op │ MB/Sec ║
╠═════════════════════════╬═════════════╪═══════════════╪═════════════╪═════════════╪═════════════╣
║ chanchal/zaphandler ║ 703,856 │ 1,584.00 │ 7 │ 505 │ 254.34 ║
║ madkins/flash ║ 795,336 │ 1,482.00 │ 5 │ 504 │ 311.76 ║
║ madkins/replattr ║ 569,724 │ 2,080.00 │ 6 │ 508 │ 222.09 ║
║ madkins/sloggy ║ 399,204 │ 2,983.00 │ 64 │ 1,384 │ 155.21 ║
║ phsym/zeroslog ║ 964,652 │ 1,189.00 │ 4 │ 640 │ 344.75 ║
║ phuslu/slog ║ 1,263,070 │ 957.90 │ 1 │ 240 │ 465.58 ║
║ samber/slog-logrus ║ 46,758 │ 21,407.00 │ 168 │ 15,348 │ 17.61 ║
║ samber/slog-zap ║ 102,225 │ 11,496.00 │ 142 │ 13,737 │ 32.79 ║
║ samber/slog-zerolog ║ 104,217 │ 11,509.00 │ 144 │ 13,961 │ 33.11 ║
║ slog/JSONHandler ║ 785,809 │ 1,567.00 │ 6 │ 472 │ 274.97 ║
║ snqk/meld ║ 423,217 │ 2,594.00 │ 34 │ 2,074 │ 166.15 ║
║ svcrunner/jsonlog ║ 1,000,000 │ 1,114.00 │ 4 │ 296 │ 385.85 ║
║ veqryn/dedup/Append ║ 140,689 │ 7,502.00 │ 50 │ 13,274 │ 57.45 ║
║ veqryn/dedup/Ignore ║ 145,676 │ 7,452.00 │ 50 │ 13,277 │ 57.83 ║
║ veqryn/dedup/Increment ║ 133,644 │ 7,960.00 │ 50 │ 13,288 │ 54.15 ║
║ veqryn/dedup/Overwrite ║ 145,614 │ 7,515.00 │ 50 │ 13,272 │ 57.35 ║
╚═════════════════════════╩═════════════╧═══════════════╧═════════════╧═════════════╧═════════════╝
Warnings for chanchal/zaphandler:
Required
1 [SlogTest] Failure of embedded slog/slogtest
Verify:SlogTest:
missing key "c": a Handler should handle multiple WithGroup and WithAttr calls (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:146)
missing key "c": a Handler should not output groups if there are no attributes (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:161)
1 [WithGroupEmpty] Empty WithGroup() logged
Verify:WithGroupEmpty: too many fields, found field 'group1', value is group, length: 0
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","group1":{}}
Implied
1 [CanceledContext] Canceled context blocks logging
Verify:CanceledContext
8 [LevelMath] Log levels are not properly treated as integers
Verify:DefaultLevel: INFO+1 is not enabled when WARN is set
Verify:DefaultLevel: INFO+1 is not enabled when WARN is set
Verify:LevelConfigured: 1 is not enabled when INFO is set
Verify:LevelConfigured: 1 is not enabled when INFO is set
Verify:LevelDifferent: 5 is not enabled when WARN is set
Verify:LevelDifferent: 5 is not enabled when WARN is set
Verify:LevelVar: INFO+1 is not enabled when INFO is set
Verify:LevelVar: 5 is not enabled when WARN is enabled
3 [NoReplAttr] HandlerOptions.ReplaceAttr not available
Verify:ReplaceAttr: too many attributes: 6, alpha == beta, change still exists, remove still exists
Verify:ReplaceAttrBasic:
too many attributes: 4
time field still exists
msg field still exists
source ==
Verify:ReplaceAttrFnRemoveEmptyKey
3 [NoReplAttrBasic] HandlerOptions.ReplaceAttr not available for basic fields
Verify:ReplaceAttrFnLevelCase: level value not null
Verify:ReplaceAttrFnMulti
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","alpha":"omega","pi":3.141592653589793,"alpha":"omega","goober":"snoofus","e":2.718281828459045,"alpha":"omega","gibbering":"lunatic","phi":1.618033988749895,"group":{}}
Verify:ReplaceAttrFnRemoveTime: time value not empty string
2 [SourceCaller] Source data logged as 'caller' instead of 'source'
Bench:SimpleSource: tests/benchmarks.go:96
{"level":"info","time":"2025-02-16T01:36:56Z","caller":"tests/benchmarks.go:96","msg":"This is a message"}
Verify:SourceKey: reflect/value.go:596
{"level":"info","time":"2025-02-16T01:41:19Z","caller":"reflect/value.go:596","msg":"This is a message"}
2 [WithGroup] WithGroup doesn't embed following attributes into group
Verify:GroupWithMulti
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","first":"one","second":2,"third":"3","group":{"subGroup":{"fourth":"forth","pi":3.141592653589793}}}
Verify:GroupWithMultiSubEmpty
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","first":"one","second":2,"third":"3","group":{}}
Suggested
2 [Duplicates] Duplicate field(s) found
Verify:AttributeDuplicate: map[alpha:2 charlie:3]
Verify:AttributeWithDuplicate: map[alpha:2 charlie:3]
1 [DurationSeconds] slog.Duration() logs seconds instead of nanoseconds
Verify:LogAttributes
1 [GroupWithTop] ^WithGroup().With()^ ends up at top level of log record instead of in the group
Verify:GroupWithTop
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","key":"value","group":{}}
10 [LevelCase] Log level in lowercase
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:KeyCase: 'debug'
Verify:KeyCase: 'info'
Verify:KeyCase: 'warn'
Verify:KeyCase: 'error'
Verify:Keys: 'info'
Verify:SourceKey: 'info'
Verify:ZeroPC: 'info'
Verify:ZeroTime: 'info'
1 [TimeMillis] slog.Time() logs milliseconds instead of nanoseconds
Verify:LogAttributes: 2025-02-16T01:41:19Z
Warnings for madkins/flash:
Suggested
2 [Duplicates] Duplicate field(s) found
Verify:AttributeDuplicate: map[alpha:2 charlie:3]
Verify:AttributeWithDuplicate: map[alpha:2 charlie:3]
Warnings for madkins/replattr:
Suggested
2 [Duplicates] Duplicate field(s) found
Verify:AttributeDuplicate: map[alpha:2 charlie:3]
Verify:AttributeWithDuplicate: map[alpha:2 charlie:3]
Warnings for madkins/sloggy:
Suggested
2 [Duplicates] Duplicate field(s) found
Verify:AttributeDuplicate: map[alpha:2 charlie:3]
Verify:AttributeWithDuplicate: map[alpha:2 charlie:3]
Warnings for phsym/zeroslog:
Required
3 [EmptyAttributes] Empty attribute(s) logged ("":null)
Verify:AttributeWithEmpty
{"level":"info","":null,"first":"one","pi":3.141592653589793,"time":"2025-02-16T01:41:19Z","message":"This is a message"}
Verify:AttributesEmpty
{"level":"info","first":"one","":null,"pi":3.141592653589793,"time":"2025-02-16T01:41:19Z","message":"This is a message"}
Verify:AttributesWithEmpty
{"level":"info","first":"one","second":2,"":null,"pi":3.141592653589793,"time":"2025-02-16T01:41:19Z","message":"This is a message"}
1 [GroupEmpty] Empty (sub)group(s) logged
Verify:GroupWithMultiSubEmpty: found 'subGroup' group
{"level":"info","first":"one","group":{"second":2,"third":"3","subGroup":{}},"time":"2025-02-16T01:41:19Z","message":"This is a message"}
1 [GroupInline] Group with empty key does not inline subfields
Verify:GroupInline
{"level":"info","first":"one","":{"second":2,"third":"3","fourth":"forth"},"pi":3.141592653589793,"time":"2025-02-16T01:41:19Z","message":"This is a message"}
1 [SlogTest] Failure of embedded slog/slogtest
Verify:SlogTest:
missing key "msg": this test expects slog.TimeKey, slog.LevelKey and slog.MessageKey (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:39)
unexpected key "": a Handler should ignore an empty Attr (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:61)
missing key "c": a Handler should inline the Attrs of a group with an empty key (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:119)
missing key "msg": a Handler should handle the WithGroup method (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:132)
missing key "msg": a Handler should handle multiple WithGroup and WithAttr calls (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:146)
missing key "msg": a Handler should not output groups if there are no attributes (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:161)
unexpected key "H": a Handler should not output groups if there are no attributes (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:161)
1 [WithGroupEmpty] Empty WithGroup() logged
Verify:WithGroupEmpty: too many fields, found field 'group1', value is group, length: 1
{"level":"info","group1":{"group2":{}},"time":"2025-02-16T01:41:19Z","message":"This is a message"}
Implied
7 [MessageKey] Wrong message key (should be 'msg')
Verify:CanceledContext: `message`
Verify:CanceledContext: `message`
Verify:CanceledContext: `message`
Verify:Keys: `message`
Verify:SourceKey: `message`
Verify:ZeroPC: `message`
Verify:ZeroTime: `message`
7 [NoReplAttr] HandlerOptions.ReplaceAttr not available
Verify:ReplaceAttr: too many attributes: 6, alpha == beta, change still exists, remove still exists
Verify:ReplaceAttrBasic:
too many attributes: 4
time field still exists
message field still exists
source ==
Verify:ReplaceAttrFnChangeKey:
too few attributes: 3
no message key
message not string
Verify:ReplaceAttrFnLevelCase: level value not null
Verify:ReplaceAttrFnMulti
{"level":"info","group":{"alpha":"omega","pi":3.141592653589793,"subGroup":{"alpha":"omega","goober":"snoofus","e":2.718281828459045,"oneMore":{"alpha":"omega","gibbering":"lunatic","phi":1.618033988749895}}},"time":"2025-02-16T01:41:19Z","message":"This is a message"}
Verify:ReplaceAttrFnRemoveEmptyKey
Verify:ReplaceAttrFnRemoveTime: time value not empty string
2 [SourceCaller] Source data logged as 'caller' instead of 'source'
Bench:SimpleSource: /home/runner/work/go-slog/go-slog/bench/tests/benchmarks.go:96
{"level":"info","caller":"/home/runner/work/go-slog/go-slog/bench/tests/benchmarks.go:96","time":"2025-02-16T01:38:24Z","message":"This is a message"}
Verify:SourceKey: /opt/hostedtoolcache/go/1.22.12/x64/src/reflect/value.go:596
{"level":"info","caller":"/opt/hostedtoolcache/go/1.22.12/x64/src/reflect/value.go:596","time":"2025-02-16T01:41:19Z","message":"This is a message"}
Suggested
2 [Duplicates] Duplicate field(s) found
Verify:AttributeDuplicate: map[alpha:2 charlie:3]
Verify:AttributeWithDuplicate: map[alpha:2 charlie:3]
1 [DurationMillis] slog.Duration() logs milliseconds instead of nanoseconds
Verify:LogAttributes
11 [LevelCase] Log level in lowercase
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:KeyCase: 'error'
Verify:KeyCase: 'debug'
Verify:KeyCase: 'info'
Verify:KeyCase: 'warn'
Verify:Keys: 'info'
Verify:SourceKey: 'info'
Verify:ZeroPC: 'info'
Verify:ZeroTime: 'info'
1 [TimeMillis] slog.Time() logs milliseconds instead of nanoseconds
Verify:LogAttributes: 2025-02-16T01:41:19Z
Administrative
1 [Unused] Unused Warnings(s)
Verify:ZeroTime: ZeroTime
Warnings for phuslu/slog:
Suggested
2 [Duplicates] Duplicate field(s) found
Verify:AttributeDuplicate: map[alpha:2 charlie:3]
Verify:AttributeWithDuplicate: map[alpha:2 charlie:3]
Warnings for samber/slog-logrus:
Required
4 [Resolver] LogValuer objects are not resolved
Verify:ResolveGroup
{"group":{"hidden":{},"pi":3.141592653589793},"level":"info","msg":"This is a message","time":"2025-02-16T01:41:19Z"}
Verify:ResolveGroupWith
{"group":{"hidden":{},"pi":3.141592653589793},"level":"info","msg":"This is a message","time":"2025-02-16T01:41:19Z"}
Verify:ResolveValuer
{"hidden":{},"level":"info","msg":"This is a message","time":"2025-02-16T01:41:19Z"}
Verify:ResolveWith
{"hidden":{},"level":"info","msg":"This is a message","time":"2025-02-16T01:41:19Z"}
1 [SlogTest] Failure of embedded slog/slogtest
Verify:SlogTest:
unexpected key "time": a Handler should ignore a zero Record.Time (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:73)
missing key "c": a Handler should inline the Attrs of a group with an empty key (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:119)
"k": got map[string]interface {}{}, want "replaced": a Handler should call Resolve on attribute values (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:176)
"b": got map[string]interface {}{}, want "v2": a Handler should call Resolve on attribute values in groups (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:184)
"k": got map[string]interface {}{}, want "replaced": a Handler should call Resolve on attribute values from WithAttrs (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:198)
"b": got map[string]interface {}{}, want "v2": a Handler should call Resolve on attribute values in groups from WithAttrs (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:207)
1 [ZeroTime] Zero time is logged
Verify:ZeroTime: 2025-02-16T01:41:19Z
{"level":"info","msg":"This is a message","time":"2025-02-16T01:41:19Z"}
Implied
5 [NoReplAttrBasic] HandlerOptions.ReplaceAttr not available for basic fields
Verify:ReplaceAttrBasic:
too many attributes: 4
time field still exists
msg field still exists
source == map[file:/home/runner/work/go-slog/go-slog/verify/tests/replace.go function:github.com/madkins23/go-slog/verify/tests.(*SlogTestSuite).TestReplaceAttrBasic line:89]
Verify:ReplaceAttrFnLevelCase: level value not null
Verify:ReplaceAttrFnMulti
{"group":{"alpha":"OMEGA","pi":3.141592653589793,"subGroup":{"e":2.718281828459045,"goober":"snoofus","la la la":"omega","oneMore":{"alpha":"omega","gibbering":"moontic","phi":1.618033988749895}}},"level":"info","msg":"This is a message","time":"2025-02-16T01:41:19Z"}
Verify:ReplaceAttrFnRemoveEmptyKey
Verify:ReplaceAttrFnRemoveTime: time value not empty string
Suggested
10 [LevelCase] Log level in lowercase
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:KeyCase: 'debug'
Verify:KeyCase: 'info'
Verify:KeyCase: 'error'
Verify:Keys: 'info'
Verify:SourceKey: 'info'
Verify:ZeroPC: 'info'
Verify:ZeroTime: 'info'
1 [LevelWrong] Log level is incorrect
Verify:KeyCase: should be 'WARN', not 'warning'
4 [NoEmptyName] Attributes with empty names are not logged
Verify:AttributeEmptyName
{"first":"one","level":"info","msg":"This is a message","pi":3.141592653589793,"time":"2025-02-16T01:41:19Z"}
Verify:AttributeWithEmptyName
{"first":"one","level":"info","msg":"This is a message","pi":3.141592653589793,"time":"2025-02-16T01:41:19Z"}
Verify:AttributesNotEmpty
{"first":"one","level":"info","msg":"This is a message","pi":3.141592653589793,"time":"2025-02-16T01:41:19Z"}
Verify:AttributesWithNotEmpty
{"first":"one","level":"info","msg":"This is a message","pi":3.141592653589793,"second":2,"time":"2025-02-16T01:41:19Z"}
Administrative
3 [Unused] Unused Warnings(s)
Verify:GroupInline: GroupInline
Verify:WithGroupInline: GroupInline
Verify:ZeroPC: ZeroPC
Warnings for samber/slog-zap:
Required
4 [Resolver] LogValuer objects are not resolved
Verify:ResolveGroup
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","group":{"hidden":{},"pi":3.141592653589793}}
Verify:ResolveGroupWith
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","group":{"hidden":{},"pi":3.141592653589793}}
Verify:ResolveValuer
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","hidden":{}}
Verify:ResolveWith
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","hidden":{}}
1 [SlogTest] Failure of embedded slog/slogtest
Verify:SlogTest:
unexpected key "time": a Handler should ignore a zero Record.Time (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:73)
missing key "c": a Handler should inline the Attrs of a group with an empty key (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:119)
"k": got "", want "replaced": a Handler should call Resolve on attribute values (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:176)
"b": got map[string]interface {}{}, want "v2": a Handler should call Resolve on attribute values in groups (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:184)
"k": got "", want "replaced": a Handler should call Resolve on attribute values from WithAttrs (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:198)
"b": got map[string]interface {}{}, want "v2": a Handler should call Resolve on attribute values in groups from WithAttrs (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:207)
1 [ZeroPC] SourceKey logged for zero PC
Verify:ZeroPC: non-standard key 'caller'
{"level":"info","time":"2025-02-16T01:41:19Z","caller":":0","msg":"This is a message"}
1 [ZeroTime] Zero time is logged
Verify:ZeroTime: 2025-02-16T01:41:19Z
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message"}
Implied
5 [NoReplAttrBasic] HandlerOptions.ReplaceAttr not available for basic fields
Verify:ReplaceAttrBasic:
too many attributes: 4
time field still exists
msg field still exists
source ==
Verify:ReplaceAttrFnLevelCase: level value not null
Verify:ReplaceAttrFnMulti
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","group":{"alpha":"OMEGA","pi":3.141592653589793,"subGroup":{"e":2.718281828459045,"goober":"snoofus","la la la":"omega","oneMore":{"alpha":"omega","gibbering":"moontic","phi":1.618033988749895}}}}
Verify:ReplaceAttrFnRemoveEmptyKey
Verify:ReplaceAttrFnRemoveTime: time value not empty string
2 [SourceCaller] Source data logged as 'caller' instead of 'source'
Bench:SimpleSource: tests/benchmarks.go:96
{"level":"info","time":"2025-02-16T01:39:17Z","caller":"tests/benchmarks.go:96","msg":"This is a message"}
Verify:SourceKey: reflect/value.go:596
{"level":"info","time":"2025-02-16T01:41:19Z","caller":"reflect/value.go:596","msg":"This is a message"}
Suggested
1 [DurationSeconds] slog.Duration() logs seconds instead of nanoseconds
Verify:LogAttributes
1 [GroupDuration]
Verify:GroupDuration: 29002.000000 != 29002000000000.000000
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","outer":29002,"group":{"inner":29002000000000}}
11 [LevelCase] Log level in lowercase
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:KeyCase: 'debug'
Verify:KeyCase: 'info'
Verify:KeyCase: 'warn'
Verify:KeyCase: 'error'
Verify:Keys: 'info'
Verify:SourceKey: 'info'
Verify:ZeroPC: 'info'
Verify:ZeroTime: 'info'
4 [NoEmptyName] Attributes with empty names are not logged
Verify:AttributeEmptyName
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","first":"one","pi":3.141592653589793}
Verify:AttributeWithEmptyName
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","first":"one","pi":3.141592653589793}
Verify:AttributesNotEmpty
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","first":"one","pi":3.141592653589793}
Verify:AttributesWithNotEmpty
{"level":"info","time":"2025-02-16T01:41:19Z","msg":"This is a message","first":"one","second":2,"pi":3.141592653589793}
1 [TimeMillis] slog.Time() logs milliseconds instead of nanoseconds
Verify:LogAttributes: 2025-02-16T01:41:19Z
Administrative
2 [Unused] Unused Warnings(s)
Verify:GroupInline: GroupInline
Verify:WithGroupInline: GroupInline
Warnings for samber/slog-zerolog:
Required
4 [Resolver] LogValuer objects are not resolved
Verify:ResolveGroup
{"level":"info","time":"2025-02-16T01:41:19Z","group":{"hidden":{},"pi":3.141592653589793},"message":"This is a message"}
Verify:ResolveGroupWith
{"level":"info","time":"2025-02-16T01:41:19Z","group":{"hidden":{},"pi":3.141592653589793},"message":"This is a message"}
Verify:ResolveValuer
{"level":"info","time":"2025-02-16T01:41:19Z","hidden":{},"message":"This is a message"}
Verify:ResolveWith
{"level":"info","time":"2025-02-16T01:41:19Z","hidden":{},"message":"This is a message"}
1 [SlogTest] Failure of embedded slog/slogtest
Verify:SlogTest:
missing key "msg": this test expects slog.TimeKey, slog.LevelKey and slog.MessageKey (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:39)
unexpected key "time": a Handler should ignore a zero Record.Time (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:73)
missing key "c": a Handler should inline the Attrs of a group with an empty key (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:119)
missing key "msg": a Handler should handle the WithGroup method (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:132)
missing key "msg": a Handler should handle multiple WithGroup and WithAttr calls (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:146)
missing key "msg": a Handler should not output groups if there are no attributes (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:161)
"k": got map[string]interface {}{}, want "replaced": a Handler should call Resolve on attribute values (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:176)
"b": got map[string]interface {}{}, want "v2": a Handler should call Resolve on attribute values in groups (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:184)
"k": got map[string]interface {}{}, want "replaced": a Handler should call Resolve on attribute values from WithAttrs (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:198)
"b": got map[string]interface {}{}, want "v2": a Handler should call Resolve on attribute values in groups from WithAttrs (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:207)
1 [ZeroTime] Zero time is logged
Verify:ZeroTime: 0001-01-01T00:00:00Z
{"level":"info","time":"0001-01-01T00:00:00Z","message":"This is a message"}
Implied
2 [DefaultLevel] Handler doesn't default to slog.LevelInfo
Verify:DefaultLevel: defaultlevel is 'DEBUG'
Verify:DefaultLevel: defaultlevel with AddSource is 'DEBUG'
7 [MessageKey] Wrong message key (should be 'msg')
Verify:CanceledContext: `message`
Verify:CanceledContext: `message`
Verify:CanceledContext: `message`
Verify:Keys: `message`
Verify:SourceKey: `message`
Verify:ZeroPC: `message`
Verify:ZeroTime: `message`
6 [NoReplAttrBasic] HandlerOptions.ReplaceAttr not available for basic fields
Verify:ReplaceAttrBasic:
too many attributes: 4
time field still exists
message field still exists
source == map[file:/home/runner/work/go-slog/go-slog/verify/tests/replace.go function:github.com/madkins23/go-slog/verify/tests.(*SlogTestSuite).TestReplaceAttrBasic line:89]
Verify:ReplaceAttrFnChangeKey:
too few attributes: 3
no message key
message not string
Verify:ReplaceAttrFnLevelCase: level value not null
Verify:ReplaceAttrFnMulti
{"level":"info","time":"2025-02-16T01:41:19Z","group":{"alpha":"OMEGA","pi":3.141592653589793,"subGroup":{"e":2.718281828459045,"goober":"snoofus","la la la":"omega","oneMore":{"alpha":"omega","gibbering":"moontic","phi":1.618033988749895}}},"message":"This is a message"}
Verify:ReplaceAttrFnRemoveEmptyKey
Verify:ReplaceAttrFnRemoveTime: time value not empty string
Suggested
1 [DurationMillis] slog.Duration() logs milliseconds instead of nanoseconds
Verify:LogAttributes
1 [GroupDuration]
Verify:GroupDuration: 29002000.000000 != 29002000000000.000000
{"level":"info","time":"2025-02-16T01:41:19Z","group":{"inner":29002000000000},"outer":29002000,"message":"This is a message"}
11 [LevelCase] Log level in lowercase
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:CanceledContext: 'info'
Verify:KeyCase: 'debug'
Verify:KeyCase: 'info'
Verify:KeyCase: 'warn'
Verify:KeyCase: 'error'
Verify:Keys: 'info'
Verify:SourceKey: 'info'
Verify:ZeroPC: 'info'
Verify:ZeroTime: 'info'
4 [NoEmptyName] Attributes with empty names are not logged
Verify:AttributeEmptyName
{"level":"info","time":"2025-02-16T01:41:19Z","first":"one","pi":3.141592653589793,"message":"This is a message"}
Verify:AttributeWithEmptyName
{"level":"info","time":"2025-02-16T01:41:19Z","first":"one","pi":3.141592653589793,"message":"This is a message"}
Verify:AttributesNotEmpty
{"level":"info","time":"2025-02-16T01:41:19Z","first":"one","pi":3.141592653589793,"message":"This is a message"}
Verify:AttributesWithNotEmpty
{"level":"info","time":"2025-02-16T01:41:19Z","first":"one","pi":3.141592653589793,"second":2,"message":"This is a message"}
1 [TimeMillis] slog.Time() logs milliseconds instead of nanoseconds
Verify:LogAttributes: 2025-02-16T01:41:19Z
Administrative
3 [Unused] Unused Warnings(s)
Verify:GroupInline: GroupInline
Verify:WithGroupInline: GroupInline
Verify:ZeroPC: ZeroPC
Warnings for slog/JSONHandler:
Suggested
2 [Duplicates] Duplicate field(s) found
Verify:AttributeDuplicate: map[alpha:2 charlie:3]
Verify:AttributeWithDuplicate: map[alpha:2 charlie:3]
Warnings for snqk/meld:
Warnings for svcrunner/jsonlog:
Required
1 [LevelVar] Unable to change level during execution via LevelVar
Verify:LevelVar: level not changed
1 [SlogTest] Failure of embedded slog/slogtest
Verify:SlogTest:
missing key "msg": this test expects slog.TimeKey, slog.LevelKey and slog.MessageKey (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:39)
missing key "msg": a Handler should handle the WithGroup method (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:132)
missing key "msg": a Handler should handle multiple WithGroup and WithAttr calls (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:146)
missing key "msg": a Handler should not output groups if there are no attributes (/opt/hostedtoolcache/go/1.22.12/x64/src/testing/slogtest/slogtest.go:161)
Implied
7 [MessageKey] Wrong message key (should be 'msg')
Verify:CanceledContext: `message`
Verify:CanceledContext: `message`
Verify:CanceledContext: `message`
Verify:Keys: `message`
Verify:SourceKey: `message`
Verify:ZeroPC: `message`
Verify:ZeroTime: `message`
7 [NoReplAttr] HandlerOptions.ReplaceAttr not available
Verify:ReplaceAttr: too many attributes: 6, alpha == beta, change still exists, remove still exists
Verify:ReplaceAttrBasic:
time field still exists
message field still exists
source ==
Verify:ReplaceAttrFnChangeKey:
too few attributes: 3
no message key
message not string
Verify:ReplaceAttrFnLevelCase: level value not null
Verify:ReplaceAttrFnMulti
{"time":"2025-02-16T01:41:19.49671943Z","level":"INFO","message":"This is a message","group":{"alpha":"omega","pi":3.141592653589793,"subGroup":{"alpha":"omega","goober":"snoofus","e":2.718281828459045,"oneMore":{"alpha":"omega","gibbering":"lunatic","phi":1.618033988749895}}}}
Verify:ReplaceAttrFnRemoveEmptyKey
Verify:ReplaceAttrFnRemoveTime: time value not empty string
2 [SourceKey] Source data not logged when AddSource flag set
Bench:SimpleSource: no 'source' key
{"time":"2025-02-16T01:39:50.73380189Z","level":"INFO","message":"This is a message"}
Verify:SourceKey: no 'source' key
{"time":"2025-02-16T01:41:19.497315904Z","level":"INFO","message":"This is a message"}
Suggested
2 [Duplicates] Duplicate field(s) found
Verify:AttributeDuplicate: map[alpha:2 charlie:3]
Verify:AttributeWithDuplicate: map[alpha:2 charlie:3]
2 [DurationString] slog.Duration() logs a string representation instead of nanoseconds
Verify:GroupDuration: 8h3m22s
{"time":"2025-02-16T01:41:19.49527052Z","level":"INFO","message":"This is a message","outer":"8h3m22s","group":{"inner":"8h3m22s"}}
Verify:LogAttributes: 1m0s
{"time":"2025-02-16T01:41:19.496392184Z","level":"INFO","message":"This is a message","when":"2025-02-16T01:41:19.49638976Z","howLong":"1m0s","goober":"snoofus","boolean":true,"pi":3.141592653589793,"skidoo":23,"minus":-64,"unsigned":79,"any":["alpha","omega"]}
4 [NoEmptyName] Attributes with empty names are not logged
Verify:AttributeEmptyName
{"time":"2025-02-16T01:41:19.493095344Z","level":"INFO","message":"This is a message","first":"one","pi":3.141592653589793}
Verify:AttributeWithEmptyName
{"time":"2025-02-16T01:41:19.493399917Z","level":"INFO","message":"This is a message","first":"one","pi":3.141592653589793}
Verify:AttributesNotEmpty
{"time":"2025-02-16T01:41:19.493696356Z","level":"INFO","message":"This is a message","first":"one","pi":3.141592653589793}
Verify:AttributesWithNotEmpty
{"time":"2025-02-16T01:41:19.493899743Z","level":"INFO","message":"This is a message","first":"one","second":2,"pi":3.141592653589793}
Warnings for veqryn/dedup/Append:
Administrative
3 [SkipDedup] Test depends on dedup order
Verify:AttributeDuplicate: Skipping test
Verify:AttributeWithDuplicate: Skipping test
Verify:ComplexCases: Skipping test
3 [SkippingTest] Skipping test
Verify:AttributeDuplicate: SkipDedup
Verify:AttributeWithDuplicate: SkipDedup
Verify:ComplexCases: SkipDedup
Warnings for veqryn/dedup/Ignore:
Administrative
3 [SkipDedup] Test depends on dedup order
Verify:AttributeDuplicate: Skipping test
Verify:AttributeWithDuplicate: Skipping test
Verify:ComplexCases: Skipping test
3 [SkippingTest] Skipping test
Verify:AttributeDuplicate: SkipDedup
Verify:AttributeWithDuplicate: SkipDedup
Verify:ComplexCases: SkipDedup
Warnings for veqryn/dedup/Increment:
Administrative
3 [SkipDedup] Test depends on dedup order
Verify:AttributeDuplicate: Skipping test
Verify:AttributeWithDuplicate: Skipping test
Verify:ComplexCases: Skipping test
3 [SkippingTest] Skipping test
Verify:AttributeDuplicate: SkipDedup
Verify:AttributeWithDuplicate: SkipDedup
Verify:ComplexCases: SkipDedup
Warnings for veqryn/dedup/Overwrite: