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