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