[{"data":1,"prerenderedAt":3161},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-fastify":529,"-integrate-frameworks-fastify-surround":3156},[4,29,76,122,304,436,495],{"title":5,"path":6,"stem":7,"children":8,"page":28},"Start","\u002Fstart","1.start",[9,13,18,23],{"title":10,"path":11,"stem":12},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction",{"title":14,"path":15,"stem":16,"icon":17},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":19,"path":20,"stem":21,"icon":22},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":24,"path":25,"stem":26,"icon":27},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":30,"path":31,"stem":32,"children":33,"page":28},"Learn","\u002Flearn","2.learn",[34,38,43,48,53,58,62,67,72],{"title":35,"path":36,"stem":37},"Learn evlog","\u002Flearn\u002Foverview","2.learn\u002F0.overview",{"title":39,"path":40,"stem":41,"icon":42},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":44,"path":45,"stem":46,"icon":47},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":49,"path":50,"stem":51,"icon":52},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":54,"path":55,"stem":56,"icon":57},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":59,"path":60,"stem":61},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling",{"title":63,"path":64,"stem":65,"icon":66},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":68,"path":69,"stem":70,"icon":71},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":73,"path":74,"stem":75},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs",{"title":77,"path":78,"stem":79,"children":80,"page":28},"CLI","\u002Fcli","3.cli",[81,85,90,95,99,103,108,113,118],{"title":82,"path":83,"stem":84},"evlog CLI","\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":86,"path":87,"stem":88,"icon":89},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":91,"path":92,"stem":93,"icon":94},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":96,"path":97,"stem":98},"Map rules","\u002Fcli\u002Frules","3.cli\u002F3.rules",{"title":100,"path":101,"stem":102},"Map scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121},"evlog agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents",{"title":123,"path":124,"stem":125,"children":126,"page":28},"Integrate","\u002Fintegrate","4.integrate",[127,132,216],{"title":128,"path":129,"stem":130,"icon":131},"Overview","\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":133,"path":134,"stem":135,"children":136,"page":28},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[137,141,171,196],{"title":128,"path":138,"stem":139,"icon":140},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview","i-lucide-list",{"title":142,"path":143,"stem":144,"children":145,"page":28},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[146,151,156,161,166],{"title":147,"path":148,"stem":149,"icon":150},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":152,"path":153,"stem":154,"icon":155},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":157,"path":158,"stem":159,"icon":160},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":162,"path":163,"stem":164,"icon":165},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":167,"path":168,"stem":169,"icon":170},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":172,"path":173,"stem":174,"children":175,"page":28},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[176,181,186,191],{"title":177,"path":178,"stem":179,"icon":180},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":182,"path":183,"stem":184,"icon":185},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":187,"path":188,"stem":189,"icon":190},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":192,"path":193,"stem":194,"icon":195},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":197,"path":198,"stem":199,"children":200,"page":28},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[201,206,211],{"title":202,"path":203,"stem":204,"icon":205},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":207,"path":208,"stem":209,"icon":210},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":212,"path":213,"stem":214,"icon":215},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":217,"path":218,"stem":219,"children":220,"page":28},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[221,225,230,235,240,245,250,255,260,265,270,275,280,285,289,294,299],{"title":128,"path":222,"stem":223,"icon":224},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":226,"path":227,"stem":228,"icon":229},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":231,"path":232,"stem":233,"icon":234},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":236,"path":237,"stem":238,"icon":239},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":241,"path":242,"stem":243,"icon":244},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":246,"path":247,"stem":248,"icon":249},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":251,"path":252,"stem":253,"icon":254},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":256,"path":257,"stem":258,"icon":259},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":261,"path":262,"stem":263,"icon":264},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":266,"path":267,"stem":268,"icon":269},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":271,"path":272,"stem":273,"icon":274},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":276,"path":277,"stem":278,"icon":279},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":281,"path":282,"stem":283,"icon":284},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":286,"path":287,"stem":288,"icon":71},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":290,"path":291,"stem":292,"icon":293},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":295,"path":296,"stem":297,"icon":298},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":300,"path":301,"stem":302,"icon":303},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":305,"path":306,"stem":307,"children":308,"page":28},"Use Cases","\u002Fuse-cases","5.use-cases",[309,312,317,346,374,407,427,432],{"title":305,"path":310,"stem":311},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":313,"path":314,"stem":315,"icon":316},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":318,"icon":319,"path":320,"stem":321,"children":322,"page":28},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[323,326,331,336,341],{"title":128,"path":324,"stem":325,"icon":140},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":327,"path":328,"stem":329,"icon":330},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":332,"path":333,"stem":334,"icon":335},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":337,"path":338,"stem":339,"icon":340},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":342,"path":343,"stem":344,"icon":345},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":347,"icon":348,"path":349,"stem":350,"children":351,"page":28},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[352,355,360,365,369],{"title":128,"path":353,"stem":354,"icon":140},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":356,"path":357,"stem":358,"icon":359},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":361,"path":362,"stem":363,"icon":364},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":366,"path":367,"stem":368,"icon":316},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":370,"path":371,"stem":372,"icon":373},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":28},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[380,383,388,393,398,402],{"title":128,"path":381,"stem":382,"icon":140},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":384,"path":385,"stem":386,"icon":387},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":389,"path":390,"stem":391,"icon":392},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":394,"path":395,"stem":396,"icon":397},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":399,"path":400,"stem":401,"icon":376},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":403,"path":404,"stem":405,"icon":406},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes","i-lucide-book-open",{"title":342,"icon":373,"path":408,"stem":409,"children":410,"page":28},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[411,414,419,423],{"title":128,"path":412,"stem":413,"icon":140},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":415,"path":416,"stem":417,"icon":418},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":420,"path":421,"stem":422},"Telemetry Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest",{"title":424,"path":425,"stem":426,"icon":406},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":428,"path":429,"stem":430,"icon":431},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":433,"path":434,"stem":435},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve",{"title":437,"path":438,"stem":439,"children":440,"page":28},"Extend","\u002Fextend","6.extend",[441,445,450,455,459,464,468,472,476,481,486,491],{"title":128,"path":442,"stem":443,"icon":444},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":446,"path":447,"stem":448,"icon":449},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":451,"path":452,"stem":453,"icon":454},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":456,"path":457,"stem":458,"icon":449},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":460,"path":461,"stem":462,"icon":463},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":403,"path":465,"stem":466,"icon":467},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":469,"path":470,"stem":471},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":473,"path":474,"stem":475,"icon":431},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":477,"path":478,"stem":479,"icon":480},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling","i-lucide-filter",{"title":482,"path":483,"stem":484,"icon":485},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":487,"path":488,"stem":489,"icon":490},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":492,"path":493,"stem":494},"Drain Pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline",{"title":424,"path":496,"stem":497,"children":498,"page":28},"\u002Freference","7.reference",[499,504,507,512,516,521,525],{"title":500,"path":501,"stem":502,"icon":503},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":370,"path":505,"stem":506,"icon":373},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":508,"path":509,"stem":510,"icon":511},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":513,"path":514,"stem":515,"icon":376},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":517,"path":518,"stem":519,"icon":520},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":522,"path":523,"stem":524,"icon":431},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":526,"path":527,"stem":528},"Log cost","\u002Freference\u002Fcost","7.reference\u002F7.cost",{"id":530,"title":266,"body":531,"description":3146,"extension":3147,"links":3148,"meta":3152,"navigation":3153,"path":267,"seo":3154,"stem":268,"__hash__":3155},"docs\u002F4.integrate\u002Fframeworks\u002F09.fastify.md",{"type":532,"value":533,"toc":3127},"minimark",[534,551,598,602,607,687,691,1027,1051,1060,1063,1066,1368,1371,1435,1438,1444,1627,1745,1760,1767,1782,1955,1959,1980,2303,2306,2353,2356,2366,2370,2373,2540,2544,2551,2744,2756,2760,2766,2870,2874,2884,3027,3031,3072,3080,3090,3094,3123],[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":269},"[\"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,24],"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":511},"info",[1032,1033,1034],"strong",{},"Using Vite?"," The ",[588,1037,1038,1041],{"href":509},[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,44],{"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,1781],{},[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","After emit"," in Wide events.",[611,1783,1785],{"className":693,"code":1784,"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,1786,1787,1809,1813,1850,1886,1899,1928,1935,1949],{"__ignoreMap":617},[621,1788,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807],{"class":623,"line":624},[621,1790,704],{"class":703},[621,1792,729],{"class":714},[621,1794,634],{"class":707},[621,1796,911],{"class":714},[621,1798,1458],{"class":707},[621,1800,735],{"class":714},[621,1802,738],{"class":703},[621,1804,715],{"class":714},[621,1806,541],{"class":630},[621,1808,721],{"class":714},[621,1810,1811],{"class":623,"line":724},[621,1812,771],{"emptyLinePlaceholder":770},[621,1814,1815,1817,1819,1822,1824,1826,1829,1831,1833,1835,1837,1839,1841,1844,1846,1848],{"class":623,"line":748},[621,1816,894],{"class":707},[621,1818,877],{"class":714},[621,1820,1821],{"class":777},"post",[621,1823,781],{"class":707},[621,1825,809],{"class":714},[621,1827,1828],{"class":630},"\u002Forders",[621,1830,809],{"class":714},[621,1832,911],{"class":714},[621,1834,914],{"class":832},[621,1836,917],{"class":714},[621,1838,921],{"class":920},[621,1840,911],{"class":714},[621,1842,1843],{"class":920}," reply",[621,1845,924],{"class":714},[621,1847,927],{"class":832},[621,1849,930],{"class":714},[621,1851,1852,1854,1856,1858,1860,1863,1866,1868,1870,1873,1875,1877,1879,1882,1884],{"class":623,"line":767},[621,1853,936],{"class":707},[621,1855,877],{"class":714},[621,1857,941],{"class":707},[621,1859,877],{"class":714},[621,1861,1862],{"class":777},"fork",[621,1864,1865],{"class":714},"!",[621,1867,781],{"class":790},[621,1869,809],{"class":714},[621,1871,1872],{"class":630},"fulfill",[621,1874,809],{"class":714},[621,1876,911],{"class":714},[621,1878,914],{"class":832},[621,1880,1881],{"class":714}," ()",[621,1883,927],{"class":832},[621,1885,930],{"class":714},[621,1887,1888,1891,1893,1895,1897],{"class":623,"line":774},[621,1889,1890],{"class":832},"    const",[621,1892,1504],{"class":707},[621,1894,1116],{"class":714},[621,1896,1458],{"class":777},[621,1898,1511],{"class":790},[621,1900,1901,1904,1906,1908,1910,1912,1915,1917,1919,1922,1924,1926],{"class":623,"line":787},[621,1902,1903],{"class":707},"    log",[621,1905,877],{"class":714},[621,1907,946],{"class":777},[621,1909,781],{"class":790},[621,1911,847],{"class":714},[621,1913,1914],{"class":790}," step",[621,1916,794],{"class":714},[621,1918,715],{"class":714},[621,1920,1921],{"class":630},"ok",[621,1923,809],{"class":714},[621,1925,735],{"class":714},[621,1927,821],{"class":790},[621,1929,1930,1933],{"class":623,"line":815},[621,1931,1932],{"class":714},"  }",[621,1934,821],{"class":790},[621,1936,1937,1939,1941,1943,1945,1947],{"class":623,"line":824},[621,1938,972],{"class":703},[621,1940,729],{"class":714},[621,1942,977],{"class":790},[621,1944,794],{"class":714},[621,1946,982],{"class":855},[621,1948,985],{"class":714},[621,1950,1951,1953],{"class":623,"line":829},[621,1952,818],{"class":714},[621,1954,821],{"class":707},[599,1956,1958],{"id":1957},"error-handling","Error Handling",[535,1960,1440,1961,1964,1965,1968,1969,1972,1973,1976,1977,794],{},[539,1962,1963],{},"createError"," for structured errors with ",[539,1966,1967],{},"why",", ",[539,1970,1971],{},"fix",", and ",[539,1974,1975],{},"link"," fields. Fastify captures thrown errors via ",[539,1978,1979],{},"onError",[611,1981,1983],{"className":693,"code":1982,"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,1984,1985,2009,2013,2049,2060,2077,2089,2105,2121,2137,2143,2149,2153,2184,2201,2231,2246,2260,2274,2289,2296],{"__ignoreMap":617},[621,1986,1987,1989,1991,1994,1996,1999,2001,2003,2005,2007],{"class":623,"line":624},[621,1988,704],{"class":703},[621,1990,729],{"class":714},[621,1992,1993],{"class":707}," createError",[621,1995,911],{"class":714},[621,1997,1998],{"class":707}," parseError",[621,2000,735],{"class":714},[621,2002,738],{"class":703},[621,2004,715],{"class":714},[621,2006,743],{"class":630},[621,2008,721],{"class":714},[621,2010,2011],{"class":623,"line":724},[621,2012,771],{"emptyLinePlaceholder":770},[621,2014,2015,2017,2019,2021,2023,2025,2028,2030,2032,2034,2036,2039,2041,2043,2045,2047],{"class":623,"line":748},[621,2016,894],{"class":707},[621,2018,877],{"class":714},[621,2020,899],{"class":777},[621,2022,781],{"class":707},[621,2024,809],{"class":714},[621,2026,2027],{"class":630},"\u002Fcheckout",[621,2029,809],{"class":714},[621,2031,911],{"class":714},[621,2033,914],{"class":832},[621,2035,917],{"class":714},[621,2037,2038],{"class":920},"_request",[621,2040,911],{"class":714},[621,2042,1843],{"class":920},[621,2044,924],{"class":714},[621,2046,927],{"class":832},[621,2048,930],{"class":714},[621,2050,2051,2054,2056,2058],{"class":623,"line":767},[621,2052,2053],{"class":703},"  throw",[621,2055,1993],{"class":777},[621,2057,781],{"class":790},[621,2059,784],{"class":714},[621,2061,2062,2065,2067,2069,2072,2074],{"class":623,"line":774},[621,2063,2064],{"class":790},"    message",[621,2066,794],{"class":714},[621,2068,715],{"class":714},[621,2070,2071],{"class":630},"Payment failed",[621,2073,809],{"class":714},[621,2075,2076],{"class":714},",\n",[621,2078,2079,2082,2084,2087],{"class":623,"line":787},[621,2080,2081],{"class":790},"    status",[621,2083,794],{"class":714},[621,2085,2086],{"class":1021}," 402",[621,2088,2076],{"class":714},[621,2090,2091,2094,2096,2098,2101,2103],{"class":623,"line":815},[621,2092,2093],{"class":790},"    why",[621,2095,794],{"class":714},[621,2097,715],{"class":714},[621,2099,2100],{"class":630},"Card declined by issuer",[621,2102,809],{"class":714},[621,2104,2076],{"class":714},[621,2106,2107,2110,2112,2114,2117,2119],{"class":623,"line":824},[621,2108,2109],{"class":790},"    fix",[621,2111,794],{"class":714},[621,2113,715],{"class":714},[621,2115,2116],{"class":630},"Try a different payment method",[621,2118,809],{"class":714},[621,2120,2076],{"class":714},[621,2122,2123,2126,2128,2130,2133,2135],{"class":623,"line":829},[621,2124,2125],{"class":790},"    link",[621,2127,794],{"class":714},[621,2129,715],{"class":714},[621,2131,2132],{"class":630},"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined",[621,2134,809],{"class":714},[621,2136,2076],{"class":714},[621,2138,2139,2141],{"class":623,"line":863},[621,2140,1932],{"class":714},[621,2142,821],{"class":790},[621,2144,2145,2147],{"class":623,"line":868},[621,2146,818],{"class":714},[621,2148,821],{"class":707},[621,2150,2151],{"class":623,"line":886},[621,2152,771],{"emptyLinePlaceholder":770},[621,2154,2155,2157,2159,2162,2164,2166,2169,2171,2174,2176,2178,2180,2182],{"class":623,"line":891},[621,2156,894],{"class":707},[621,2158,877],{"class":714},[621,2160,2161],{"class":777},"setErrorHandler",[621,2163,781],{"class":707},[621,2165,781],{"class":714},[621,2167,2168],{"class":920},"error",[621,2170,911],{"class":714},[621,2172,2173],{"class":920}," _request",[621,2175,911],{"class":714},[621,2177,1843],{"class":920},[621,2179,924],{"class":714},[621,2181,927],{"class":832},[621,2183,930],{"class":714},[621,2185,2186,2188,2191,2193,2195,2197,2199],{"class":623,"line":933},[621,2187,1106],{"class":832},[621,2189,2190],{"class":707}," parsed",[621,2192,1116],{"class":714},[621,2194,1998],{"class":777},[621,2196,781],{"class":790},[621,2198,2168],{"class":707},[621,2200,821],{"class":790},[621,2202,2203,2206,2208,2211,2213,2216,2218,2220,2222,2224,2227,2229],{"class":623,"line":969},[621,2204,2205],{"class":707},"  reply",[621,2207,877],{"class":714},[621,2209,2210],{"class":777},"status",[621,2212,781],{"class":790},[621,2214,2215],{"class":707},"parsed",[621,2217,877],{"class":714},[621,2219,2210],{"class":707},[621,2221,924],{"class":790},[621,2223,877],{"class":714},[621,2225,2226],{"class":777},"send",[621,2228,781],{"class":790},[621,2230,784],{"class":714},[621,2232,2233,2235,2237,2239,2241,2244],{"class":623,"line":988},[621,2234,2064],{"class":790},[621,2236,794],{"class":714},[621,2238,2190],{"class":707},[621,2240,877],{"class":714},[621,2242,2243],{"class":707},"message",[621,2245,2076],{"class":714},[621,2247,2248,2250,2252,2254,2256,2258],{"class":623,"line":995},[621,2249,2093],{"class":790},[621,2251,794],{"class":714},[621,2253,2190],{"class":707},[621,2255,877],{"class":714},[621,2257,1967],{"class":707},[621,2259,2076],{"class":714},[621,2261,2262,2264,2266,2268,2270,2272],{"class":623,"line":1000},[621,2263,2109],{"class":790},[621,2265,794],{"class":714},[621,2267,2190],{"class":707},[621,2269,877],{"class":714},[621,2271,1971],{"class":707},[621,2273,2076],{"class":714},[621,2275,2277,2279,2281,2283,2285,2287],{"class":623,"line":2276},19,[621,2278,2125],{"class":790},[621,2280,794],{"class":714},[621,2282,2190],{"class":707},[621,2284,877],{"class":714},[621,2286,1975],{"class":707},[621,2288,2076],{"class":714},[621,2290,2292,2294],{"class":623,"line":2291},20,[621,2293,1932],{"class":714},[621,2295,821],{"class":790},[621,2297,2299,2301],{"class":623,"line":2298},21,[621,2300,818],{"class":714},[621,2302,821],{"class":707},[535,2304,2305],{},"The error is captured and logged with both the custom context and structured error fields:",[611,2307,2309],{"className":613,"code":2308,"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,2310,2311,2322,2344],{"__ignoreMap":617},[621,2312,2313,2316,2319],{"class":623,"line":624},[621,2314,2315],{"class":627},"14:58:20",[621,2317,2318],{"class":630}," ERROR",[621,2320,2321],{"class":707}," [my-api] GET \u002Fcheckout 402 in 3ms\n",[621,2323,2324,2326,2329,2332,2335,2338,2341],{"class":623,"line":724},[621,2325,1392],{"class":627},[621,2327,2328],{"class":630}," error:",[621,2330,2331],{"class":630}," name=EvlogError",[621,2333,2334],{"class":630}," message=Payment",[621,2336,2337],{"class":630}," failed",[621,2339,2340],{"class":630}," status=",[621,2342,2343],{"class":1021},"402\n",[621,2345,2346,2348,2350],{"class":623,"line":748},[621,2347,1428],{"class":627},[621,2349,1431],{"class":630},[621,2351,2352],{"class":630}," 880a50ac-...\n",[599,2354,500],{"id":2355},"configuration",[535,2357,2358,2359,2362,2363,2365],{},"See the ",[588,2360,2361],{"href":501},"Configuration reference"," for all available options (",[539,2364,778],{},", middleware options, sampling, silent mode, etc.).",[599,2367,2369],{"id":2368},"drain-enrichers","Drain & Enrichers",[535,2371,2372],{},"Configure drain adapters and enrichers directly in the plugin options:",[611,2374,2376],{"className":693,"code":2375,"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,2377,2378,2398,2418,2422,2435,2439,2456,2470,2488,2499,2529,2534],{"__ignoreMap":617},[621,2379,2380,2382,2384,2387,2389,2391,2393,2396],{"class":623,"line":624},[621,2381,704],{"class":703},[621,2383,729],{"class":714},[621,2385,2386],{"class":707}," createAxiomDrain",[621,2388,735],{"class":714},[621,2390,738],{"class":703},[621,2392,715],{"class":714},[621,2394,2395],{"class":630},"evlog\u002Faxiom",[621,2397,721],{"class":714},[621,2399,2400,2402,2404,2407,2409,2411,2413,2416],{"class":623,"line":724},[621,2401,704],{"class":703},[621,2403,729],{"class":714},[621,2405,2406],{"class":707}," createUserAgentEnricher",[621,2408,735],{"class":714},[621,2410,738],{"class":703},[621,2412,715],{"class":714},[621,2414,2415],{"class":630},"evlog\u002Fenrichers",[621,2417,721],{"class":714},[621,2419,2420],{"class":623,"line":748},[621,2421,771],{"emptyLinePlaceholder":770},[621,2423,2424,2426,2429,2431,2433],{"class":623,"line":767},[621,2425,833],{"class":832},[621,2427,2428],{"class":707}," userAgent ",[621,2430,839],{"class":714},[621,2432,2406],{"class":777},[621,2434,1511],{"class":707},[621,2436,2437],{"class":623,"line":774},[621,2438,771],{"emptyLinePlaceholder":770},[621,2440,2441,2443,2445,2447,2449,2452,2454],{"class":623,"line":787},[621,2442,871],{"class":703},[621,2444,874],{"class":707},[621,2446,877],{"class":714},[621,2448,880],{"class":777},[621,2450,2451],{"class":707},"(evlog",[621,2453,911],{"class":714},[621,2455,930],{"class":714},[621,2457,2458,2461,2463,2465,2468],{"class":623,"line":815},[621,2459,2460],{"class":790},"  drain",[621,2462,794],{"class":714},[621,2464,2386],{"class":777},[621,2466,2467],{"class":707},"()",[621,2469,2076],{"class":714},[621,2471,2472,2475,2477,2479,2482,2484,2486],{"class":623,"line":824},[621,2473,2474],{"class":777},"  enrich",[621,2476,794],{"class":714},[621,2478,917],{"class":714},[621,2480,2481],{"class":920},"ctx",[621,2483,924],{"class":714},[621,2485,927],{"class":832},[621,2487,930],{"class":714},[621,2489,2490,2493,2495,2497],{"class":623,"line":829},[621,2491,2492],{"class":777},"    userAgent",[621,2494,781],{"class":790},[621,2496,2481],{"class":707},[621,2498,821],{"class":790},[621,2500,2501,2504,2506,2509,2511,2514,2516,2519,2521,2524,2526],{"class":623,"line":863},[621,2502,2503],{"class":707},"    ctx",[621,2505,877],{"class":714},[621,2507,2508],{"class":707},"event",[621,2510,877],{"class":714},[621,2512,2513],{"class":707},"region",[621,2515,1116],{"class":714},[621,2517,2518],{"class":707}," process",[621,2520,877],{"class":714},[621,2522,2523],{"class":707},"env",[621,2525,877],{"class":714},[621,2527,2528],{"class":707},"FLY_REGION\n",[621,2530,2531],{"class":623,"line":868},[621,2532,2533],{"class":714},"  },\n",[621,2535,2536,2538],{"class":623,"line":886},[621,2537,818],{"class":714},[621,2539,821],{"class":707},[603,2541,2543],{"id":2542},"pipeline-batching-retry","Pipeline (Batching & Retry)",[535,2545,2546,2547,2550],{},"For production, wrap your adapter with ",[539,2548,2549],{},"createDrainPipeline"," to batch events and retry on failure:",[611,2552,2554],{"className":693,"code":2553,"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,2555,2556,2578,2596,2616,2620,2644,2673,2692,2698,2718,2722],{"__ignoreMap":617},[621,2557,2558,2560,2563,2565,2568,2570,2572,2574,2576],{"class":623,"line":624},[621,2559,704],{"class":703},[621,2561,2562],{"class":703}," type",[621,2564,729],{"class":714},[621,2566,2567],{"class":707}," DrainContext",[621,2569,735],{"class":714},[621,2571,738],{"class":703},[621,2573,715],{"class":714},[621,2575,743],{"class":630},[621,2577,721],{"class":714},[621,2579,2580,2582,2584,2586,2588,2590,2592,2594],{"class":623,"line":724},[621,2581,704],{"class":703},[621,2583,729],{"class":714},[621,2585,2386],{"class":707},[621,2587,735],{"class":714},[621,2589,738],{"class":703},[621,2591,715],{"class":714},[621,2593,2395],{"class":630},[621,2595,721],{"class":714},[621,2597,2598,2600,2602,2605,2607,2609,2611,2614],{"class":623,"line":748},[621,2599,704],{"class":703},[621,2601,729],{"class":714},[621,2603,2604],{"class":707}," createDrainPipeline",[621,2606,735],{"class":714},[621,2608,738],{"class":703},[621,2610,715],{"class":714},[621,2612,2613],{"class":630},"evlog\u002Fpipeline",[621,2615,721],{"class":714},[621,2617,2618],{"class":623,"line":767},[621,2619,771],{"emptyLinePlaceholder":770},[621,2621,2622,2624,2627,2629,2631,2634,2637,2640,2642],{"class":623,"line":774},[621,2623,833],{"class":832},[621,2625,2626],{"class":707}," pipeline ",[621,2628,839],{"class":714},[621,2630,2604],{"class":777},[621,2632,2633],{"class":714},"\u003C",[621,2635,2636],{"class":627},"DrainContext",[621,2638,2639],{"class":714},">",[621,2641,781],{"class":707},[621,2643,784],{"class":714},[621,2645,2646,2649,2651,2653,2656,2658,2661,2663,2666,2668,2671],{"class":623,"line":787},[621,2647,2648],{"class":790},"  batch",[621,2650,794],{"class":714},[621,2652,729],{"class":714},[621,2654,2655],{"class":790}," size",[621,2657,794],{"class":714},[621,2659,2660],{"class":1021}," 50",[621,2662,911],{"class":714},[621,2664,2665],{"class":790}," intervalMs",[621,2667,794],{"class":714},[621,2669,2670],{"class":1021}," 5000",[621,2672,812],{"class":714},[621,2674,2675,2678,2680,2682,2685,2687,2690],{"class":623,"line":815},[621,2676,2677],{"class":790},"  retry",[621,2679,794],{"class":714},[621,2681,729],{"class":714},[621,2683,2684],{"class":790}," maxAttempts",[621,2686,794],{"class":714},[621,2688,2689],{"class":1021}," 3",[621,2691,812],{"class":714},[621,2693,2694,2696],{"class":623,"line":824},[621,2695,818],{"class":714},[621,2697,821],{"class":707},[621,2699,2700,2702,2705,2707,2710,2712,2715],{"class":623,"line":829},[621,2701,833],{"class":832},[621,2703,2704],{"class":707}," drain ",[621,2706,839],{"class":714},[621,2708,2709],{"class":777}," pipeline",[621,2711,781],{"class":707},[621,2713,2714],{"class":777},"createAxiomDrain",[621,2716,2717],{"class":707},"())\n",[621,2719,2720],{"class":623,"line":863},[621,2721,771],{"emptyLinePlaceholder":770},[621,2723,2724,2726,2728,2730,2732,2734,2736,2738,2740,2742],{"class":623,"line":868},[621,2725,871],{"class":703},[621,2727,874],{"class":707},[621,2729,877],{"class":714},[621,2731,880],{"class":777},[621,2733,2451],{"class":707},[621,2735,911],{"class":714},[621,2737,729],{"class":714},[621,2739,2704],{"class":707},[621,2741,818],{"class":714},[621,2743,821],{"class":707},[1028,2745,2747,2748,2751,2752,2755],{"color":1030,"icon":2746},"i-lucide-info","Call ",[539,2749,2750],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[588,2753,2754],{"href":493},"Pipeline docs"," for all options.",[599,2757,2759],{"id":2758},"tail-sampling","Tail Sampling",[535,2761,1440,2762,2765],{},[539,2763,2764],{},"keep"," to force-retain specific events regardless of head sampling:",[611,2767,2769],{"className":693,"code":2768,"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,2770,2771,2787,2799,2816,2860,2864],{"__ignoreMap":617},[621,2772,2773,2775,2777,2779,2781,2783,2785],{"class":623,"line":624},[621,2774,871],{"class":703},[621,2776,874],{"class":707},[621,2778,877],{"class":714},[621,2780,880],{"class":777},[621,2782,2451],{"class":707},[621,2784,911],{"class":714},[621,2786,930],{"class":714},[621,2788,2789,2791,2793,2795,2797],{"class":623,"line":724},[621,2790,2460],{"class":790},[621,2792,794],{"class":714},[621,2794,2386],{"class":777},[621,2796,2467],{"class":707},[621,2798,2076],{"class":714},[621,2800,2801,2804,2806,2808,2810,2812,2814],{"class":623,"line":748},[621,2802,2803],{"class":777},"  keep",[621,2805,794],{"class":714},[621,2807,917],{"class":714},[621,2809,2481],{"class":920},[621,2811,924],{"class":714},[621,2813,927],{"class":832},[621,2815,930],{"class":714},[621,2817,2818,2821,2823,2825,2827,2830,2833,2836,2838,2840,2843,2846,2848,2850,2852,2855,2857],{"class":623,"line":767},[621,2819,2820],{"class":703},"    if",[621,2822,917],{"class":790},[621,2824,2481],{"class":707},[621,2826,877],{"class":714},[621,2828,2829],{"class":707},"duration",[621,2831,2832],{"class":714}," &&",[621,2834,2835],{"class":707}," ctx",[621,2837,877],{"class":714},[621,2839,2829],{"class":707},[621,2841,2842],{"class":714}," >",[621,2844,2845],{"class":1021}," 2000",[621,2847,1337],{"class":790},[621,2849,2481],{"class":707},[621,2851,877],{"class":714},[621,2853,2854],{"class":707},"shouldKeep",[621,2856,1116],{"class":714},[621,2858,2859],{"class":855}," true\n",[621,2861,2862],{"class":623,"line":774},[621,2863,2533],{"class":714},[621,2865,2866,2868],{"class":623,"line":787},[621,2867,818],{"class":714},[621,2869,821],{"class":707},[599,2871,2873],{"id":2872},"route-filtering","Route Filtering",[535,2875,2876,2877,546,2880,2883],{},"Control which routes are logged with ",[539,2878,2879],{},"include",[539,2881,2882],{},"exclude"," patterns:",[611,2885,2887],{"className":693,"code":2886,"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,2888,2889,2905,2927,2955,2964,2991,3017,3021],{"__ignoreMap":617},[621,2890,2891,2893,2895,2897,2899,2901,2903],{"class":623,"line":624},[621,2892,871],{"class":703},[621,2894,874],{"class":707},[621,2896,877],{"class":714},[621,2898,880],{"class":777},[621,2900,2451],{"class":707},[621,2902,911],{"class":714},[621,2904,930],{"class":714},[621,2906,2907,2910,2912,2915,2917,2920,2922,2925],{"class":623,"line":724},[621,2908,2909],{"class":790},"  include",[621,2911,794],{"class":714},[621,2913,2914],{"class":707}," [",[621,2916,809],{"class":714},[621,2918,2919],{"class":630},"\u002Fapi\u002F**",[621,2921,809],{"class":714},[621,2923,2924],{"class":707},"]",[621,2926,2076],{"class":714},[621,2928,2929,2932,2934,2936,2938,2941,2943,2945,2947,2949,2951,2953],{"class":623,"line":748},[621,2930,2931],{"class":790},"  exclude",[621,2933,794],{"class":714},[621,2935,2914],{"class":707},[621,2937,809],{"class":714},[621,2939,2940],{"class":630},"\u002F_internal\u002F**",[621,2942,809],{"class":714},[621,2944,911],{"class":714},[621,2946,715],{"class":714},[621,2948,906],{"class":630},[621,2950,809],{"class":714},[621,2952,2924],{"class":707},[621,2954,2076],{"class":714},[621,2956,2957,2960,2962],{"class":623,"line":767},[621,2958,2959],{"class":790},"  routes",[621,2961,794],{"class":714},[621,2963,930],{"class":714},[621,2965,2966,2969,2972,2974,2976,2978,2980,2982,2984,2987,2989],{"class":623,"line":774},[621,2967,2968],{"class":714},"    '",[621,2970,2971],{"class":790},"\u002Fapi\u002Fauth\u002F**",[621,2973,809],{"class":714},[621,2975,794],{"class":714},[621,2977,729],{"class":714},[621,2979,799],{"class":790},[621,2981,794],{"class":714},[621,2983,715],{"class":714},[621,2985,2986],{"class":630},"auth-service",[621,2988,809],{"class":714},[621,2990,812],{"class":714},[621,2992,2993,2995,2998,3000,3002,3004,3006,3008,3010,3013,3015],{"class":623,"line":787},[621,2994,2968],{"class":714},[621,2996,2997],{"class":790},"\u002Fapi\u002Fpayment\u002F**",[621,2999,809],{"class":714},[621,3001,794],{"class":714},[621,3003,729],{"class":714},[621,3005,799],{"class":790},[621,3007,794],{"class":714},[621,3009,715],{"class":714},[621,3011,3012],{"class":630},"payment-service",[621,3014,809],{"class":714},[621,3016,812],{"class":714},[621,3018,3019],{"class":623,"line":815},[621,3020,2533],{"class":714},[621,3022,3023,3025],{"class":623,"line":824},[621,3024,818],{"class":714},[621,3026,821],{"class":707},[599,3028,3030],{"id":3029},"run-locally","Run Locally",[611,3032,3035],{"className":613,"code":3033,"filename":3034,"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,3036,3037,3048,3056,3063],{"__ignoreMap":617},[621,3038,3039,3042,3045],{"class":623,"line":624},[621,3040,3041],{"class":627},"git",[621,3043,3044],{"class":630}," clone",[621,3046,3047],{"class":630}," https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\n",[621,3049,3050,3053],{"class":623,"line":724},[621,3051,3052],{"class":777},"cd",[621,3054,3055],{"class":630}," evlog\n",[621,3057,3058,3060],{"class":623,"line":748},[621,3059,615],{"class":627},[621,3061,3062],{"class":630}," install\n",[621,3064,3065,3067,3070],{"class":623,"line":767},[621,3066,615],{"class":627},[621,3068,3069],{"class":630}," example",[621,3071,637],{"class":630},[535,3073,3074,3075,3079],{},"Open ",[588,3076,3077],{"href":3077,"rel":3078},"http:\u002F\u002Flocalhost:3000",[592]," to explore the interactive test UI.",[3081,3082,3083],"card-group",{},[3084,3085,3089],"card",{"icon":3086,"title":3087,"to":3088},"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,3091,3093],{"id":3092},"next-steps","Next Steps",[560,3095,3096,3101,3106,3111],{},[563,3097,3098,3100],{},[588,3099,44],{"href":45},": Design comprehensive events with context layering",[563,3102,3103,3105],{},[588,3104,133],{"href":138},": Send logs to Axiom, Sentry, PostHog, and more",[563,3107,3108,3110],{},[588,3109,59],{"href":60},": Control log volume with head and tail sampling",[563,3112,3113,3115,3116,1968,3118,1972,3120,3122],{},[588,3114,49],{"href":50},": Throw errors with ",[539,3117,1967],{},[539,3119,1971],{},[539,3121,1975],{}," fields",[3124,3125,3126],"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":3128},[3129,3133,3134,3135,3137,3138,3139,3142,3143,3144,3145],{"id":601,"depth":724,"text":24,"children":3130},[3131,3132],{"id":605,"depth":748,"text":606},{"id":689,"depth":748,"text":690},{"id":1062,"depth":724,"text":44},{"id":1437,"depth":724,"text":549},{"id":1762,"depth":724,"text":3136},"Background work (log.fork)",{"id":1957,"depth":724,"text":1958},{"id":2355,"depth":724,"text":500},{"id":2368,"depth":724,"text":2369,"children":3140},[3141],{"id":2542,"depth":748,"text":2543},{"id":2758,"depth":724,"text":2759},{"id":2872,"depth":724,"text":2873},{"id":3029,"depth":724,"text":3030},{"id":3092,"depth":724,"text":3093},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Fastify applications.","md",[3149],{"label":3087,"icon":3086,"to":3088,"color":3150,"variant":3151},"neutral","subtle",{},{"title":266,"icon":269},{"title":266,"description":3146},"3tBeJsuKjapjEF0RUlYqPIaCX3sGuxgnVTZhZr3f1us",[3157,3159],{"title":261,"path":262,"stem":263,"description":3158,"icon":264,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Hono applications.",{"title":271,"path":272,"stem":273,"description":3160,"icon":274,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Elysia applications.",1786800759560]