[{"data":1,"prerenderedAt":2585},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-fastify":238,"-frameworks-fastify-surround":2580},[4,30,110,154,208,224],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Frameworks","\u002Fframeworks","2.frameworks",[35,40,45,50,55,60,65,70,75,80,85,90,95,100,105],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Fframeworks\u002Foverview","2.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":41,"path":42,"stem":43,"icon":44},"Nuxt","\u002Fframeworks\u002Fnuxt","2.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":46,"path":47,"stem":48,"icon":49},"Next.js","\u002Fframeworks\u002Fnextjs","2.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":51,"path":52,"stem":53,"icon":54},"SvelteKit","\u002Fframeworks\u002Fsveltekit","2.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":56,"path":57,"stem":58,"icon":59},"Nitro","\u002Fframeworks\u002Fnitro","2.frameworks\u002F04.nitro","i-custom-nitro",{"title":61,"path":62,"stem":63,"icon":64},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","2.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":66,"path":67,"stem":68,"icon":69},"NestJS","\u002Fframeworks\u002Fnestjs","2.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":71,"path":72,"stem":73,"icon":74},"Express","\u002Fframeworks\u002Fexpress","2.frameworks\u002F07.express","i-simple-icons-express",{"title":76,"path":77,"stem":78,"icon":79},"Hono","\u002Fframeworks\u002Fhono","2.frameworks\u002F08.hono","i-simple-icons-hono",{"title":81,"path":82,"stem":83,"icon":84},"Fastify","\u002Fframeworks\u002Ffastify","2.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":86,"path":87,"stem":88,"icon":89},"Elysia","\u002Fframeworks\u002Felysia","2.frameworks\u002F10.elysia","i-custom-elysia",{"title":91,"path":92,"stem":93,"icon":94},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","2.frameworks\u002F11.cloudflare-workers","i-simple-icons-cloudflare",{"title":96,"path":97,"stem":98,"icon":99},"Standalone","\u002Fframeworks\u002Fstandalone","2.frameworks\u002F12.standalone","i-simple-icons-typescript",{"title":101,"path":102,"stem":103,"icon":104},"Astro","\u002Fframeworks\u002Fastro","2.frameworks\u002F13.astro","i-simple-icons-astro",{"title":106,"path":107,"stem":108,"icon":109},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","2.frameworks\u002F14.custom-integration","i-lucide-puzzle",{"title":111,"path":112,"stem":113,"children":114,"page":29},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[115,120,125,130,135,139,144,149],{"title":116,"path":117,"stem":118,"icon":119},"Request Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":121,"path":122,"stem":123,"icon":124},"Wide Events","\u002Fcore-concepts\u002Fwide-events","3.core-concepts\u002F1.wide-events","i-lucide-layers",{"title":126,"path":127,"stem":128,"icon":129},"Structured Errors","\u002Fcore-concepts\u002Fstructured-errors","3.core-concepts\u002F2.structured-errors","i-lucide-shield-alert",{"title":131,"path":132,"stem":133,"icon":134},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F3.best-practices","i-lucide-shield-check",{"title":136,"path":137,"stem":138,"icon":99},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F4.typed-fields",{"title":140,"path":141,"stem":142,"icon":143},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F5.sampling","i-lucide-filter",{"title":145,"path":146,"stem":147,"icon":148},"Client Logging","\u002Fcore-concepts\u002Fclient-logging","3.core-concepts\u002F6.client-logging","i-lucide-monitor",{"title":150,"path":151,"stem":152,"icon":153},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F7.configuration","i-lucide-settings",{"title":155,"path":156,"stem":157,"children":158,"page":29},"Adapters","\u002Fadapters","4.adapters",[159,163,168,173,178,183,188,193,198,203],{"title":36,"path":160,"stem":161,"icon":162},"\u002Fadapters\u002Foverview","4.adapters\u002F1.overview","i-custom-plug",{"title":164,"path":165,"stem":166,"icon":167},"Browser","\u002Fadapters\u002Fbrowser","4.adapters\u002F10.browser","i-lucide-globe",{"title":169,"path":170,"stem":171,"icon":172},"Axiom","\u002Fadapters\u002Faxiom","4.adapters\u002F2.axiom","i-custom-axiom",{"title":174,"path":175,"stem":176,"icon":177},"OTLP","\u002Fadapters\u002Fotlp","4.adapters\u002F3.otlp","i-simple-icons-opentelemetry",{"title":179,"path":180,"stem":181,"icon":182},"PostHog","\u002Fadapters\u002Fposthog","4.adapters\u002F4.posthog","i-simple-icons-posthog",{"title":184,"path":185,"stem":186,"icon":187},"Sentry","\u002Fadapters\u002Fsentry","4.adapters\u002F5.sentry","i-simple-icons-sentry",{"title":189,"path":190,"stem":191,"icon":192},"Better Stack","\u002Fadapters\u002Fbetter-stack","4.adapters\u002F6.better-stack","i-simple-icons-betterstack",{"title":194,"path":195,"stem":196,"icon":197},"File System","\u002Fadapters\u002Ffs","4.adapters\u002F7.fs","i-lucide-hard-drive",{"title":199,"path":200,"stem":201,"icon":202},"Custom Adapters","\u002Fadapters\u002Fcustom","4.adapters\u002F8.custom","i-lucide-code",{"title":204,"path":205,"stem":206,"icon":207},"Pipeline","\u002Fadapters\u002Fpipeline","4.adapters\u002F9.pipeline","i-lucide-workflow",{"title":209,"path":210,"stem":211,"children":212,"page":29},"Enrichers","\u002Fenrichers","5.enrichers",[213,216,220],{"title":36,"path":214,"stem":215,"icon":28},"\u002Fenrichers\u002Foverview","5.enrichers\u002F1.overview",{"title":217,"path":218,"stem":219,"icon":109},"Built-in","\u002Fenrichers\u002Fbuilt-in","5.enrichers\u002F2.built-in",{"title":221,"path":222,"stem":223,"icon":202},"Custom","\u002Fenrichers\u002Fcustom","5.enrichers\u002F3.custom",{"title":225,"path":226,"stem":227,"children":228,"page":29},"NuxtHub","\u002Fnuxthub","6.nuxthub",[229,233],{"title":36,"path":230,"stem":231,"icon":232},"\u002Fnuxthub\u002Foverview","6.nuxthub\u002F1.overview","i-lucide-database",{"title":234,"path":235,"stem":236,"icon":237},"Retention","\u002Fnuxthub\u002Fretention","6.nuxthub\u002F2.retention","i-lucide-clock",{"id":239,"title":81,"body":240,"description":2570,"extension":2571,"links":2572,"meta":2576,"navigation":2577,"path":82,"seo":2578,"stem":83,"__hash__":2579},"docs\u002F2.frameworks\u002F09.fastify.md",{"type":241,"value":242,"toc":2554},"minimark",[243,260,341,345,350,373,377,701,710,713,716,1018,1021,1085,1088,1094,1277,1395,1410,1414,1435,1760,1763,1810,1813,1824,1828,1831,1998,2002,2009,2202,2215,2219,2225,2329,2333,2343,2486,2490,2531,2540,2550],[244,245,246,247,251,252,255,256,259],"p",{},"The ",[248,249,250],"code",{},"evlog\u002Ffastify"," plugin auto-creates a request-scoped logger accessible via ",[248,253,254],{},"request.log"," and ",[248,257,258],{},"useLogger()",", emitting a wide event when the response completes.",[261,262,263],"code-collapse",{},[264,265,271],"pre",{"className":266,"code":267,"filename":268,"language":269,"meta":270,"style":270},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Set up evlog in my Fastify app.\n\n- Install evlog: pnpm add evlog\n- Call initLogger({ env: { service: 'my-api' } }) at startup\n- Import evlog from 'evlog\u002Ffastify' and register with app.register(evlog)\n- Access the logger via request.log in route handlers or useLogger() anywhere\n- Use log.set() to accumulate context throughout the request\n- Optionally pass drain, enrich, include, and keep options when registering\n\nDocs: https:\u002F\u002Fwww.evlog.dev\u002Fframeworks\u002Ffastify\nAdapters: https:\u002F\u002Fwww.evlog.dev\u002Fadapters\n","Prompt","txt","",[248,272,273,281,288,294,300,306,312,318,324,329,335],{"__ignoreMap":270},[274,275,278],"span",{"class":276,"line":277},"line",1,[274,279,280],{},"Set up evlog in my Fastify app.\n",[274,282,284],{"class":276,"line":283},2,[274,285,287],{"emptyLinePlaceholder":286},true,"\n",[274,289,291],{"class":276,"line":290},3,[274,292,293],{},"- Install evlog: pnpm add evlog\n",[274,295,297],{"class":276,"line":296},4,[274,298,299],{},"- Call initLogger({ env: { service: 'my-api' } }) at startup\n",[274,301,303],{"class":276,"line":302},5,[274,304,305],{},"- Import evlog from 'evlog\u002Ffastify' and register with app.register(evlog)\n",[274,307,309],{"class":276,"line":308},6,[274,310,311],{},"- Access the logger via request.log in route handlers or useLogger() anywhere\n",[274,313,315],{"class":276,"line":314},7,[274,316,317],{},"- Use log.set() to accumulate context throughout the request\n",[274,319,321],{"class":276,"line":320},8,[274,322,323],{},"- Optionally pass drain, enrich, include, and keep options when registering\n",[274,325,327],{"class":276,"line":326},9,[274,328,287],{"emptyLinePlaceholder":286},[274,330,332],{"class":276,"line":331},10,[274,333,334],{},"Docs: https:\u002F\u002Fwww.evlog.dev\u002Fframeworks\u002Ffastify\n",[274,336,338],{"class":276,"line":337},11,[274,339,340],{},"Adapters: https:\u002F\u002Fwww.evlog.dev\u002Fadapters\n",[342,343,20],"h2",{"id":344},"quick-start",[346,347,349],"h3",{"id":348},"_1-install","1. Install",[264,351,355],{"className":352,"code":353,"language":354,"meta":270,"style":270},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add evlog fastify\n","bash",[248,356,357],{"__ignoreMap":270},[274,358,359,363,367,370],{"class":276,"line":277},[274,360,362],{"class":361},"sBMFI","bun",[274,364,366],{"class":365},"sfazB"," add",[274,368,369],{"class":365}," evlog",[274,371,372],{"class":365}," fastify\n",[346,374,376],{"id":375},"_2-initialize-and-register-the-plugin","2. Initialize and register the plugin",[264,378,383],{"className":379,"code":380,"filename":381,"language":382,"meta":270,"style":270},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import Fastify from 'fastify'\nimport { initLogger } from 'evlog'\nimport { evlog } from 'evlog\u002Ffastify'\n\ninitLogger({\n  env: { service: 'my-api' },\n})\n\nconst app = Fastify({ logger: false })\n\nawait app.register(evlog)\n\napp.get('\u002Fhealth', async (request) => {\n  request.log.set({ route: 'health' })\n  return { ok: true }\n})\n\nawait app.listen({ port: 3000 })\n","src\u002Findex.ts","typescript",[248,384,385,408,431,449,453,465,492,500,504,537,541,558,563,605,641,660,667,672],{"__ignoreMap":270},[274,386,387,391,395,398,402,405],{"class":276,"line":277},[274,388,390],{"class":389},"s7zQu","import",[274,392,394],{"class":393},"sTEyZ"," Fastify ",[274,396,397],{"class":389},"from",[274,399,401],{"class":400},"sMK4o"," '",[274,403,404],{"class":365},"fastify",[274,406,407],{"class":400},"'\n",[274,409,410,412,415,418,421,424,426,429],{"class":276,"line":283},[274,411,390],{"class":389},[274,413,414],{"class":400}," {",[274,416,417],{"class":393}," initLogger",[274,419,420],{"class":400}," }",[274,422,423],{"class":389}," from",[274,425,401],{"class":400},[274,427,428],{"class":365},"evlog",[274,430,407],{"class":400},[274,432,433,435,437,439,441,443,445,447],{"class":276,"line":290},[274,434,390],{"class":389},[274,436,414],{"class":400},[274,438,369],{"class":393},[274,440,420],{"class":400},[274,442,423],{"class":389},[274,444,401],{"class":400},[274,446,250],{"class":365},[274,448,407],{"class":400},[274,450,451],{"class":276,"line":296},[274,452,287],{"emptyLinePlaceholder":286},[274,454,455,459,462],{"class":276,"line":302},[274,456,458],{"class":457},"s2Zo4","initLogger",[274,460,461],{"class":393},"(",[274,463,464],{"class":400},"{\n",[274,466,467,471,474,476,479,481,483,486,489],{"class":276,"line":308},[274,468,470],{"class":469},"swJcz","  env",[274,472,473],{"class":400},":",[274,475,414],{"class":400},[274,477,478],{"class":469}," service",[274,480,473],{"class":400},[274,482,401],{"class":400},[274,484,485],{"class":365},"my-api",[274,487,488],{"class":400},"'",[274,490,491],{"class":400}," },\n",[274,493,494,497],{"class":276,"line":314},[274,495,496],{"class":400},"}",[274,498,499],{"class":393},")\n",[274,501,502],{"class":276,"line":320},[274,503,287],{"emptyLinePlaceholder":286},[274,505,506,510,513,516,519,521,524,527,529,533,535],{"class":276,"line":326},[274,507,509],{"class":508},"spNyl","const",[274,511,512],{"class":393}," app ",[274,514,515],{"class":400},"=",[274,517,518],{"class":457}," Fastify",[274,520,461],{"class":393},[274,522,523],{"class":400},"{",[274,525,526],{"class":469}," logger",[274,528,473],{"class":400},[274,530,532],{"class":531},"sfNiH"," false",[274,534,420],{"class":400},[274,536,499],{"class":393},[274,538,539],{"class":276,"line":331},[274,540,287],{"emptyLinePlaceholder":286},[274,542,543,546,549,552,555],{"class":276,"line":337},[274,544,545],{"class":389},"await",[274,547,548],{"class":393}," app",[274,550,551],{"class":400},".",[274,553,554],{"class":457},"register",[274,556,557],{"class":393},"(evlog)\n",[274,559,561],{"class":276,"line":560},12,[274,562,287],{"emptyLinePlaceholder":286},[274,564,566,569,571,574,576,578,581,583,586,589,592,596,599,602],{"class":276,"line":565},13,[274,567,568],{"class":393},"app",[274,570,551],{"class":400},[274,572,573],{"class":457},"get",[274,575,461],{"class":393},[274,577,488],{"class":400},[274,579,580],{"class":365},"\u002Fhealth",[274,582,488],{"class":400},[274,584,585],{"class":400},",",[274,587,588],{"class":508}," async",[274,590,591],{"class":400}," (",[274,593,595],{"class":594},"sHdIc","request",[274,597,598],{"class":400},")",[274,600,601],{"class":508}," =>",[274,603,604],{"class":400}," {\n",[274,606,608,611,613,616,618,621,623,625,628,630,632,635,637,639],{"class":276,"line":607},14,[274,609,610],{"class":393},"  request",[274,612,551],{"class":400},[274,614,615],{"class":393},"log",[274,617,551],{"class":400},[274,619,620],{"class":457},"set",[274,622,461],{"class":469},[274,624,523],{"class":400},[274,626,627],{"class":469}," route",[274,629,473],{"class":400},[274,631,401],{"class":400},[274,633,634],{"class":365},"health",[274,636,488],{"class":400},[274,638,420],{"class":400},[274,640,499],{"class":469},[274,642,644,647,649,652,654,657],{"class":276,"line":643},15,[274,645,646],{"class":389},"  return",[274,648,414],{"class":400},[274,650,651],{"class":469}," ok",[274,653,473],{"class":400},[274,655,656],{"class":531}," true",[274,658,659],{"class":400}," }\n",[274,661,663,665],{"class":276,"line":662},16,[274,664,496],{"class":400},[274,666,499],{"class":393},[274,668,670],{"class":276,"line":669},17,[274,671,287],{"emptyLinePlaceholder":286},[274,673,675,677,679,681,684,686,688,691,693,697,699],{"class":276,"line":674},18,[274,676,545],{"class":389},[274,678,548],{"class":393},[274,680,551],{"class":400},[274,682,683],{"class":457},"listen",[274,685,461],{"class":393},[274,687,523],{"class":400},[274,689,690],{"class":469}," port",[274,692,473],{"class":400},[274,694,696],{"class":695},"sbssI"," 3000",[274,698,420],{"class":400},[274,700,499],{"class":393},[244,702,703,705,706,709],{},[248,704,254],{}," is the evlog wide-event logger and shadows Fastify's built-in pino logger on the request. The pino logger remains accessible via ",[248,707,708],{},"fastify.log"," for server-level structured logging.",[342,711,121],{"id":712},"wide-events",[244,714,715],{},"Build up context progressively through your handler. One request = one wide event:",[264,717,719],{"className":379,"code":718,"filename":381,"language":382,"meta":270,"style":270},"app.get('\u002Fusers\u002F:id', async (request) => {\n  const { id } = request.params as { id: string }\n\n  request.log.set({ user: { id } })\n\n  const user = await db.findUser(id)\n  request.log.set({ user: { name: user.name, plan: user.plan } })\n\n  const orders = await db.findOrders(id)\n  request.log.set({ orders: { count: orders.length, totalRevenue: sum(orders) } })\n\n  return { user, orders }\n})\n",[248,720,721,752,789,793,824,828,854,908,912,936,994,998,1012],{"__ignoreMap":270},[274,722,723,725,727,729,731,733,736,738,740,742,744,746,748,750],{"class":276,"line":277},[274,724,568],{"class":393},[274,726,551],{"class":400},[274,728,573],{"class":457},[274,730,461],{"class":393},[274,732,488],{"class":400},[274,734,735],{"class":365},"\u002Fusers\u002F:id",[274,737,488],{"class":400},[274,739,585],{"class":400},[274,741,588],{"class":508},[274,743,591],{"class":400},[274,745,595],{"class":594},[274,747,598],{"class":400},[274,749,601],{"class":508},[274,751,604],{"class":400},[274,753,754,757,759,762,764,767,770,772,775,778,780,782,784,787],{"class":276,"line":283},[274,755,756],{"class":508},"  const",[274,758,414],{"class":400},[274,760,761],{"class":393}," id",[274,763,420],{"class":400},[274,765,766],{"class":400}," =",[274,768,769],{"class":393}," request",[274,771,551],{"class":400},[274,773,774],{"class":393},"params",[274,776,777],{"class":389}," as",[274,779,414],{"class":400},[274,781,761],{"class":469},[274,783,473],{"class":400},[274,785,786],{"class":361}," string",[274,788,659],{"class":400},[274,790,791],{"class":276,"line":290},[274,792,287],{"emptyLinePlaceholder":286},[274,794,795,797,799,801,803,805,807,809,812,814,816,818,820,822],{"class":276,"line":296},[274,796,610],{"class":393},[274,798,551],{"class":400},[274,800,615],{"class":393},[274,802,551],{"class":400},[274,804,620],{"class":457},[274,806,461],{"class":469},[274,808,523],{"class":400},[274,810,811],{"class":469}," user",[274,813,473],{"class":400},[274,815,414],{"class":400},[274,817,761],{"class":393},[274,819,420],{"class":400},[274,821,420],{"class":400},[274,823,499],{"class":469},[274,825,826],{"class":276,"line":302},[274,827,287],{"emptyLinePlaceholder":286},[274,829,830,832,834,836,839,842,844,847,849,852],{"class":276,"line":308},[274,831,756],{"class":508},[274,833,811],{"class":393},[274,835,766],{"class":400},[274,837,838],{"class":389}," await",[274,840,841],{"class":393}," db",[274,843,551],{"class":400},[274,845,846],{"class":457},"findUser",[274,848,461],{"class":469},[274,850,851],{"class":393},"id",[274,853,499],{"class":469},[274,855,856,858,860,862,864,866,868,870,872,874,876,879,881,883,885,888,890,893,895,897,899,902,904,906],{"class":276,"line":314},[274,857,610],{"class":393},[274,859,551],{"class":400},[274,861,615],{"class":393},[274,863,551],{"class":400},[274,865,620],{"class":457},[274,867,461],{"class":469},[274,869,523],{"class":400},[274,871,811],{"class":469},[274,873,473],{"class":400},[274,875,414],{"class":400},[274,877,878],{"class":469}," name",[274,880,473],{"class":400},[274,882,811],{"class":393},[274,884,551],{"class":400},[274,886,887],{"class":393},"name",[274,889,585],{"class":400},[274,891,892],{"class":469}," plan",[274,894,473],{"class":400},[274,896,811],{"class":393},[274,898,551],{"class":400},[274,900,901],{"class":393},"plan",[274,903,420],{"class":400},[274,905,420],{"class":400},[274,907,499],{"class":469},[274,909,910],{"class":276,"line":320},[274,911,287],{"emptyLinePlaceholder":286},[274,913,914,916,919,921,923,925,927,930,932,934],{"class":276,"line":326},[274,915,756],{"class":508},[274,917,918],{"class":393}," orders",[274,920,766],{"class":400},[274,922,838],{"class":389},[274,924,841],{"class":393},[274,926,551],{"class":400},[274,928,929],{"class":457},"findOrders",[274,931,461],{"class":469},[274,933,851],{"class":393},[274,935,499],{"class":469},[274,937,938,940,942,944,946,948,950,952,954,956,958,961,963,965,967,970,972,975,977,980,982,985,988,990,992],{"class":276,"line":331},[274,939,610],{"class":393},[274,941,551],{"class":400},[274,943,615],{"class":393},[274,945,551],{"class":400},[274,947,620],{"class":457},[274,949,461],{"class":469},[274,951,523],{"class":400},[274,953,918],{"class":469},[274,955,473],{"class":400},[274,957,414],{"class":400},[274,959,960],{"class":469}," count",[274,962,473],{"class":400},[274,964,918],{"class":393},[274,966,551],{"class":400},[274,968,969],{"class":393},"length",[274,971,585],{"class":400},[274,973,974],{"class":469}," totalRevenue",[274,976,473],{"class":400},[274,978,979],{"class":457}," sum",[274,981,461],{"class":469},[274,983,984],{"class":393},"orders",[274,986,987],{"class":469},") ",[274,989,496],{"class":400},[274,991,420],{"class":400},[274,993,499],{"class":469},[274,995,996],{"class":276,"line":337},[274,997,287],{"emptyLinePlaceholder":286},[274,999,1000,1002,1004,1006,1008,1010],{"class":276,"line":560},[274,1001,646],{"class":389},[274,1003,414],{"class":400},[274,1005,811],{"class":393},[274,1007,585],{"class":400},[274,1009,918],{"class":393},[274,1011,659],{"class":400},[274,1013,1014,1016],{"class":276,"line":565},[274,1015,496],{"class":400},[274,1017,499],{"class":393},[244,1019,1020],{},"All fields are merged into a single wide event emitted when the request completes:",[264,1022,1025],{"className":352,"code":1023,"filename":1024,"language":354,"meta":270,"style":270},"14:58:15 INFO [my-api] GET \u002Fusers\u002Fusr_123 200 in 12ms\n  ├─ orders: count=2 totalRevenue=6298\n  ├─ user: id=usr_123 name=Alice plan=pro\n  └─ requestId: 4a8ff3a8-...\n","Terminal output",[248,1026,1027,1038,1058,1074],{"__ignoreMap":270},[274,1028,1029,1032,1035],{"class":276,"line":277},[274,1030,1031],{"class":361},"14:58:15",[274,1033,1034],{"class":365}," INFO",[274,1036,1037],{"class":393}," [my-api] GET \u002Fusers\u002Fusr_123 200 in 12ms\n",[274,1039,1040,1043,1046,1049,1052,1055],{"class":276,"line":283},[274,1041,1042],{"class":361},"  ├─",[274,1044,1045],{"class":365}," orders:",[274,1047,1048],{"class":365}," count=",[274,1050,1051],{"class":695},"2",[274,1053,1054],{"class":365}," totalRevenue=",[274,1056,1057],{"class":695},"6298\n",[274,1059,1060,1062,1065,1068,1071],{"class":276,"line":290},[274,1061,1042],{"class":361},[274,1063,1064],{"class":365}," user:",[274,1066,1067],{"class":365}," id=usr_123",[274,1069,1070],{"class":365}," name=Alice",[274,1072,1073],{"class":365}," plan=pro\n",[274,1075,1076,1079,1082],{"class":276,"line":296},[274,1077,1078],{"class":361},"  └─",[274,1080,1081],{"class":365}," requestId:",[274,1083,1084],{"class":365}," 4a8ff3a8-...\n",[342,1086,258],{"id":1087},"uselogger",[244,1089,1090,1091,1093],{},"Use ",[248,1092,258],{}," to access the request-scoped logger from anywhere in the call stack without passing the request object through your service layer:",[264,1095,1098],{"className":379,"code":1096,"filename":1097,"language":382,"meta":270,"style":270},"import { useLogger } from 'evlog\u002Ffastify'\n\nexport async function findUser(id: string) {\n  const log = useLogger()\n  log.set({ user: { id } })\n\n  const user = await db.findUser(id)\n  log.set({ user: { name: user.name, plan: user.plan } })\n\n  return user\n}\n","src\u002Fservices\u002Fuser.ts",[248,1099,1100,1119,1123,1148,1162,1189,1193,1215,1261,1265,1272],{"__ignoreMap":270},[274,1101,1102,1104,1106,1109,1111,1113,1115,1117],{"class":276,"line":277},[274,1103,390],{"class":389},[274,1105,414],{"class":400},[274,1107,1108],{"class":393}," useLogger",[274,1110,420],{"class":400},[274,1112,423],{"class":389},[274,1114,401],{"class":400},[274,1116,250],{"class":365},[274,1118,407],{"class":400},[274,1120,1121],{"class":276,"line":283},[274,1122,287],{"emptyLinePlaceholder":286},[274,1124,1125,1128,1130,1133,1136,1138,1140,1142,1144,1146],{"class":276,"line":290},[274,1126,1127],{"class":389},"export",[274,1129,588],{"class":508},[274,1131,1132],{"class":508}," function",[274,1134,1135],{"class":457}," findUser",[274,1137,461],{"class":400},[274,1139,851],{"class":594},[274,1141,473],{"class":400},[274,1143,786],{"class":361},[274,1145,598],{"class":400},[274,1147,604],{"class":400},[274,1149,1150,1152,1155,1157,1159],{"class":276,"line":296},[274,1151,756],{"class":508},[274,1153,1154],{"class":393}," log",[274,1156,766],{"class":400},[274,1158,1108],{"class":457},[274,1160,1161],{"class":469},"()\n",[274,1163,1164,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187],{"class":276,"line":302},[274,1165,1166],{"class":393},"  log",[274,1168,551],{"class":400},[274,1170,620],{"class":457},[274,1172,461],{"class":469},[274,1174,523],{"class":400},[274,1176,811],{"class":469},[274,1178,473],{"class":400},[274,1180,414],{"class":400},[274,1182,761],{"class":393},[274,1184,420],{"class":400},[274,1186,420],{"class":400},[274,1188,499],{"class":469},[274,1190,1191],{"class":276,"line":308},[274,1192,287],{"emptyLinePlaceholder":286},[274,1194,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213],{"class":276,"line":314},[274,1196,756],{"class":508},[274,1198,811],{"class":393},[274,1200,766],{"class":400},[274,1202,838],{"class":389},[274,1204,841],{"class":393},[274,1206,551],{"class":400},[274,1208,846],{"class":457},[274,1210,461],{"class":469},[274,1212,851],{"class":393},[274,1214,499],{"class":469},[274,1216,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259],{"class":276,"line":320},[274,1218,1166],{"class":393},[274,1220,551],{"class":400},[274,1222,620],{"class":457},[274,1224,461],{"class":469},[274,1226,523],{"class":400},[274,1228,811],{"class":469},[274,1230,473],{"class":400},[274,1232,414],{"class":400},[274,1234,878],{"class":469},[274,1236,473],{"class":400},[274,1238,811],{"class":393},[274,1240,551],{"class":400},[274,1242,887],{"class":393},[274,1244,585],{"class":400},[274,1246,892],{"class":469},[274,1248,473],{"class":400},[274,1250,811],{"class":393},[274,1252,551],{"class":400},[274,1254,901],{"class":393},[274,1256,420],{"class":400},[274,1258,420],{"class":400},[274,1260,499],{"class":469},[274,1262,1263],{"class":276,"line":326},[274,1264,287],{"emptyLinePlaceholder":286},[274,1266,1267,1269],{"class":276,"line":331},[274,1268,646],{"class":389},[274,1270,1271],{"class":393}," user\n",[274,1273,1274],{"class":276,"line":337},[274,1275,1276],{"class":400},"}\n",[264,1278,1280],{"className":379,"code":1279,"filename":381,"language":382,"meta":270,"style":270},"import { findUser } from '.\u002Fservices\u002Fuser'\n\napp.get('\u002Fusers\u002F:id', async (request) => {\n  const { id } = request.params as { id: string }\n  const user = await findUser(id)\n  return user\n})\n",[248,1281,1282,1301,1305,1335,1365,1383,1389],{"__ignoreMap":270},[274,1283,1284,1286,1288,1290,1292,1294,1296,1299],{"class":276,"line":277},[274,1285,390],{"class":389},[274,1287,414],{"class":400},[274,1289,1135],{"class":393},[274,1291,420],{"class":400},[274,1293,423],{"class":389},[274,1295,401],{"class":400},[274,1297,1298],{"class":365},".\u002Fservices\u002Fuser",[274,1300,407],{"class":400},[274,1302,1303],{"class":276,"line":283},[274,1304,287],{"emptyLinePlaceholder":286},[274,1306,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333],{"class":276,"line":290},[274,1308,568],{"class":393},[274,1310,551],{"class":400},[274,1312,573],{"class":457},[274,1314,461],{"class":393},[274,1316,488],{"class":400},[274,1318,735],{"class":365},[274,1320,488],{"class":400},[274,1322,585],{"class":400},[274,1324,588],{"class":508},[274,1326,591],{"class":400},[274,1328,595],{"class":594},[274,1330,598],{"class":400},[274,1332,601],{"class":508},[274,1334,604],{"class":400},[274,1336,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361,1363],{"class":276,"line":296},[274,1338,756],{"class":508},[274,1340,414],{"class":400},[274,1342,761],{"class":393},[274,1344,420],{"class":400},[274,1346,766],{"class":400},[274,1348,769],{"class":393},[274,1350,551],{"class":400},[274,1352,774],{"class":393},[274,1354,777],{"class":389},[274,1356,414],{"class":400},[274,1358,761],{"class":469},[274,1360,473],{"class":400},[274,1362,786],{"class":361},[274,1364,659],{"class":400},[274,1366,1367,1369,1371,1373,1375,1377,1379,1381],{"class":276,"line":302},[274,1368,756],{"class":508},[274,1370,811],{"class":393},[274,1372,766],{"class":400},[274,1374,838],{"class":389},[274,1376,1135],{"class":457},[274,1378,461],{"class":469},[274,1380,851],{"class":393},[274,1382,499],{"class":469},[274,1384,1385,1387],{"class":276,"line":308},[274,1386,646],{"class":389},[274,1388,1271],{"class":393},[274,1390,1391,1393],{"class":276,"line":314},[274,1392,496],{"class":400},[274,1394,499],{"class":393},[244,1396,1397,1398,255,1400,1402,1403,1405,1406,1409],{},"Both ",[248,1399,254],{},[248,1401,258],{}," return the same logger instance. ",[248,1404,258],{}," uses ",[248,1407,1408],{},"AsyncLocalStorage"," to propagate the logger across async boundaries.",[342,1411,1413],{"id":1412},"error-handling","Error Handling",[244,1415,1090,1416,1419,1420,1423,1424,1427,1428,1431,1432,473],{},[248,1417,1418],{},"createError"," for structured errors with ",[248,1421,1422],{},"why",", ",[248,1425,1426],{},"fix",", and ",[248,1429,1430],{},"link"," fields. Fastify captures thrown errors via ",[248,1433,1434],{},"onError",[264,1436,1438],{"className":379,"code":1437,"filename":381,"language":382,"meta":270,"style":270},"import { createError, parseError } from 'evlog'\n\napp.get('\u002Fcheckout', async (_request, reply) => {\n  throw createError({\n    message: 'Payment failed',\n    status: 402,\n    why: 'Card declined by issuer',\n    fix: 'Try a different payment method',\n    link: 'https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined',\n  })\n})\n\napp.setErrorHandler((error, _request, reply) => {\n  const parsed = parseError(error)\n  reply.status(parsed.status).send({\n    message: parsed.message,\n    why: parsed.why,\n    fix: parsed.fix,\n    link: parsed.link,\n  })\n})\n",[248,1439,1440,1464,1468,1505,1516,1533,1545,1561,1577,1593,1600,1606,1610,1641,1658,1688,1703,1717,1731,1746,1753],{"__ignoreMap":270},[274,1441,1442,1444,1446,1449,1451,1454,1456,1458,1460,1462],{"class":276,"line":277},[274,1443,390],{"class":389},[274,1445,414],{"class":400},[274,1447,1448],{"class":393}," createError",[274,1450,585],{"class":400},[274,1452,1453],{"class":393}," parseError",[274,1455,420],{"class":400},[274,1457,423],{"class":389},[274,1459,401],{"class":400},[274,1461,428],{"class":365},[274,1463,407],{"class":400},[274,1465,1466],{"class":276,"line":283},[274,1467,287],{"emptyLinePlaceholder":286},[274,1469,1470,1472,1474,1476,1478,1480,1483,1485,1487,1489,1491,1494,1496,1499,1501,1503],{"class":276,"line":290},[274,1471,568],{"class":393},[274,1473,551],{"class":400},[274,1475,573],{"class":457},[274,1477,461],{"class":393},[274,1479,488],{"class":400},[274,1481,1482],{"class":365},"\u002Fcheckout",[274,1484,488],{"class":400},[274,1486,585],{"class":400},[274,1488,588],{"class":508},[274,1490,591],{"class":400},[274,1492,1493],{"class":594},"_request",[274,1495,585],{"class":400},[274,1497,1498],{"class":594}," reply",[274,1500,598],{"class":400},[274,1502,601],{"class":508},[274,1504,604],{"class":400},[274,1506,1507,1510,1512,1514],{"class":276,"line":296},[274,1508,1509],{"class":389},"  throw",[274,1511,1448],{"class":457},[274,1513,461],{"class":469},[274,1515,464],{"class":400},[274,1517,1518,1521,1523,1525,1528,1530],{"class":276,"line":302},[274,1519,1520],{"class":469},"    message",[274,1522,473],{"class":400},[274,1524,401],{"class":400},[274,1526,1527],{"class":365},"Payment failed",[274,1529,488],{"class":400},[274,1531,1532],{"class":400},",\n",[274,1534,1535,1538,1540,1543],{"class":276,"line":308},[274,1536,1537],{"class":469},"    status",[274,1539,473],{"class":400},[274,1541,1542],{"class":695}," 402",[274,1544,1532],{"class":400},[274,1546,1547,1550,1552,1554,1557,1559],{"class":276,"line":314},[274,1548,1549],{"class":469},"    why",[274,1551,473],{"class":400},[274,1553,401],{"class":400},[274,1555,1556],{"class":365},"Card declined by issuer",[274,1558,488],{"class":400},[274,1560,1532],{"class":400},[274,1562,1563,1566,1568,1570,1573,1575],{"class":276,"line":320},[274,1564,1565],{"class":469},"    fix",[274,1567,473],{"class":400},[274,1569,401],{"class":400},[274,1571,1572],{"class":365},"Try a different payment method",[274,1574,488],{"class":400},[274,1576,1532],{"class":400},[274,1578,1579,1582,1584,1586,1589,1591],{"class":276,"line":326},[274,1580,1581],{"class":469},"    link",[274,1583,473],{"class":400},[274,1585,401],{"class":400},[274,1587,1588],{"class":365},"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined",[274,1590,488],{"class":400},[274,1592,1532],{"class":400},[274,1594,1595,1598],{"class":276,"line":331},[274,1596,1597],{"class":400},"  }",[274,1599,499],{"class":469},[274,1601,1602,1604],{"class":276,"line":337},[274,1603,496],{"class":400},[274,1605,499],{"class":393},[274,1607,1608],{"class":276,"line":560},[274,1609,287],{"emptyLinePlaceholder":286},[274,1611,1612,1614,1616,1619,1621,1623,1626,1628,1631,1633,1635,1637,1639],{"class":276,"line":565},[274,1613,568],{"class":393},[274,1615,551],{"class":400},[274,1617,1618],{"class":457},"setErrorHandler",[274,1620,461],{"class":393},[274,1622,461],{"class":400},[274,1624,1625],{"class":594},"error",[274,1627,585],{"class":400},[274,1629,1630],{"class":594}," _request",[274,1632,585],{"class":400},[274,1634,1498],{"class":594},[274,1636,598],{"class":400},[274,1638,601],{"class":508},[274,1640,604],{"class":400},[274,1642,1643,1645,1648,1650,1652,1654,1656],{"class":276,"line":607},[274,1644,756],{"class":508},[274,1646,1647],{"class":393}," parsed",[274,1649,766],{"class":400},[274,1651,1453],{"class":457},[274,1653,461],{"class":469},[274,1655,1625],{"class":393},[274,1657,499],{"class":469},[274,1659,1660,1663,1665,1668,1670,1673,1675,1677,1679,1681,1684,1686],{"class":276,"line":643},[274,1661,1662],{"class":393},"  reply",[274,1664,551],{"class":400},[274,1666,1667],{"class":457},"status",[274,1669,461],{"class":469},[274,1671,1672],{"class":393},"parsed",[274,1674,551],{"class":400},[274,1676,1667],{"class":393},[274,1678,598],{"class":469},[274,1680,551],{"class":400},[274,1682,1683],{"class":457},"send",[274,1685,461],{"class":469},[274,1687,464],{"class":400},[274,1689,1690,1692,1694,1696,1698,1701],{"class":276,"line":662},[274,1691,1520],{"class":469},[274,1693,473],{"class":400},[274,1695,1647],{"class":393},[274,1697,551],{"class":400},[274,1699,1700],{"class":393},"message",[274,1702,1532],{"class":400},[274,1704,1705,1707,1709,1711,1713,1715],{"class":276,"line":669},[274,1706,1549],{"class":469},[274,1708,473],{"class":400},[274,1710,1647],{"class":393},[274,1712,551],{"class":400},[274,1714,1422],{"class":393},[274,1716,1532],{"class":400},[274,1718,1719,1721,1723,1725,1727,1729],{"class":276,"line":674},[274,1720,1565],{"class":469},[274,1722,473],{"class":400},[274,1724,1647],{"class":393},[274,1726,551],{"class":400},[274,1728,1426],{"class":393},[274,1730,1532],{"class":400},[274,1732,1734,1736,1738,1740,1742,1744],{"class":276,"line":1733},19,[274,1735,1581],{"class":469},[274,1737,473],{"class":400},[274,1739,1647],{"class":393},[274,1741,551],{"class":400},[274,1743,1430],{"class":393},[274,1745,1532],{"class":400},[274,1747,1749,1751],{"class":276,"line":1748},20,[274,1750,1597],{"class":400},[274,1752,499],{"class":469},[274,1754,1756,1758],{"class":276,"line":1755},21,[274,1757,496],{"class":400},[274,1759,499],{"class":393},[244,1761,1762],{},"The error is captured and logged with both the custom context and structured error fields:",[264,1764,1766],{"className":352,"code":1765,"filename":1024,"language":354,"meta":270,"style":270},"14:58:20 ERROR [my-api] GET \u002Fcheckout 402 in 3ms\n  ├─ error: name=EvlogError message=Payment failed status=402\n  └─ requestId: 880a50ac-...\n",[248,1767,1768,1779,1801],{"__ignoreMap":270},[274,1769,1770,1773,1776],{"class":276,"line":277},[274,1771,1772],{"class":361},"14:58:20",[274,1774,1775],{"class":365}," ERROR",[274,1777,1778],{"class":393}," [my-api] GET \u002Fcheckout 402 in 3ms\n",[274,1780,1781,1783,1786,1789,1792,1795,1798],{"class":276,"line":283},[274,1782,1042],{"class":361},[274,1784,1785],{"class":365}," error:",[274,1787,1788],{"class":365}," name=EvlogError",[274,1790,1791],{"class":365}," message=Payment",[274,1793,1794],{"class":365}," failed",[274,1796,1797],{"class":365}," status=",[274,1799,1800],{"class":695},"402\n",[274,1802,1803,1805,1807],{"class":276,"line":290},[274,1804,1078],{"class":361},[274,1806,1081],{"class":365},[274,1808,1809],{"class":365}," 880a50ac-...\n",[342,1811,150],{"id":1812},"configuration",[244,1814,1815,1816,1820,1821,1823],{},"See the ",[1817,1818,1819],"a",{"href":151},"Configuration reference"," for all available options (",[248,1822,458],{},", middleware options, sampling, silent mode, etc.).",[342,1825,1827],{"id":1826},"drain-enrichers","Drain & Enrichers",[244,1829,1830],{},"Configure drain adapters and enrichers directly in the plugin options:",[264,1832,1834],{"className":379,"code":1833,"filename":381,"language":382,"meta":270,"style":270},"import { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createUserAgentEnricher } from 'evlog\u002Fenrichers'\n\nconst userAgent = createUserAgentEnricher()\n\nawait app.register(evlog, {\n  drain: createAxiomDrain(),\n  enrich: (ctx) => {\n    userAgent(ctx)\n    ctx.event.region = process.env.FLY_REGION\n  },\n})\n",[248,1835,1836,1856,1876,1880,1893,1897,1914,1928,1946,1957,1987,1992],{"__ignoreMap":270},[274,1837,1838,1840,1842,1845,1847,1849,1851,1854],{"class":276,"line":277},[274,1839,390],{"class":389},[274,1841,414],{"class":400},[274,1843,1844],{"class":393}," createAxiomDrain",[274,1846,420],{"class":400},[274,1848,423],{"class":389},[274,1850,401],{"class":400},[274,1852,1853],{"class":365},"evlog\u002Faxiom",[274,1855,407],{"class":400},[274,1857,1858,1860,1862,1865,1867,1869,1871,1874],{"class":276,"line":283},[274,1859,390],{"class":389},[274,1861,414],{"class":400},[274,1863,1864],{"class":393}," createUserAgentEnricher",[274,1866,420],{"class":400},[274,1868,423],{"class":389},[274,1870,401],{"class":400},[274,1872,1873],{"class":365},"evlog\u002Fenrichers",[274,1875,407],{"class":400},[274,1877,1878],{"class":276,"line":290},[274,1879,287],{"emptyLinePlaceholder":286},[274,1881,1882,1884,1887,1889,1891],{"class":276,"line":296},[274,1883,509],{"class":508},[274,1885,1886],{"class":393}," userAgent ",[274,1888,515],{"class":400},[274,1890,1864],{"class":457},[274,1892,1161],{"class":393},[274,1894,1895],{"class":276,"line":302},[274,1896,287],{"emptyLinePlaceholder":286},[274,1898,1899,1901,1903,1905,1907,1910,1912],{"class":276,"line":308},[274,1900,545],{"class":389},[274,1902,548],{"class":393},[274,1904,551],{"class":400},[274,1906,554],{"class":457},[274,1908,1909],{"class":393},"(evlog",[274,1911,585],{"class":400},[274,1913,604],{"class":400},[274,1915,1916,1919,1921,1923,1926],{"class":276,"line":314},[274,1917,1918],{"class":469},"  drain",[274,1920,473],{"class":400},[274,1922,1844],{"class":457},[274,1924,1925],{"class":393},"()",[274,1927,1532],{"class":400},[274,1929,1930,1933,1935,1937,1940,1942,1944],{"class":276,"line":320},[274,1931,1932],{"class":457},"  enrich",[274,1934,473],{"class":400},[274,1936,591],{"class":400},[274,1938,1939],{"class":594},"ctx",[274,1941,598],{"class":400},[274,1943,601],{"class":508},[274,1945,604],{"class":400},[274,1947,1948,1951,1953,1955],{"class":276,"line":326},[274,1949,1950],{"class":457},"    userAgent",[274,1952,461],{"class":469},[274,1954,1939],{"class":393},[274,1956,499],{"class":469},[274,1958,1959,1962,1964,1967,1969,1972,1974,1977,1979,1982,1984],{"class":276,"line":331},[274,1960,1961],{"class":393},"    ctx",[274,1963,551],{"class":400},[274,1965,1966],{"class":393},"event",[274,1968,551],{"class":400},[274,1970,1971],{"class":393},"region",[274,1973,766],{"class":400},[274,1975,1976],{"class":393}," process",[274,1978,551],{"class":400},[274,1980,1981],{"class":393},"env",[274,1983,551],{"class":400},[274,1985,1986],{"class":393},"FLY_REGION\n",[274,1988,1989],{"class":276,"line":337},[274,1990,1991],{"class":400},"  },\n",[274,1993,1994,1996],{"class":276,"line":560},[274,1995,496],{"class":400},[274,1997,499],{"class":393},[346,1999,2001],{"id":2000},"pipeline-batching-retry","Pipeline (Batching & Retry)",[244,2003,2004,2005,2008],{},"For production, wrap your adapter with ",[248,2006,2007],{},"createDrainPipeline"," to batch events and retry on failure:",[264,2010,2012],{"className":379,"code":2011,"filename":381,"language":382,"meta":270,"style":270},"import type { DrainContext } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 50, intervalMs: 5000 },\n  retry: { maxAttempts: 3 },\n})\nconst drain = pipeline(createAxiomDrain())\n\nawait app.register(evlog, { drain })\n",[248,2013,2014,2036,2054,2074,2078,2102,2131,2150,2156,2176,2180],{"__ignoreMap":270},[274,2015,2016,2018,2021,2023,2026,2028,2030,2032,2034],{"class":276,"line":277},[274,2017,390],{"class":389},[274,2019,2020],{"class":389}," type",[274,2022,414],{"class":400},[274,2024,2025],{"class":393}," DrainContext",[274,2027,420],{"class":400},[274,2029,423],{"class":389},[274,2031,401],{"class":400},[274,2033,428],{"class":365},[274,2035,407],{"class":400},[274,2037,2038,2040,2042,2044,2046,2048,2050,2052],{"class":276,"line":283},[274,2039,390],{"class":389},[274,2041,414],{"class":400},[274,2043,1844],{"class":393},[274,2045,420],{"class":400},[274,2047,423],{"class":389},[274,2049,401],{"class":400},[274,2051,1853],{"class":365},[274,2053,407],{"class":400},[274,2055,2056,2058,2060,2063,2065,2067,2069,2072],{"class":276,"line":290},[274,2057,390],{"class":389},[274,2059,414],{"class":400},[274,2061,2062],{"class":393}," createDrainPipeline",[274,2064,420],{"class":400},[274,2066,423],{"class":389},[274,2068,401],{"class":400},[274,2070,2071],{"class":365},"evlog\u002Fpipeline",[274,2073,407],{"class":400},[274,2075,2076],{"class":276,"line":296},[274,2077,287],{"emptyLinePlaceholder":286},[274,2079,2080,2082,2085,2087,2089,2092,2095,2098,2100],{"class":276,"line":302},[274,2081,509],{"class":508},[274,2083,2084],{"class":393}," pipeline ",[274,2086,515],{"class":400},[274,2088,2062],{"class":457},[274,2090,2091],{"class":400},"\u003C",[274,2093,2094],{"class":361},"DrainContext",[274,2096,2097],{"class":400},">",[274,2099,461],{"class":393},[274,2101,464],{"class":400},[274,2103,2104,2107,2109,2111,2114,2116,2119,2121,2124,2126,2129],{"class":276,"line":308},[274,2105,2106],{"class":469},"  batch",[274,2108,473],{"class":400},[274,2110,414],{"class":400},[274,2112,2113],{"class":469}," size",[274,2115,473],{"class":400},[274,2117,2118],{"class":695}," 50",[274,2120,585],{"class":400},[274,2122,2123],{"class":469}," intervalMs",[274,2125,473],{"class":400},[274,2127,2128],{"class":695}," 5000",[274,2130,491],{"class":400},[274,2132,2133,2136,2138,2140,2143,2145,2148],{"class":276,"line":314},[274,2134,2135],{"class":469},"  retry",[274,2137,473],{"class":400},[274,2139,414],{"class":400},[274,2141,2142],{"class":469}," maxAttempts",[274,2144,473],{"class":400},[274,2146,2147],{"class":695}," 3",[274,2149,491],{"class":400},[274,2151,2152,2154],{"class":276,"line":320},[274,2153,496],{"class":400},[274,2155,499],{"class":393},[274,2157,2158,2160,2163,2165,2168,2170,2173],{"class":276,"line":326},[274,2159,509],{"class":508},[274,2161,2162],{"class":393}," drain ",[274,2164,515],{"class":400},[274,2166,2167],{"class":457}," pipeline",[274,2169,461],{"class":393},[274,2171,2172],{"class":457},"createAxiomDrain",[274,2174,2175],{"class":393},"())\n",[274,2177,2178],{"class":276,"line":331},[274,2179,287],{"emptyLinePlaceholder":286},[274,2181,2182,2184,2186,2188,2190,2192,2194,2196,2198,2200],{"class":276,"line":337},[274,2183,545],{"class":389},[274,2185,548],{"class":393},[274,2187,551],{"class":400},[274,2189,554],{"class":457},[274,2191,1909],{"class":393},[274,2193,585],{"class":400},[274,2195,414],{"class":400},[274,2197,2162],{"class":393},[274,2199,496],{"class":400},[274,2201,499],{"class":393},[2203,2204,2206,2207,2210,2211,2214],"callout",{"color":2205,"icon":13},"info","Call ",[248,2208,2209],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[1817,2212,2213],{"href":205},"Pipeline docs"," for all options.",[342,2216,2218],{"id":2217},"tail-sampling","Tail Sampling",[244,2220,1090,2221,2224],{},[248,2222,2223],{},"keep"," to force-retain specific events regardless of head sampling:",[264,2226,2228],{"className":379,"code":2227,"filename":381,"language":382,"meta":270,"style":270},"await app.register(evlog, {\n  drain: createAxiomDrain(),\n  keep: (ctx) => {\n    if (ctx.duration && ctx.duration > 2000) ctx.shouldKeep = true\n  },\n})\n",[248,2229,2230,2246,2258,2275,2319,2323],{"__ignoreMap":270},[274,2231,2232,2234,2236,2238,2240,2242,2244],{"class":276,"line":277},[274,2233,545],{"class":389},[274,2235,548],{"class":393},[274,2237,551],{"class":400},[274,2239,554],{"class":457},[274,2241,1909],{"class":393},[274,2243,585],{"class":400},[274,2245,604],{"class":400},[274,2247,2248,2250,2252,2254,2256],{"class":276,"line":283},[274,2249,1918],{"class":469},[274,2251,473],{"class":400},[274,2253,1844],{"class":457},[274,2255,1925],{"class":393},[274,2257,1532],{"class":400},[274,2259,2260,2263,2265,2267,2269,2271,2273],{"class":276,"line":290},[274,2261,2262],{"class":457},"  keep",[274,2264,473],{"class":400},[274,2266,591],{"class":400},[274,2268,1939],{"class":594},[274,2270,598],{"class":400},[274,2272,601],{"class":508},[274,2274,604],{"class":400},[274,2276,2277,2280,2282,2284,2286,2289,2292,2295,2297,2299,2302,2305,2307,2309,2311,2314,2316],{"class":276,"line":296},[274,2278,2279],{"class":389},"    if",[274,2281,591],{"class":469},[274,2283,1939],{"class":393},[274,2285,551],{"class":400},[274,2287,2288],{"class":393},"duration",[274,2290,2291],{"class":400}," &&",[274,2293,2294],{"class":393}," ctx",[274,2296,551],{"class":400},[274,2298,2288],{"class":393},[274,2300,2301],{"class":400}," >",[274,2303,2304],{"class":695}," 2000",[274,2306,987],{"class":469},[274,2308,1939],{"class":393},[274,2310,551],{"class":400},[274,2312,2313],{"class":393},"shouldKeep",[274,2315,766],{"class":400},[274,2317,2318],{"class":531}," true\n",[274,2320,2321],{"class":276,"line":302},[274,2322,1991],{"class":400},[274,2324,2325,2327],{"class":276,"line":308},[274,2326,496],{"class":400},[274,2328,499],{"class":393},[342,2330,2332],{"id":2331},"route-filtering","Route Filtering",[244,2334,2335,2336,255,2339,2342],{},"Control which routes are logged with ",[248,2337,2338],{},"include",[248,2340,2341],{},"exclude"," patterns:",[264,2344,2346],{"className":379,"code":2345,"filename":381,"language":382,"meta":270,"style":270},"await app.register(evlog, {\n  include: ['\u002Fapi\u002F**'],\n  exclude: ['\u002F_internal\u002F**', '\u002Fhealth'],\n  routes: {\n    '\u002Fapi\u002Fauth\u002F**': { service: 'auth-service' },\n    '\u002Fapi\u002Fpayment\u002F**': { service: 'payment-service' },\n  },\n})\n",[248,2347,2348,2364,2386,2414,2423,2450,2476,2480],{"__ignoreMap":270},[274,2349,2350,2352,2354,2356,2358,2360,2362],{"class":276,"line":277},[274,2351,545],{"class":389},[274,2353,548],{"class":393},[274,2355,551],{"class":400},[274,2357,554],{"class":457},[274,2359,1909],{"class":393},[274,2361,585],{"class":400},[274,2363,604],{"class":400},[274,2365,2366,2369,2371,2374,2376,2379,2381,2384],{"class":276,"line":283},[274,2367,2368],{"class":469},"  include",[274,2370,473],{"class":400},[274,2372,2373],{"class":393}," [",[274,2375,488],{"class":400},[274,2377,2378],{"class":365},"\u002Fapi\u002F**",[274,2380,488],{"class":400},[274,2382,2383],{"class":393},"]",[274,2385,1532],{"class":400},[274,2387,2388,2391,2393,2395,2397,2400,2402,2404,2406,2408,2410,2412],{"class":276,"line":290},[274,2389,2390],{"class":469},"  exclude",[274,2392,473],{"class":400},[274,2394,2373],{"class":393},[274,2396,488],{"class":400},[274,2398,2399],{"class":365},"\u002F_internal\u002F**",[274,2401,488],{"class":400},[274,2403,585],{"class":400},[274,2405,401],{"class":400},[274,2407,580],{"class":365},[274,2409,488],{"class":400},[274,2411,2383],{"class":393},[274,2413,1532],{"class":400},[274,2415,2416,2419,2421],{"class":276,"line":296},[274,2417,2418],{"class":469},"  routes",[274,2420,473],{"class":400},[274,2422,604],{"class":400},[274,2424,2425,2428,2431,2433,2435,2437,2439,2441,2443,2446,2448],{"class":276,"line":302},[274,2426,2427],{"class":400},"    '",[274,2429,2430],{"class":469},"\u002Fapi\u002Fauth\u002F**",[274,2432,488],{"class":400},[274,2434,473],{"class":400},[274,2436,414],{"class":400},[274,2438,478],{"class":469},[274,2440,473],{"class":400},[274,2442,401],{"class":400},[274,2444,2445],{"class":365},"auth-service",[274,2447,488],{"class":400},[274,2449,491],{"class":400},[274,2451,2452,2454,2457,2459,2461,2463,2465,2467,2469,2472,2474],{"class":276,"line":308},[274,2453,2427],{"class":400},[274,2455,2456],{"class":469},"\u002Fapi\u002Fpayment\u002F**",[274,2458,488],{"class":400},[274,2460,473],{"class":400},[274,2462,414],{"class":400},[274,2464,478],{"class":469},[274,2466,473],{"class":400},[274,2468,401],{"class":400},[274,2470,2471],{"class":365},"payment-service",[274,2473,488],{"class":400},[274,2475,491],{"class":400},[274,2477,2478],{"class":276,"line":314},[274,2479,1991],{"class":400},[274,2481,2482,2484],{"class":276,"line":320},[274,2483,496],{"class":400},[274,2485,499],{"class":393},[342,2487,2489],{"id":2488},"run-locally","Run Locally",[264,2491,2493],{"className":352,"code":2492,"language":354,"meta":270,"style":270},"git clone https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog.git\ncd evlog\nbun install\nbun run example:fastify\n",[248,2494,2495,2506,2514,2521],{"__ignoreMap":270},[274,2496,2497,2500,2503],{"class":276,"line":277},[274,2498,2499],{"class":361},"git",[274,2501,2502],{"class":365}," clone",[274,2504,2505],{"class":365}," https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog.git\n",[274,2507,2508,2511],{"class":276,"line":283},[274,2509,2510],{"class":457},"cd",[274,2512,2513],{"class":365}," evlog\n",[274,2515,2516,2518],{"class":276,"line":290},[274,2517,362],{"class":361},[274,2519,2520],{"class":365}," install\n",[274,2522,2523,2525,2528],{"class":276,"line":296},[274,2524,362],{"class":361},[274,2526,2527],{"class":365}," run",[274,2529,2530],{"class":365}," example:fastify\n",[244,2532,2533,2534,2539],{},"Open ",[1817,2535,2536],{"href":2536,"rel":2537},"http:\u002F\u002Flocalhost:3000",[2538],"nofollow"," to explore the interactive test UI.",[2541,2542,2543],"card-group",{},[2544,2545,2549],"card",{"icon":2546,"title":2547,"to":2548},"i-simple-icons-github","Source Code","https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Ffastify","Browse the complete Fastify example source on GitHub.",[2551,2552,2553],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":270,"searchDepth":283,"depth":283,"links":2555},[2556,2560,2561,2562,2563,2564,2567,2568,2569],{"id":344,"depth":283,"text":20,"children":2557},[2558,2559],{"id":348,"depth":290,"text":349},{"id":375,"depth":290,"text":376},{"id":712,"depth":283,"text":121},{"id":1087,"depth":283,"text":258},{"id":1412,"depth":283,"text":1413},{"id":1812,"depth":283,"text":150},{"id":1826,"depth":283,"text":1827,"children":2565},[2566],{"id":2000,"depth":290,"text":2001},{"id":2217,"depth":283,"text":2218},{"id":2331,"depth":283,"text":2332},{"id":2488,"depth":283,"text":2489},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Fastify applications.","md",[2573],{"label":2547,"icon":2546,"to":2548,"color":2574,"variant":2575},"neutral","subtle",{},{"title":81,"icon":84},{"title":81,"description":2570},"nxTGszhYbfH6yocRjuCP2yYTEoc_6tN2l5w2W3HAGhU",[2581,2583],{"title":76,"path":77,"stem":78,"description":2582,"icon":79,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Hono applications.",{"title":86,"path":87,"stem":88,"description":2584,"icon":89,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Elysia applications.",1773504119153]