[{"data":1,"prerenderedAt":3178},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-fastify":547,"-frameworks-fastify-surround":3173},[4,35,159,201,289,446,531],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"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",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,297,325,346,373,400,428],{"title":41,"path":295,"stem":296,"icon":54},"\u002Fbuild-on-top\u002Foverview","5.build-on-top\u002F0.overview",{"title":298,"path":299,"stem":300,"children":301,"page":34},"Observers","\u002Fbuild-on-top\u002Fobservers","5.build-on-top\u002Fobservers",[302,306,311,316,321],{"title":41,"path":303,"stem":304,"icon":305},"\u002Fbuild-on-top\u002Fobservers\u002Foverview","5.build-on-top\u002Fobservers\u002F1.overview","i-lucide-eye",{"title":307,"path":308,"stem":309,"icon":310},"Stream API","\u002Fbuild-on-top\u002Fobservers\u002Fin-process-stream","5.build-on-top\u002Fobservers\u002F2.in-process-stream","i-lucide-radio-tower",{"title":312,"path":313,"stem":314,"icon":315},"Stream server","\u002Fbuild-on-top\u002Fobservers\u002Fstream-server","5.build-on-top\u002Fobservers\u002F3.stream-server","i-lucide-radio",{"title":317,"path":318,"stem":319,"icon":320},"FS reader","\u002Fbuild-on-top\u002Fobservers\u002Ffs-reader","5.build-on-top\u002Fobservers\u002F4.fs-reader","i-lucide-folder-search",{"title":156,"path":322,"stem":323,"icon":324},"\u002Fbuild-on-top\u002Fobservers\u002Fconsumer-recipes","5.build-on-top\u002Fobservers\u002F5.consumer-recipes","i-lucide-chef-hat",{"title":326,"path":327,"stem":328,"children":329,"page":34},"Pipeline","\u002Fbuild-on-top\u002Fpipeline","5.build-on-top\u002Fpipeline",[330,334,338,342],{"title":41,"path":331,"stem":332,"icon":333},"\u002Fbuild-on-top\u002Fpipeline\u002Foverview","5.build-on-top\u002Fpipeline\u002F1.overview","i-lucide-workflow",{"title":335,"path":336,"stem":337,"icon":288},"Plugins","\u002Fbuild-on-top\u002Fpipeline\u002Fplugins","5.build-on-top\u002Fpipeline\u002F2.plugins",{"title":339,"path":340,"stem":341,"icon":28},"Custom enrichers","\u002Fbuild-on-top\u002Fpipeline\u002Fcustom-enrichers","5.build-on-top\u002Fpipeline\u002F3.custom-enrichers",{"title":343,"path":344,"stem":345,"icon":178},"Tail sampling","\u002Fbuild-on-top\u002Fpipeline\u002Ftail-sampling","5.build-on-top\u002Fpipeline\u002F4.tail-sampling",{"title":347,"path":348,"stem":349,"children":350,"page":34},"Scenarios","\u002Fbuild-on-top\u002Fscenarios","5.build-on-top\u002Fscenarios",[351,355,359,364,368],{"title":41,"path":352,"stem":353,"icon":354},"\u002Fbuild-on-top\u002Fscenarios\u002Foverview","5.build-on-top\u002Fscenarios\u002F0.overview","i-lucide-clipboard-list",{"title":356,"path":357,"stem":358,"icon":49},"Local debugging toolkit","\u002Fbuild-on-top\u002Fscenarios\u002Flocal-debugging-toolkit","5.build-on-top\u002Fscenarios\u002F1.local-debugging-toolkit",{"title":360,"path":361,"stem":362,"icon":363},"Tenant-aware logging","\u002Fbuild-on-top\u002Fscenarios\u002Ftenant-aware-logging","5.build-on-top\u002Fscenarios\u002F2.tenant-aware-logging","i-lucide-users",{"title":365,"path":366,"stem":367,"icon":129},"Compliance audit","\u002Fbuild-on-top\u002Fscenarios\u002Fcompliance-audit","5.build-on-top\u002Fscenarios\u002F3.compliance-audit",{"title":369,"path":370,"stem":371,"icon":372},"Cross-app error vocab","\u002Fbuild-on-top\u002Fscenarios\u002Fcross-app-error-vocab","5.build-on-top\u002Fscenarios\u002F4.cross-app-error-vocab","i-lucide-book",{"title":374,"path":375,"stem":376,"children":377,"page":34},"Shared packages","\u002Fbuild-on-top\u002Fshared","5.build-on-top\u002Fshared",[378,382,386,391,395],{"title":41,"path":379,"stem":380,"icon":381},"\u002Fbuild-on-top\u002Fshared\u002Foverview","5.build-on-top\u002Fshared\u002F1.overview","i-lucide-package",{"title":383,"path":384,"stem":385,"icon":381},"Catalogs as packages","\u002Fbuild-on-top\u002Fshared\u002Fcatalogs-as-packages","5.build-on-top\u002Fshared\u002F2.catalogs-as-packages",{"title":387,"path":388,"stem":389,"icon":390},"Drains as packages","\u002Fbuild-on-top\u002Fshared\u002Fdrains-as-packages","5.build-on-top\u002Fshared\u002F3.drains-as-packages","i-lucide-package-2",{"title":392,"path":393,"stem":394,"icon":28},"Enrichers as packages","\u002Fbuild-on-top\u002Fshared\u002Fenrichers-as-packages","5.build-on-top\u002Fshared\u002F4.enrichers-as-packages",{"title":396,"path":397,"stem":398,"icon":399},"Integration as package","\u002Fbuild-on-top\u002Fshared\u002Fintegration-as-package","5.build-on-top\u002Fshared\u002F5.integration-as-package","i-lucide-package-check",{"title":401,"path":402,"stem":403,"children":404,"page":34},"Sinks","\u002Fbuild-on-top\u002Fsinks","5.build-on-top\u002Fsinks",[405,409,414,418,423],{"title":41,"path":406,"stem":407,"icon":408},"\u002Fbuild-on-top\u002Fsinks\u002Foverview","5.build-on-top\u002Fsinks\u002F1.overview","i-lucide-arrow-up-from-line",{"title":410,"path":411,"stem":412,"icon":413},"Custom drains","\u002Fbuild-on-top\u002Fsinks\u002Fcustom-drains","5.build-on-top\u002Fsinks\u002F2.custom-drains","i-lucide-code-2",{"title":415,"path":416,"stem":417,"icon":333},"Drain pipeline","\u002Fbuild-on-top\u002Fsinks\u002Fdrain-pipeline","5.build-on-top\u002Fsinks\u002F3.drain-pipeline",{"title":419,"path":420,"stem":421,"icon":422},"Identity headers","\u002Fbuild-on-top\u002Fsinks\u002Fidentity-headers","5.build-on-top\u002Fsinks\u002F4.identity-headers","i-lucide-fingerprint",{"title":424,"path":425,"stem":426,"icon":427},"Fanout","\u002Fbuild-on-top\u002Fsinks\u002Ffanout-and-multi-drain","5.build-on-top\u002Fsinks\u002F5.fanout-and-multi-drain","i-lucide-share-2",{"title":429,"path":430,"stem":431,"children":432,"page":34},"Sources","\u002Fbuild-on-top\u002Fsources","5.build-on-top\u002Fsources",[433,437,441],{"title":41,"path":434,"stem":435,"icon":436},"\u002Fbuild-on-top\u002Fsources\u002Foverview","5.build-on-top\u002Fsources\u002F1.overview","i-lucide-arrow-down-to-line",{"title":438,"path":439,"stem":440,"icon":288},"Custom framework","\u002Fbuild-on-top\u002Fsources\u002Fcustom-framework","5.build-on-top\u002Fsources\u002F2.custom-framework",{"title":442,"path":443,"stem":444,"icon":445},"Middleware toolkit","\u002Fbuild-on-top\u002Fsources\u002Fmiddleware-toolkit","5.build-on-top\u002Fsources\u002F3.middleware-toolkit","i-lucide-wrench",{"title":447,"path":448,"stem":449,"children":450,"page":34},"Adapters","\u002Fadapters","6.adapters",[451,454,494,509],{"title":41,"path":452,"stem":453,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":455,"path":456,"stem":457,"children":458,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[459,464,469,474,479,484,489],{"title":460,"path":461,"stem":462,"icon":463},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":465,"path":466,"stem":467,"icon":468},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":470,"path":471,"stem":472,"icon":473},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":475,"path":476,"stem":477,"icon":478},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":480,"path":481,"stem":482,"icon":483},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":485,"path":486,"stem":487,"icon":488},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":490,"path":491,"stem":492,"icon":493},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":495,"path":496,"stem":497,"children":498,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[499,504],{"title":500,"path":501,"stem":502,"icon":503},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":505,"path":506,"stem":507,"icon":508},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":510,"path":511,"stem":512,"children":513,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[514,517,522,526],{"title":326,"path":515,"stem":516,"icon":333},"\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline",{"title":518,"path":519,"stem":520,"icon":521},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":523,"path":524,"stem":525,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":527,"path":528,"stem":529,"icon":530},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":532,"path":533,"stem":534,"children":535,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[536,539,543],{"title":41,"path":537,"stem":538,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":540,"path":541,"stem":542,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":544,"path":545,"stem":546,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":548,"title":251,"body":549,"description":3163,"extension":3164,"links":3165,"meta":3169,"navigation":3170,"path":252,"seo":3171,"stem":253,"__hash__":3172},"docs\u002F4.frameworks\u002F09.fastify.md",{"type":550,"value":551,"toc":3144},"minimark",[552,569,616,620,625,705,709,1045,1069,1078,1081,1084,1386,1389,1453,1456,1462,1645,1763,1778,1785,1799,1972,1976,1997,2320,2323,2370,2373,2383,2387,2390,2557,2561,2568,2761,2772,2776,2782,2886,2890,2900,3043,3047,3089,3097,3107,3111,3140],[553,554,555,556,560,561,564,565,568],"p",{},"The ",[557,558,559],"code",{},"evlog\u002Ffastify"," plugin auto-creates a request-scoped logger accessible via ",[557,562,563],{},"request.log"," and ",[557,566,567],{},"useLogger()",", emitting a wide event when the response completes.",[570,571,574,577,602],"prompt",{":actions":572,"description":573,"icon":254},"[\"copy\",\"cursor\",\"windsurf\"]","Set up evlog in my Fastify app",[553,575,576],{},"Set up evlog in my Fastify app.",[578,579,580,584,587,590,593,596,599],"ul",{},[581,582,583],"li",{},"Install evlog: pnpm add evlog",[581,585,586],{},"Call initLogger({ env: { service: 'my-api' } }) at startup",[581,588,589],{},"Alternatively, use evlog\u002Fvite plugin in vite.config.ts for auto-init (replaces initLogger)",[581,591,592],{},"Import evlog from 'evlog\u002Ffastify' and register with app.register(evlog)",[581,594,595],{},"Access the logger via request.log in route handlers or useLogger() anywhere",[581,597,598],{},"Use log.set() to accumulate context throughout the request",[581,600,601],{},"Optionally pass drain, enrich, include, and keep options when registering",[553,603,604,605,611,612],{},"Docs: ",[606,607,608],"a",{"href":608,"rel":609},"https:\u002F\u002Fwww.evlog.dev\u002Fframeworks\u002Ffastify",[610],"nofollow","\nAdapters: ",[606,613,614],{"href":614,"rel":615},"https:\u002F\u002Fwww.evlog.dev\u002Fadapters",[610],[617,618,20],"h2",{"id":619},"quick-start",[621,622,624],"h3",{"id":623},"_1-install","1. Install",[626,627,628,656,672,688],"code-group",{},[629,630,636],"pre",{"className":631,"code":632,"filename":633,"language":634,"meta":635,"style":635},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog fastify\n","pnpm","bash","",[557,637,638],{"__ignoreMap":635},[639,640,643,646,650,653],"span",{"class":641,"line":642},"line",1,[639,644,633],{"class":645},"sBMFI",[639,647,649],{"class":648},"sfazB"," add",[639,651,652],{"class":648}," evlog",[639,654,655],{"class":648}," fastify\n",[629,657,660],{"className":631,"code":658,"filename":659,"language":634,"meta":635,"style":635},"bun add evlog fastify\n","bun",[557,661,662],{"__ignoreMap":635},[639,663,664,666,668,670],{"class":641,"line":642},[639,665,659],{"class":645},[639,667,649],{"class":648},[639,669,652],{"class":648},[639,671,655],{"class":648},[629,673,676],{"className":631,"code":674,"filename":675,"language":634,"meta":635,"style":635},"yarn add evlog fastify\n","yarn",[557,677,678],{"__ignoreMap":635},[639,679,680,682,684,686],{"class":641,"line":642},[639,681,675],{"class":645},[639,683,649],{"class":648},[639,685,652],{"class":648},[639,687,655],{"class":648},[629,689,692],{"className":631,"code":690,"filename":691,"language":634,"meta":635,"style":635},"npm install evlog fastify\n","npm",[557,693,694],{"__ignoreMap":635},[639,695,696,698,701,703],{"class":641,"line":642},[639,697,691],{"class":645},[639,699,700],{"class":648}," install",[639,702,652],{"class":648},[639,704,655],{"class":648},[621,706,708],{"id":707},"_2-initialize-and-register-the-plugin","2. Initialize and register the plugin",[629,710,715],{"className":711,"code":712,"filename":713,"language":714,"meta":635,"style":635},"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",[557,716,717,740,764,783,790,803,831,840,845,879,884,902,907,949,985,1004,1011,1016],{"__ignoreMap":635},[639,718,719,723,727,730,734,737],{"class":641,"line":642},[639,720,722],{"class":721},"s7zQu","import",[639,724,726],{"class":725},"sTEyZ"," Fastify ",[639,728,729],{"class":721},"from",[639,731,733],{"class":732},"sMK4o"," '",[639,735,736],{"class":648},"fastify",[639,738,739],{"class":732},"'\n",[639,741,743,745,748,751,754,757,759,762],{"class":641,"line":742},2,[639,744,722],{"class":721},[639,746,747],{"class":732}," {",[639,749,750],{"class":725}," initLogger",[639,752,753],{"class":732}," }",[639,755,756],{"class":721}," from",[639,758,733],{"class":732},[639,760,761],{"class":648},"evlog",[639,763,739],{"class":732},[639,765,767,769,771,773,775,777,779,781],{"class":641,"line":766},3,[639,768,722],{"class":721},[639,770,747],{"class":732},[639,772,652],{"class":725},[639,774,753],{"class":732},[639,776,756],{"class":721},[639,778,733],{"class":732},[639,780,559],{"class":648},[639,782,739],{"class":732},[639,784,786],{"class":641,"line":785},4,[639,787,789],{"emptyLinePlaceholder":788},true,"\n",[639,791,793,797,800],{"class":641,"line":792},5,[639,794,796],{"class":795},"s2Zo4","initLogger",[639,798,799],{"class":725},"(",[639,801,802],{"class":732},"{\n",[639,804,806,810,813,815,818,820,822,825,828],{"class":641,"line":805},6,[639,807,809],{"class":808},"swJcz","  env",[639,811,812],{"class":732},":",[639,814,747],{"class":732},[639,816,817],{"class":808}," service",[639,819,812],{"class":732},[639,821,733],{"class":732},[639,823,824],{"class":648},"my-api",[639,826,827],{"class":732},"'",[639,829,830],{"class":732}," },\n",[639,832,834,837],{"class":641,"line":833},7,[639,835,836],{"class":732},"}",[639,838,839],{"class":725},")\n",[639,841,843],{"class":641,"line":842},8,[639,844,789],{"emptyLinePlaceholder":788},[639,846,848,852,855,858,861,863,866,869,871,875,877],{"class":641,"line":847},9,[639,849,851],{"class":850},"spNyl","const",[639,853,854],{"class":725}," app ",[639,856,857],{"class":732},"=",[639,859,860],{"class":795}," Fastify",[639,862,799],{"class":725},[639,864,865],{"class":732},"{",[639,867,868],{"class":808}," logger",[639,870,812],{"class":732},[639,872,874],{"class":873},"sfNiH"," false",[639,876,753],{"class":732},[639,878,839],{"class":725},[639,880,882],{"class":641,"line":881},10,[639,883,789],{"emptyLinePlaceholder":788},[639,885,887,890,893,896,899],{"class":641,"line":886},11,[639,888,889],{"class":721},"await",[639,891,892],{"class":725}," app",[639,894,895],{"class":732},".",[639,897,898],{"class":795},"register",[639,900,901],{"class":725},"(evlog)\n",[639,903,905],{"class":641,"line":904},12,[639,906,789],{"emptyLinePlaceholder":788},[639,908,910,913,915,918,920,922,925,927,930,933,936,940,943,946],{"class":641,"line":909},13,[639,911,912],{"class":725},"app",[639,914,895],{"class":732},[639,916,917],{"class":795},"get",[639,919,799],{"class":725},[639,921,827],{"class":732},[639,923,924],{"class":648},"\u002Fhealth",[639,926,827],{"class":732},[639,928,929],{"class":732},",",[639,931,932],{"class":850}," async",[639,934,935],{"class":732}," (",[639,937,939],{"class":938},"sHdIc","request",[639,941,942],{"class":732},")",[639,944,945],{"class":850}," =>",[639,947,948],{"class":732}," {\n",[639,950,952,955,957,960,962,965,967,969,972,974,976,979,981,983],{"class":641,"line":951},14,[639,953,954],{"class":725},"  request",[639,956,895],{"class":732},[639,958,959],{"class":725},"log",[639,961,895],{"class":732},[639,963,964],{"class":795},"set",[639,966,799],{"class":808},[639,968,865],{"class":732},[639,970,971],{"class":808}," route",[639,973,812],{"class":732},[639,975,733],{"class":732},[639,977,978],{"class":648},"health",[639,980,827],{"class":732},[639,982,753],{"class":732},[639,984,839],{"class":808},[639,986,988,991,993,996,998,1001],{"class":641,"line":987},15,[639,989,990],{"class":721},"  return",[639,992,747],{"class":732},[639,994,995],{"class":808}," ok",[639,997,812],{"class":732},[639,999,1000],{"class":873}," true",[639,1002,1003],{"class":732}," }\n",[639,1005,1007,1009],{"class":641,"line":1006},16,[639,1008,836],{"class":732},[639,1010,839],{"class":725},[639,1012,1014],{"class":641,"line":1013},17,[639,1015,789],{"emptyLinePlaceholder":788},[639,1017,1019,1021,1023,1025,1028,1030,1032,1035,1037,1041,1043],{"class":641,"line":1018},18,[639,1020,889],{"class":721},[639,1022,892],{"class":725},[639,1024,895],{"class":732},[639,1026,1027],{"class":795},"listen",[639,1029,799],{"class":725},[639,1031,865],{"class":732},[639,1033,1034],{"class":808}," port",[639,1036,812],{"class":732},[639,1038,1040],{"class":1039},"sbssI"," 3000",[639,1042,753],{"class":732},[639,1044,839],{"class":725},[1046,1047,1049,1053,1054,1060,1061,1064,1065,1068],"callout",{"color":1048,"icon":195},"info",[1050,1051,1052],"strong",{},"Using Vite?"," The ",[606,1055,1056,1059],{"href":193},[557,1057,1058],{},"evlog\u002Fvite"," plugin"," replaces the ",[557,1062,1063],{},"initLogger()"," call with compile-time auto-initialization, strips ",[557,1066,1067],{},"log.debug()"," from production builds, and injects source locations.",[553,1070,1071,1073,1074,1077],{},[557,1072,563],{}," is the evlog wide-event logger and shadows Fastify's built-in pino logger on the request. The pino logger remains accessible via ",[557,1075,1076],{},"fastify.log"," for server-level structured logging.",[617,1079,51],{"id":1080},"wide-events",[553,1082,1083],{},"Build up context progressively through your handler. One request = one wide event:",[629,1085,1087],{"className":711,"code":1086,"filename":713,"language":714,"meta":635,"style":635},"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",[557,1088,1089,1120,1157,1161,1192,1196,1222,1276,1280,1304,1362,1366,1380],{"__ignoreMap":635},[639,1090,1091,1093,1095,1097,1099,1101,1104,1106,1108,1110,1112,1114,1116,1118],{"class":641,"line":642},[639,1092,912],{"class":725},[639,1094,895],{"class":732},[639,1096,917],{"class":795},[639,1098,799],{"class":725},[639,1100,827],{"class":732},[639,1102,1103],{"class":648},"\u002Fusers\u002F:id",[639,1105,827],{"class":732},[639,1107,929],{"class":732},[639,1109,932],{"class":850},[639,1111,935],{"class":732},[639,1113,939],{"class":938},[639,1115,942],{"class":732},[639,1117,945],{"class":850},[639,1119,948],{"class":732},[639,1121,1122,1125,1127,1130,1132,1135,1138,1140,1143,1146,1148,1150,1152,1155],{"class":641,"line":742},[639,1123,1124],{"class":850},"  const",[639,1126,747],{"class":732},[639,1128,1129],{"class":725}," id",[639,1131,753],{"class":732},[639,1133,1134],{"class":732}," =",[639,1136,1137],{"class":725}," request",[639,1139,895],{"class":732},[639,1141,1142],{"class":725},"params",[639,1144,1145],{"class":721}," as",[639,1147,747],{"class":732},[639,1149,1129],{"class":808},[639,1151,812],{"class":732},[639,1153,1154],{"class":645}," string",[639,1156,1003],{"class":732},[639,1158,1159],{"class":641,"line":766},[639,1160,789],{"emptyLinePlaceholder":788},[639,1162,1163,1165,1167,1169,1171,1173,1175,1177,1180,1182,1184,1186,1188,1190],{"class":641,"line":785},[639,1164,954],{"class":725},[639,1166,895],{"class":732},[639,1168,959],{"class":725},[639,1170,895],{"class":732},[639,1172,964],{"class":795},[639,1174,799],{"class":808},[639,1176,865],{"class":732},[639,1178,1179],{"class":808}," user",[639,1181,812],{"class":732},[639,1183,747],{"class":732},[639,1185,1129],{"class":725},[639,1187,753],{"class":732},[639,1189,753],{"class":732},[639,1191,839],{"class":808},[639,1193,1194],{"class":641,"line":792},[639,1195,789],{"emptyLinePlaceholder":788},[639,1197,1198,1200,1202,1204,1207,1210,1212,1215,1217,1220],{"class":641,"line":805},[639,1199,1124],{"class":850},[639,1201,1179],{"class":725},[639,1203,1134],{"class":732},[639,1205,1206],{"class":721}," await",[639,1208,1209],{"class":725}," db",[639,1211,895],{"class":732},[639,1213,1214],{"class":795},"findUser",[639,1216,799],{"class":808},[639,1218,1219],{"class":725},"id",[639,1221,839],{"class":808},[639,1223,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244,1247,1249,1251,1253,1256,1258,1261,1263,1265,1267,1270,1272,1274],{"class":641,"line":833},[639,1225,954],{"class":725},[639,1227,895],{"class":732},[639,1229,959],{"class":725},[639,1231,895],{"class":732},[639,1233,964],{"class":795},[639,1235,799],{"class":808},[639,1237,865],{"class":732},[639,1239,1179],{"class":808},[639,1241,812],{"class":732},[639,1243,747],{"class":732},[639,1245,1246],{"class":808}," name",[639,1248,812],{"class":732},[639,1250,1179],{"class":725},[639,1252,895],{"class":732},[639,1254,1255],{"class":725},"name",[639,1257,929],{"class":732},[639,1259,1260],{"class":808}," plan",[639,1262,812],{"class":732},[639,1264,1179],{"class":725},[639,1266,895],{"class":732},[639,1268,1269],{"class":725},"plan",[639,1271,753],{"class":732},[639,1273,753],{"class":732},[639,1275,839],{"class":808},[639,1277,1278],{"class":641,"line":842},[639,1279,789],{"emptyLinePlaceholder":788},[639,1281,1282,1284,1287,1289,1291,1293,1295,1298,1300,1302],{"class":641,"line":847},[639,1283,1124],{"class":850},[639,1285,1286],{"class":725}," orders",[639,1288,1134],{"class":732},[639,1290,1206],{"class":721},[639,1292,1209],{"class":725},[639,1294,895],{"class":732},[639,1296,1297],{"class":795},"findOrders",[639,1299,799],{"class":808},[639,1301,1219],{"class":725},[639,1303,839],{"class":808},[639,1305,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1329,1331,1333,1335,1338,1340,1343,1345,1348,1350,1353,1356,1358,1360],{"class":641,"line":881},[639,1307,954],{"class":725},[639,1309,895],{"class":732},[639,1311,959],{"class":725},[639,1313,895],{"class":732},[639,1315,964],{"class":795},[639,1317,799],{"class":808},[639,1319,865],{"class":732},[639,1321,1286],{"class":808},[639,1323,812],{"class":732},[639,1325,747],{"class":732},[639,1327,1328],{"class":808}," count",[639,1330,812],{"class":732},[639,1332,1286],{"class":725},[639,1334,895],{"class":732},[639,1336,1337],{"class":725},"length",[639,1339,929],{"class":732},[639,1341,1342],{"class":808}," totalRevenue",[639,1344,812],{"class":732},[639,1346,1347],{"class":795}," sum",[639,1349,799],{"class":808},[639,1351,1352],{"class":725},"orders",[639,1354,1355],{"class":808},") ",[639,1357,836],{"class":732},[639,1359,753],{"class":732},[639,1361,839],{"class":808},[639,1363,1364],{"class":641,"line":886},[639,1365,789],{"emptyLinePlaceholder":788},[639,1367,1368,1370,1372,1374,1376,1378],{"class":641,"line":904},[639,1369,990],{"class":721},[639,1371,747],{"class":732},[639,1373,1179],{"class":725},[639,1375,929],{"class":732},[639,1377,1286],{"class":725},[639,1379,1003],{"class":732},[639,1381,1382,1384],{"class":641,"line":909},[639,1383,836],{"class":732},[639,1385,839],{"class":725},[553,1387,1388],{},"All fields are merged into a single wide event emitted when the request completes:",[629,1390,1393],{"className":631,"code":1391,"filename":1392,"language":634,"meta":635,"style":635},"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",[557,1394,1395,1406,1426,1442],{"__ignoreMap":635},[639,1396,1397,1400,1403],{"class":641,"line":642},[639,1398,1399],{"class":645},"14:58:15",[639,1401,1402],{"class":648}," INFO",[639,1404,1405],{"class":725}," [my-api] GET \u002Fusers\u002Fusr_123 200 in 12ms\n",[639,1407,1408,1411,1414,1417,1420,1423],{"class":641,"line":742},[639,1409,1410],{"class":645},"  ├─",[639,1412,1413],{"class":648}," orders:",[639,1415,1416],{"class":648}," count=",[639,1418,1419],{"class":1039},"2",[639,1421,1422],{"class":648}," totalRevenue=",[639,1424,1425],{"class":1039},"6298\n",[639,1427,1428,1430,1433,1436,1439],{"class":641,"line":766},[639,1429,1410],{"class":645},[639,1431,1432],{"class":648}," user:",[639,1434,1435],{"class":648}," id=usr_123",[639,1437,1438],{"class":648}," name=Alice",[639,1440,1441],{"class":648}," plan=pro\n",[639,1443,1444,1447,1450],{"class":641,"line":785},[639,1445,1446],{"class":645},"  └─",[639,1448,1449],{"class":648}," requestId:",[639,1451,1452],{"class":648}," 4a8ff3a8-...\n",[617,1454,567],{"id":1455},"uselogger",[553,1457,1458,1459,1461],{},"Use ",[557,1460,567],{}," to access the request-scoped logger from anywhere in the call stack without passing the request object through your service layer:",[629,1463,1466],{"className":711,"code":1464,"filename":1465,"language":714,"meta":635,"style":635},"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",[557,1467,1468,1487,1491,1516,1530,1557,1561,1583,1629,1633,1640],{"__ignoreMap":635},[639,1469,1470,1472,1474,1477,1479,1481,1483,1485],{"class":641,"line":642},[639,1471,722],{"class":721},[639,1473,747],{"class":732},[639,1475,1476],{"class":725}," useLogger",[639,1478,753],{"class":732},[639,1480,756],{"class":721},[639,1482,733],{"class":732},[639,1484,559],{"class":648},[639,1486,739],{"class":732},[639,1488,1489],{"class":641,"line":742},[639,1490,789],{"emptyLinePlaceholder":788},[639,1492,1493,1496,1498,1501,1504,1506,1508,1510,1512,1514],{"class":641,"line":766},[639,1494,1495],{"class":721},"export",[639,1497,932],{"class":850},[639,1499,1500],{"class":850}," function",[639,1502,1503],{"class":795}," findUser",[639,1505,799],{"class":732},[639,1507,1219],{"class":938},[639,1509,812],{"class":732},[639,1511,1154],{"class":645},[639,1513,942],{"class":732},[639,1515,948],{"class":732},[639,1517,1518,1520,1523,1525,1527],{"class":641,"line":785},[639,1519,1124],{"class":850},[639,1521,1522],{"class":725}," log",[639,1524,1134],{"class":732},[639,1526,1476],{"class":795},[639,1528,1529],{"class":808},"()\n",[639,1531,1532,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555],{"class":641,"line":792},[639,1533,1534],{"class":725},"  log",[639,1536,895],{"class":732},[639,1538,964],{"class":795},[639,1540,799],{"class":808},[639,1542,865],{"class":732},[639,1544,1179],{"class":808},[639,1546,812],{"class":732},[639,1548,747],{"class":732},[639,1550,1129],{"class":725},[639,1552,753],{"class":732},[639,1554,753],{"class":732},[639,1556,839],{"class":808},[639,1558,1559],{"class":641,"line":805},[639,1560,789],{"emptyLinePlaceholder":788},[639,1562,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581],{"class":641,"line":833},[639,1564,1124],{"class":850},[639,1566,1179],{"class":725},[639,1568,1134],{"class":732},[639,1570,1206],{"class":721},[639,1572,1209],{"class":725},[639,1574,895],{"class":732},[639,1576,1214],{"class":795},[639,1578,799],{"class":808},[639,1580,1219],{"class":725},[639,1582,839],{"class":808},[639,1584,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627],{"class":641,"line":842},[639,1586,1534],{"class":725},[639,1588,895],{"class":732},[639,1590,964],{"class":795},[639,1592,799],{"class":808},[639,1594,865],{"class":732},[639,1596,1179],{"class":808},[639,1598,812],{"class":732},[639,1600,747],{"class":732},[639,1602,1246],{"class":808},[639,1604,812],{"class":732},[639,1606,1179],{"class":725},[639,1608,895],{"class":732},[639,1610,1255],{"class":725},[639,1612,929],{"class":732},[639,1614,1260],{"class":808},[639,1616,812],{"class":732},[639,1618,1179],{"class":725},[639,1620,895],{"class":732},[639,1622,1269],{"class":725},[639,1624,753],{"class":732},[639,1626,753],{"class":732},[639,1628,839],{"class":808},[639,1630,1631],{"class":641,"line":847},[639,1632,789],{"emptyLinePlaceholder":788},[639,1634,1635,1637],{"class":641,"line":881},[639,1636,990],{"class":721},[639,1638,1639],{"class":725}," user\n",[639,1641,1642],{"class":641,"line":886},[639,1643,1644],{"class":732},"}\n",[629,1646,1648],{"className":711,"code":1647,"filename":713,"language":714,"meta":635,"style":635},"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",[557,1649,1650,1669,1673,1703,1733,1751,1757],{"__ignoreMap":635},[639,1651,1652,1654,1656,1658,1660,1662,1664,1667],{"class":641,"line":642},[639,1653,722],{"class":721},[639,1655,747],{"class":732},[639,1657,1503],{"class":725},[639,1659,753],{"class":732},[639,1661,756],{"class":721},[639,1663,733],{"class":732},[639,1665,1666],{"class":648},".\u002Fservices\u002Fuser",[639,1668,739],{"class":732},[639,1670,1671],{"class":641,"line":742},[639,1672,789],{"emptyLinePlaceholder":788},[639,1674,1675,1677,1679,1681,1683,1685,1687,1689,1691,1693,1695,1697,1699,1701],{"class":641,"line":766},[639,1676,912],{"class":725},[639,1678,895],{"class":732},[639,1680,917],{"class":795},[639,1682,799],{"class":725},[639,1684,827],{"class":732},[639,1686,1103],{"class":648},[639,1688,827],{"class":732},[639,1690,929],{"class":732},[639,1692,932],{"class":850},[639,1694,935],{"class":732},[639,1696,939],{"class":938},[639,1698,942],{"class":732},[639,1700,945],{"class":850},[639,1702,948],{"class":732},[639,1704,1705,1707,1709,1711,1713,1715,1717,1719,1721,1723,1725,1727,1729,1731],{"class":641,"line":785},[639,1706,1124],{"class":850},[639,1708,747],{"class":732},[639,1710,1129],{"class":725},[639,1712,753],{"class":732},[639,1714,1134],{"class":732},[639,1716,1137],{"class":725},[639,1718,895],{"class":732},[639,1720,1142],{"class":725},[639,1722,1145],{"class":721},[639,1724,747],{"class":732},[639,1726,1129],{"class":808},[639,1728,812],{"class":732},[639,1730,1154],{"class":645},[639,1732,1003],{"class":732},[639,1734,1735,1737,1739,1741,1743,1745,1747,1749],{"class":641,"line":792},[639,1736,1124],{"class":850},[639,1738,1179],{"class":725},[639,1740,1134],{"class":732},[639,1742,1206],{"class":721},[639,1744,1503],{"class":795},[639,1746,799],{"class":808},[639,1748,1219],{"class":725},[639,1750,839],{"class":808},[639,1752,1753,1755],{"class":641,"line":805},[639,1754,990],{"class":721},[639,1756,1639],{"class":725},[639,1758,1759,1761],{"class":641,"line":833},[639,1760,836],{"class":732},[639,1762,839],{"class":725},[553,1764,1765,1766,564,1768,1770,1771,1773,1774,1777],{},"Both ",[557,1767,563],{},[557,1769,567],{}," return the same logger instance. ",[557,1772,567],{}," uses ",[557,1775,1776],{},"AsyncLocalStorage"," to propagate the logger across async boundaries.",[617,1779,1781,1782,942],{"id":1780},"background-work-logfork","Background work (",[557,1783,1784],{},"log.fork",[553,1786,1458,1787,1790,1791,1794,1795,895],{},[557,1788,1789],{},"request.log.fork(label, fn)"," for async work that should emit a ",[1050,1792,1793],{},"separate"," child wide event after the response. See ",[606,1796,1798],{"href":1797},"\u002Flogging\u002Fwide-events#after-emit-sealing-and-background-work","Wide events — After emit",[629,1800,1802],{"className":711,"code":1801,"filename":713,"language":714,"meta":635,"style":635},"import { evlog, useLogger } from 'evlog\u002Ffastify'\n\napp.post('\u002Forders', async (request, reply) => {\n  request.log.fork!('fulfill', async () => {\n    const log = useLogger()\n    log.set({ step: 'ok' })\n  })\n  return { ok: true }\n})\n",[557,1803,1804,1826,1830,1867,1903,1916,1945,1952,1966],{"__ignoreMap":635},[639,1805,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824],{"class":641,"line":642},[639,1807,722],{"class":721},[639,1809,747],{"class":732},[639,1811,652],{"class":725},[639,1813,929],{"class":732},[639,1815,1476],{"class":725},[639,1817,753],{"class":732},[639,1819,756],{"class":721},[639,1821,733],{"class":732},[639,1823,559],{"class":648},[639,1825,739],{"class":732},[639,1827,1828],{"class":641,"line":742},[639,1829,789],{"emptyLinePlaceholder":788},[639,1831,1832,1834,1836,1839,1841,1843,1846,1848,1850,1852,1854,1856,1858,1861,1863,1865],{"class":641,"line":766},[639,1833,912],{"class":725},[639,1835,895],{"class":732},[639,1837,1838],{"class":795},"post",[639,1840,799],{"class":725},[639,1842,827],{"class":732},[639,1844,1845],{"class":648},"\u002Forders",[639,1847,827],{"class":732},[639,1849,929],{"class":732},[639,1851,932],{"class":850},[639,1853,935],{"class":732},[639,1855,939],{"class":938},[639,1857,929],{"class":732},[639,1859,1860],{"class":938}," reply",[639,1862,942],{"class":732},[639,1864,945],{"class":850},[639,1866,948],{"class":732},[639,1868,1869,1871,1873,1875,1877,1880,1883,1885,1887,1890,1892,1894,1896,1899,1901],{"class":641,"line":785},[639,1870,954],{"class":725},[639,1872,895],{"class":732},[639,1874,959],{"class":725},[639,1876,895],{"class":732},[639,1878,1879],{"class":795},"fork",[639,1881,1882],{"class":732},"!",[639,1884,799],{"class":808},[639,1886,827],{"class":732},[639,1888,1889],{"class":648},"fulfill",[639,1891,827],{"class":732},[639,1893,929],{"class":732},[639,1895,932],{"class":850},[639,1897,1898],{"class":732}," ()",[639,1900,945],{"class":850},[639,1902,948],{"class":732},[639,1904,1905,1908,1910,1912,1914],{"class":641,"line":792},[639,1906,1907],{"class":850},"    const",[639,1909,1522],{"class":725},[639,1911,1134],{"class":732},[639,1913,1476],{"class":795},[639,1915,1529],{"class":808},[639,1917,1918,1921,1923,1925,1927,1929,1932,1934,1936,1939,1941,1943],{"class":641,"line":805},[639,1919,1920],{"class":725},"    log",[639,1922,895],{"class":732},[639,1924,964],{"class":795},[639,1926,799],{"class":808},[639,1928,865],{"class":732},[639,1930,1931],{"class":808}," step",[639,1933,812],{"class":732},[639,1935,733],{"class":732},[639,1937,1938],{"class":648},"ok",[639,1940,827],{"class":732},[639,1942,753],{"class":732},[639,1944,839],{"class":808},[639,1946,1947,1950],{"class":641,"line":833},[639,1948,1949],{"class":732},"  }",[639,1951,839],{"class":808},[639,1953,1954,1956,1958,1960,1962,1964],{"class":641,"line":842},[639,1955,990],{"class":721},[639,1957,747],{"class":732},[639,1959,995],{"class":808},[639,1961,812],{"class":732},[639,1963,1000],{"class":873},[639,1965,1003],{"class":732},[639,1967,1968,1970],{"class":641,"line":847},[639,1969,836],{"class":732},[639,1971,839],{"class":725},[617,1973,1975],{"id":1974},"error-handling","Error Handling",[553,1977,1458,1978,1981,1982,1985,1986,1989,1990,1993,1994,812],{},[557,1979,1980],{},"createError"," for structured errors with ",[557,1983,1984],{},"why",", ",[557,1987,1988],{},"fix",", and ",[557,1991,1992],{},"link"," fields. Fastify captures thrown errors via ",[557,1995,1996],{},"onError",[629,1998,2000],{"className":711,"code":1999,"filename":713,"language":714,"meta":635,"style":635},"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",[557,2001,2002,2026,2030,2066,2077,2094,2106,2122,2138,2154,2160,2166,2170,2201,2218,2248,2263,2277,2291,2306,2313],{"__ignoreMap":635},[639,2003,2004,2006,2008,2011,2013,2016,2018,2020,2022,2024],{"class":641,"line":642},[639,2005,722],{"class":721},[639,2007,747],{"class":732},[639,2009,2010],{"class":725}," createError",[639,2012,929],{"class":732},[639,2014,2015],{"class":725}," parseError",[639,2017,753],{"class":732},[639,2019,756],{"class":721},[639,2021,733],{"class":732},[639,2023,761],{"class":648},[639,2025,739],{"class":732},[639,2027,2028],{"class":641,"line":742},[639,2029,789],{"emptyLinePlaceholder":788},[639,2031,2032,2034,2036,2038,2040,2042,2045,2047,2049,2051,2053,2056,2058,2060,2062,2064],{"class":641,"line":766},[639,2033,912],{"class":725},[639,2035,895],{"class":732},[639,2037,917],{"class":795},[639,2039,799],{"class":725},[639,2041,827],{"class":732},[639,2043,2044],{"class":648},"\u002Fcheckout",[639,2046,827],{"class":732},[639,2048,929],{"class":732},[639,2050,932],{"class":850},[639,2052,935],{"class":732},[639,2054,2055],{"class":938},"_request",[639,2057,929],{"class":732},[639,2059,1860],{"class":938},[639,2061,942],{"class":732},[639,2063,945],{"class":850},[639,2065,948],{"class":732},[639,2067,2068,2071,2073,2075],{"class":641,"line":785},[639,2069,2070],{"class":721},"  throw",[639,2072,2010],{"class":795},[639,2074,799],{"class":808},[639,2076,802],{"class":732},[639,2078,2079,2082,2084,2086,2089,2091],{"class":641,"line":792},[639,2080,2081],{"class":808},"    message",[639,2083,812],{"class":732},[639,2085,733],{"class":732},[639,2087,2088],{"class":648},"Payment failed",[639,2090,827],{"class":732},[639,2092,2093],{"class":732},",\n",[639,2095,2096,2099,2101,2104],{"class":641,"line":805},[639,2097,2098],{"class":808},"    status",[639,2100,812],{"class":732},[639,2102,2103],{"class":1039}," 402",[639,2105,2093],{"class":732},[639,2107,2108,2111,2113,2115,2118,2120],{"class":641,"line":833},[639,2109,2110],{"class":808},"    why",[639,2112,812],{"class":732},[639,2114,733],{"class":732},[639,2116,2117],{"class":648},"Card declined by issuer",[639,2119,827],{"class":732},[639,2121,2093],{"class":732},[639,2123,2124,2127,2129,2131,2134,2136],{"class":641,"line":842},[639,2125,2126],{"class":808},"    fix",[639,2128,812],{"class":732},[639,2130,733],{"class":732},[639,2132,2133],{"class":648},"Try a different payment method",[639,2135,827],{"class":732},[639,2137,2093],{"class":732},[639,2139,2140,2143,2145,2147,2150,2152],{"class":641,"line":847},[639,2141,2142],{"class":808},"    link",[639,2144,812],{"class":732},[639,2146,733],{"class":732},[639,2148,2149],{"class":648},"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined",[639,2151,827],{"class":732},[639,2153,2093],{"class":732},[639,2155,2156,2158],{"class":641,"line":881},[639,2157,1949],{"class":732},[639,2159,839],{"class":808},[639,2161,2162,2164],{"class":641,"line":886},[639,2163,836],{"class":732},[639,2165,839],{"class":725},[639,2167,2168],{"class":641,"line":904},[639,2169,789],{"emptyLinePlaceholder":788},[639,2171,2172,2174,2176,2179,2181,2183,2186,2188,2191,2193,2195,2197,2199],{"class":641,"line":909},[639,2173,912],{"class":725},[639,2175,895],{"class":732},[639,2177,2178],{"class":795},"setErrorHandler",[639,2180,799],{"class":725},[639,2182,799],{"class":732},[639,2184,2185],{"class":938},"error",[639,2187,929],{"class":732},[639,2189,2190],{"class":938}," _request",[639,2192,929],{"class":732},[639,2194,1860],{"class":938},[639,2196,942],{"class":732},[639,2198,945],{"class":850},[639,2200,948],{"class":732},[639,2202,2203,2205,2208,2210,2212,2214,2216],{"class":641,"line":951},[639,2204,1124],{"class":850},[639,2206,2207],{"class":725}," parsed",[639,2209,1134],{"class":732},[639,2211,2015],{"class":795},[639,2213,799],{"class":808},[639,2215,2185],{"class":725},[639,2217,839],{"class":808},[639,2219,2220,2223,2225,2228,2230,2233,2235,2237,2239,2241,2244,2246],{"class":641,"line":987},[639,2221,2222],{"class":725},"  reply",[639,2224,895],{"class":732},[639,2226,2227],{"class":795},"status",[639,2229,799],{"class":808},[639,2231,2232],{"class":725},"parsed",[639,2234,895],{"class":732},[639,2236,2227],{"class":725},[639,2238,942],{"class":808},[639,2240,895],{"class":732},[639,2242,2243],{"class":795},"send",[639,2245,799],{"class":808},[639,2247,802],{"class":732},[639,2249,2250,2252,2254,2256,2258,2261],{"class":641,"line":1006},[639,2251,2081],{"class":808},[639,2253,812],{"class":732},[639,2255,2207],{"class":725},[639,2257,895],{"class":732},[639,2259,2260],{"class":725},"message",[639,2262,2093],{"class":732},[639,2264,2265,2267,2269,2271,2273,2275],{"class":641,"line":1013},[639,2266,2110],{"class":808},[639,2268,812],{"class":732},[639,2270,2207],{"class":725},[639,2272,895],{"class":732},[639,2274,1984],{"class":725},[639,2276,2093],{"class":732},[639,2278,2279,2281,2283,2285,2287,2289],{"class":641,"line":1018},[639,2280,2126],{"class":808},[639,2282,812],{"class":732},[639,2284,2207],{"class":725},[639,2286,895],{"class":732},[639,2288,1988],{"class":725},[639,2290,2093],{"class":732},[639,2292,2294,2296,2298,2300,2302,2304],{"class":641,"line":2293},19,[639,2295,2142],{"class":808},[639,2297,812],{"class":732},[639,2299,2207],{"class":725},[639,2301,895],{"class":732},[639,2303,1992],{"class":725},[639,2305,2093],{"class":732},[639,2307,2309,2311],{"class":641,"line":2308},20,[639,2310,1949],{"class":732},[639,2312,839],{"class":808},[639,2314,2316,2318],{"class":641,"line":2315},21,[639,2317,836],{"class":732},[639,2319,839],{"class":725},[553,2321,2322],{},"The error is captured and logged with both the custom context and structured error fields:",[629,2324,2326],{"className":631,"code":2325,"filename":1392,"language":634,"meta":635,"style":635},"14:58:20 ERROR [my-api] GET \u002Fcheckout 402 in 3ms\n  ├─ error: name=EvlogError message=Payment failed status=402\n  └─ requestId: 880a50ac-...\n",[557,2327,2328,2339,2361],{"__ignoreMap":635},[639,2329,2330,2333,2336],{"class":641,"line":642},[639,2331,2332],{"class":645},"14:58:20",[639,2334,2335],{"class":648}," ERROR",[639,2337,2338],{"class":725}," [my-api] GET \u002Fcheckout 402 in 3ms\n",[639,2340,2341,2343,2346,2349,2352,2355,2358],{"class":641,"line":742},[639,2342,1410],{"class":645},[639,2344,2345],{"class":648}," error:",[639,2347,2348],{"class":648}," name=EvlogError",[639,2350,2351],{"class":648}," message=Payment",[639,2353,2354],{"class":648}," failed",[639,2356,2357],{"class":648}," status=",[639,2359,2360],{"class":1039},"402\n",[639,2362,2363,2365,2367],{"class":641,"line":766},[639,2364,1446],{"class":645},[639,2366,1449],{"class":648},[639,2368,2369],{"class":648}," 880a50ac-...\n",[617,2371,170],{"id":2372},"configuration",[553,2374,2375,2376,2379,2380,2382],{},"See the ",[606,2377,2378],{"href":171},"Configuration reference"," for all available options (",[557,2381,796],{},", middleware options, sampling, silent mode, etc.).",[617,2384,2386],{"id":2385},"drain-enrichers","Drain & Enrichers",[553,2388,2389],{},"Configure drain adapters and enrichers directly in the plugin options:",[629,2391,2393],{"className":711,"code":2392,"filename":713,"language":714,"meta":635,"style":635},"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",[557,2394,2395,2415,2435,2439,2452,2456,2473,2487,2505,2516,2546,2551],{"__ignoreMap":635},[639,2396,2397,2399,2401,2404,2406,2408,2410,2413],{"class":641,"line":642},[639,2398,722],{"class":721},[639,2400,747],{"class":732},[639,2402,2403],{"class":725}," createAxiomDrain",[639,2405,753],{"class":732},[639,2407,756],{"class":721},[639,2409,733],{"class":732},[639,2411,2412],{"class":648},"evlog\u002Faxiom",[639,2414,739],{"class":732},[639,2416,2417,2419,2421,2424,2426,2428,2430,2433],{"class":641,"line":742},[639,2418,722],{"class":721},[639,2420,747],{"class":732},[639,2422,2423],{"class":725}," createUserAgentEnricher",[639,2425,753],{"class":732},[639,2427,756],{"class":721},[639,2429,733],{"class":732},[639,2431,2432],{"class":648},"evlog\u002Fenrichers",[639,2434,739],{"class":732},[639,2436,2437],{"class":641,"line":766},[639,2438,789],{"emptyLinePlaceholder":788},[639,2440,2441,2443,2446,2448,2450],{"class":641,"line":785},[639,2442,851],{"class":850},[639,2444,2445],{"class":725}," userAgent ",[639,2447,857],{"class":732},[639,2449,2423],{"class":795},[639,2451,1529],{"class":725},[639,2453,2454],{"class":641,"line":792},[639,2455,789],{"emptyLinePlaceholder":788},[639,2457,2458,2460,2462,2464,2466,2469,2471],{"class":641,"line":805},[639,2459,889],{"class":721},[639,2461,892],{"class":725},[639,2463,895],{"class":732},[639,2465,898],{"class":795},[639,2467,2468],{"class":725},"(evlog",[639,2470,929],{"class":732},[639,2472,948],{"class":732},[639,2474,2475,2478,2480,2482,2485],{"class":641,"line":833},[639,2476,2477],{"class":808},"  drain",[639,2479,812],{"class":732},[639,2481,2403],{"class":795},[639,2483,2484],{"class":725},"()",[639,2486,2093],{"class":732},[639,2488,2489,2492,2494,2496,2499,2501,2503],{"class":641,"line":842},[639,2490,2491],{"class":795},"  enrich",[639,2493,812],{"class":732},[639,2495,935],{"class":732},[639,2497,2498],{"class":938},"ctx",[639,2500,942],{"class":732},[639,2502,945],{"class":850},[639,2504,948],{"class":732},[639,2506,2507,2510,2512,2514],{"class":641,"line":847},[639,2508,2509],{"class":795},"    userAgent",[639,2511,799],{"class":808},[639,2513,2498],{"class":725},[639,2515,839],{"class":808},[639,2517,2518,2521,2523,2526,2528,2531,2533,2536,2538,2541,2543],{"class":641,"line":881},[639,2519,2520],{"class":725},"    ctx",[639,2522,895],{"class":732},[639,2524,2525],{"class":725},"event",[639,2527,895],{"class":732},[639,2529,2530],{"class":725},"region",[639,2532,1134],{"class":732},[639,2534,2535],{"class":725}," process",[639,2537,895],{"class":732},[639,2539,2540],{"class":725},"env",[639,2542,895],{"class":732},[639,2544,2545],{"class":725},"FLY_REGION\n",[639,2547,2548],{"class":641,"line":886},[639,2549,2550],{"class":732},"  },\n",[639,2552,2553,2555],{"class":641,"line":904},[639,2554,836],{"class":732},[639,2556,839],{"class":725},[621,2558,2560],{"id":2559},"pipeline-batching-retry","Pipeline (Batching & Retry)",[553,2562,2563,2564,2567],{},"For production, wrap your adapter with ",[557,2565,2566],{},"createDrainPipeline"," to batch events and retry on failure:",[629,2569,2571],{"className":711,"code":2570,"filename":713,"language":714,"meta":635,"style":635},"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",[557,2572,2573,2595,2613,2633,2637,2661,2690,2709,2715,2735,2739],{"__ignoreMap":635},[639,2574,2575,2577,2580,2582,2585,2587,2589,2591,2593],{"class":641,"line":642},[639,2576,722],{"class":721},[639,2578,2579],{"class":721}," type",[639,2581,747],{"class":732},[639,2583,2584],{"class":725}," DrainContext",[639,2586,753],{"class":732},[639,2588,756],{"class":721},[639,2590,733],{"class":732},[639,2592,761],{"class":648},[639,2594,739],{"class":732},[639,2596,2597,2599,2601,2603,2605,2607,2609,2611],{"class":641,"line":742},[639,2598,722],{"class":721},[639,2600,747],{"class":732},[639,2602,2403],{"class":725},[639,2604,753],{"class":732},[639,2606,756],{"class":721},[639,2608,733],{"class":732},[639,2610,2412],{"class":648},[639,2612,739],{"class":732},[639,2614,2615,2617,2619,2622,2624,2626,2628,2631],{"class":641,"line":766},[639,2616,722],{"class":721},[639,2618,747],{"class":732},[639,2620,2621],{"class":725}," createDrainPipeline",[639,2623,753],{"class":732},[639,2625,756],{"class":721},[639,2627,733],{"class":732},[639,2629,2630],{"class":648},"evlog\u002Fpipeline",[639,2632,739],{"class":732},[639,2634,2635],{"class":641,"line":785},[639,2636,789],{"emptyLinePlaceholder":788},[639,2638,2639,2641,2644,2646,2648,2651,2654,2657,2659],{"class":641,"line":792},[639,2640,851],{"class":850},[639,2642,2643],{"class":725}," pipeline ",[639,2645,857],{"class":732},[639,2647,2621],{"class":795},[639,2649,2650],{"class":732},"\u003C",[639,2652,2653],{"class":645},"DrainContext",[639,2655,2656],{"class":732},">",[639,2658,799],{"class":725},[639,2660,802],{"class":732},[639,2662,2663,2666,2668,2670,2673,2675,2678,2680,2683,2685,2688],{"class":641,"line":805},[639,2664,2665],{"class":808},"  batch",[639,2667,812],{"class":732},[639,2669,747],{"class":732},[639,2671,2672],{"class":808}," size",[639,2674,812],{"class":732},[639,2676,2677],{"class":1039}," 50",[639,2679,929],{"class":732},[639,2681,2682],{"class":808}," intervalMs",[639,2684,812],{"class":732},[639,2686,2687],{"class":1039}," 5000",[639,2689,830],{"class":732},[639,2691,2692,2695,2697,2699,2702,2704,2707],{"class":641,"line":833},[639,2693,2694],{"class":808},"  retry",[639,2696,812],{"class":732},[639,2698,747],{"class":732},[639,2700,2701],{"class":808}," maxAttempts",[639,2703,812],{"class":732},[639,2705,2706],{"class":1039}," 3",[639,2708,830],{"class":732},[639,2710,2711,2713],{"class":641,"line":842},[639,2712,836],{"class":732},[639,2714,839],{"class":725},[639,2716,2717,2719,2722,2724,2727,2729,2732],{"class":641,"line":847},[639,2718,851],{"class":850},[639,2720,2721],{"class":725}," drain ",[639,2723,857],{"class":732},[639,2725,2726],{"class":795}," pipeline",[639,2728,799],{"class":725},[639,2730,2731],{"class":795},"createAxiomDrain",[639,2733,2734],{"class":725},"())\n",[639,2736,2737],{"class":641,"line":881},[639,2738,789],{"emptyLinePlaceholder":788},[639,2740,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759],{"class":641,"line":886},[639,2742,889],{"class":721},[639,2744,892],{"class":725},[639,2746,895],{"class":732},[639,2748,898],{"class":795},[639,2750,2468],{"class":725},[639,2752,929],{"class":732},[639,2754,747],{"class":732},[639,2756,2721],{"class":725},[639,2758,836],{"class":732},[639,2760,839],{"class":725},[1046,2762,2763,2764,2767,2768,2771],{"color":1048,"icon":13},"Call ",[557,2765,2766],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[606,2769,2770],{"href":515},"Pipeline docs"," for all options.",[617,2773,2775],{"id":2774},"tail-sampling","Tail Sampling",[553,2777,1458,2778,2781],{},[557,2779,2780],{},"keep"," to force-retain specific events regardless of head sampling:",[629,2783,2785],{"className":711,"code":2784,"filename":713,"language":714,"meta":635,"style":635},"await app.register(evlog, {\n  drain: createAxiomDrain(),\n  keep: (ctx) => {\n    if (ctx.duration && ctx.duration > 2000) ctx.shouldKeep = true\n  },\n})\n",[557,2786,2787,2803,2815,2832,2876,2880],{"__ignoreMap":635},[639,2788,2789,2791,2793,2795,2797,2799,2801],{"class":641,"line":642},[639,2790,889],{"class":721},[639,2792,892],{"class":725},[639,2794,895],{"class":732},[639,2796,898],{"class":795},[639,2798,2468],{"class":725},[639,2800,929],{"class":732},[639,2802,948],{"class":732},[639,2804,2805,2807,2809,2811,2813],{"class":641,"line":742},[639,2806,2477],{"class":808},[639,2808,812],{"class":732},[639,2810,2403],{"class":795},[639,2812,2484],{"class":725},[639,2814,2093],{"class":732},[639,2816,2817,2820,2822,2824,2826,2828,2830],{"class":641,"line":766},[639,2818,2819],{"class":795},"  keep",[639,2821,812],{"class":732},[639,2823,935],{"class":732},[639,2825,2498],{"class":938},[639,2827,942],{"class":732},[639,2829,945],{"class":850},[639,2831,948],{"class":732},[639,2833,2834,2837,2839,2841,2843,2846,2849,2852,2854,2856,2859,2862,2864,2866,2868,2871,2873],{"class":641,"line":785},[639,2835,2836],{"class":721},"    if",[639,2838,935],{"class":808},[639,2840,2498],{"class":725},[639,2842,895],{"class":732},[639,2844,2845],{"class":725},"duration",[639,2847,2848],{"class":732}," &&",[639,2850,2851],{"class":725}," ctx",[639,2853,895],{"class":732},[639,2855,2845],{"class":725},[639,2857,2858],{"class":732}," >",[639,2860,2861],{"class":1039}," 2000",[639,2863,1355],{"class":808},[639,2865,2498],{"class":725},[639,2867,895],{"class":732},[639,2869,2870],{"class":725},"shouldKeep",[639,2872,1134],{"class":732},[639,2874,2875],{"class":873}," true\n",[639,2877,2878],{"class":641,"line":792},[639,2879,2550],{"class":732},[639,2881,2882,2884],{"class":641,"line":805},[639,2883,836],{"class":732},[639,2885,839],{"class":725},[617,2887,2889],{"id":2888},"route-filtering","Route Filtering",[553,2891,2892,2893,564,2896,2899],{},"Control which routes are logged with ",[557,2894,2895],{},"include",[557,2897,2898],{},"exclude"," patterns:",[629,2901,2903],{"className":711,"code":2902,"filename":713,"language":714,"meta":635,"style":635},"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",[557,2904,2905,2921,2943,2971,2980,3007,3033,3037],{"__ignoreMap":635},[639,2906,2907,2909,2911,2913,2915,2917,2919],{"class":641,"line":642},[639,2908,889],{"class":721},[639,2910,892],{"class":725},[639,2912,895],{"class":732},[639,2914,898],{"class":795},[639,2916,2468],{"class":725},[639,2918,929],{"class":732},[639,2920,948],{"class":732},[639,2922,2923,2926,2928,2931,2933,2936,2938,2941],{"class":641,"line":742},[639,2924,2925],{"class":808},"  include",[639,2927,812],{"class":732},[639,2929,2930],{"class":725}," [",[639,2932,827],{"class":732},[639,2934,2935],{"class":648},"\u002Fapi\u002F**",[639,2937,827],{"class":732},[639,2939,2940],{"class":725},"]",[639,2942,2093],{"class":732},[639,2944,2945,2948,2950,2952,2954,2957,2959,2961,2963,2965,2967,2969],{"class":641,"line":766},[639,2946,2947],{"class":808},"  exclude",[639,2949,812],{"class":732},[639,2951,2930],{"class":725},[639,2953,827],{"class":732},[639,2955,2956],{"class":648},"\u002F_internal\u002F**",[639,2958,827],{"class":732},[639,2960,929],{"class":732},[639,2962,733],{"class":732},[639,2964,924],{"class":648},[639,2966,827],{"class":732},[639,2968,2940],{"class":725},[639,2970,2093],{"class":732},[639,2972,2973,2976,2978],{"class":641,"line":785},[639,2974,2975],{"class":808},"  routes",[639,2977,812],{"class":732},[639,2979,948],{"class":732},[639,2981,2982,2985,2988,2990,2992,2994,2996,2998,3000,3003,3005],{"class":641,"line":792},[639,2983,2984],{"class":732},"    '",[639,2986,2987],{"class":808},"\u002Fapi\u002Fauth\u002F**",[639,2989,827],{"class":732},[639,2991,812],{"class":732},[639,2993,747],{"class":732},[639,2995,817],{"class":808},[639,2997,812],{"class":732},[639,2999,733],{"class":732},[639,3001,3002],{"class":648},"auth-service",[639,3004,827],{"class":732},[639,3006,830],{"class":732},[639,3008,3009,3011,3014,3016,3018,3020,3022,3024,3026,3029,3031],{"class":641,"line":805},[639,3010,2984],{"class":732},[639,3012,3013],{"class":808},"\u002Fapi\u002Fpayment\u002F**",[639,3015,827],{"class":732},[639,3017,812],{"class":732},[639,3019,747],{"class":732},[639,3021,817],{"class":808},[639,3023,812],{"class":732},[639,3025,733],{"class":732},[639,3027,3028],{"class":648},"payment-service",[639,3030,827],{"class":732},[639,3032,830],{"class":732},[639,3034,3035],{"class":641,"line":833},[639,3036,2550],{"class":732},[639,3038,3039,3041],{"class":641,"line":842},[639,3040,836],{"class":732},[639,3042,839],{"class":725},[617,3044,3046],{"id":3045},"run-locally","Run Locally",[629,3048,3051],{"className":631,"code":3049,"filename":3050,"language":634,"meta":635,"style":635},"git clone https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\ncd evlog\npnpm install\npnpm run example:fastify\n","Terminal",[557,3052,3053,3064,3072,3079],{"__ignoreMap":635},[639,3054,3055,3058,3061],{"class":641,"line":642},[639,3056,3057],{"class":645},"git",[639,3059,3060],{"class":648}," clone",[639,3062,3063],{"class":648}," https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\n",[639,3065,3066,3069],{"class":641,"line":742},[639,3067,3068],{"class":795},"cd",[639,3070,3071],{"class":648}," evlog\n",[639,3073,3074,3076],{"class":641,"line":766},[639,3075,633],{"class":645},[639,3077,3078],{"class":648}," install\n",[639,3080,3081,3083,3086],{"class":641,"line":785},[639,3082,633],{"class":645},[639,3084,3085],{"class":648}," run",[639,3087,3088],{"class":648}," example:fastify\n",[553,3090,3091,3092,3096],{},"Open ",[606,3093,3094],{"href":3094,"rel":3095},"http:\u002F\u002Flocalhost:3000",[610]," to explore the interactive test UI.",[3098,3099,3100],"card-group",{},[3101,3102,3106],"card",{"icon":3103,"title":3104,"to":3105},"i-simple-icons-github","Source Code","https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Ffastify","Browse the complete Fastify example source on GitHub.",[617,3108,3110],{"id":3109},"next-steps","Next Steps",[578,3112,3113,3118,3123,3128],{},[581,3114,3115,3117],{},[606,3116,51],{"href":52},": Design comprehensive events with context layering",[581,3119,3120,3122],{},[606,3121,447],{"href":452},": Send logs to Axiom, Sentry, PostHog, and more",[581,3124,3125,3127],{},[606,3126,175],{"href":176},": Control log volume with head and tail sampling",[581,3129,3130,3132,3133,1985,3135,1989,3137,3139],{},[606,3131,56],{"href":57},": Throw errors with ",[557,3134,1984],{},[557,3136,1988],{},[557,3138,1992],{}," fields",[3141,3142,3143],"style",{},"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 .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 .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":635,"searchDepth":742,"depth":742,"links":3145},[3146,3150,3151,3152,3154,3155,3156,3159,3160,3161,3162],{"id":619,"depth":742,"text":20,"children":3147},[3148,3149],{"id":623,"depth":766,"text":624},{"id":707,"depth":766,"text":708},{"id":1080,"depth":742,"text":51},{"id":1455,"depth":742,"text":567},{"id":1780,"depth":742,"text":3153},"Background work (log.fork)",{"id":1974,"depth":742,"text":1975},{"id":2372,"depth":742,"text":170},{"id":2385,"depth":742,"text":2386,"children":3157},[3158],{"id":2559,"depth":766,"text":2560},{"id":2774,"depth":742,"text":2775},{"id":2888,"depth":742,"text":2889},{"id":3045,"depth":742,"text":3046},{"id":3109,"depth":742,"text":3110},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Fastify applications.","md",[3166],{"label":3104,"icon":3103,"to":3105,"color":3167,"variant":3168},"neutral","subtle",{},{"title":251,"icon":254},{"title":251,"description":3163},"xJrxeQ6F6FyIPjvkLeAWJkRm3JfEjtGaGvUIS3-oWLQ",[3174,3176],{"title":246,"path":247,"stem":248,"description":3175,"icon":249,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Hono applications.",{"title":256,"path":257,"stem":258,"description":3177,"icon":259,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Elysia applications.",1778338242355]