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