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