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