[{"data":1,"prerenderedAt":1457},["ShallowReactive",2],{"navigation_docs":3,"-compare-opentelemetry":607,"-compare-opentelemetry-surround":1452},[4,35,85,143,323,484,543,582],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Start","\u002Fstart","1.start",[9,14,19,24,29],{"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",{"title":30,"path":31,"stem":32,"icon":33},"Choose your logger","\u002Fstart\u002Ftypescript-logging-library","1.start\u002F5.typescript-logging-library","i-lucide-file-code",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Learn","\u002Flearn","2.learn",[40,45,50,55,60,65,70,75,80],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":66,"path":67,"stem":68,"icon":69},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"icon":79},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":81,"path":82,"stem":83,"icon":84},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":86,"path":87,"stem":88,"children":89,"page":34},"CLI","\u002Fcli","3.cli",[90,93,98,103,108,113,118,123,128,133,138],{"title":41,"path":91,"stem":92,"icon":49},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":94,"path":95,"stem":96,"icon":97},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":99,"path":100,"stem":101,"icon":102},"logs","\u002Fcli\u002Flogs","3.cli\u002F10.logs","i-lucide-scroll-text",{"title":104,"path":105,"stem":106,"icon":107},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":109,"path":110,"stem":111,"icon":112},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":114,"path":115,"stem":116,"icon":117},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":119,"path":120,"stem":121,"icon":122},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":124,"path":125,"stem":126,"icon":127},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":129,"path":130,"stem":131,"icon":132},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":134,"path":135,"stem":136,"icon":137},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":139,"path":140,"stem":141,"icon":142},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":144,"path":145,"stem":146,"children":147,"page":34},"Integrate","\u002Fintegrate","4.integrate",[148,152,235],{"title":41,"path":149,"stem":150,"icon":151},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":153,"path":154,"stem":155,"children":156,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[157,160,190,215],{"title":41,"path":158,"stem":159,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":161,"path":162,"stem":163,"children":164,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[165,170,175,180,185],{"title":166,"path":167,"stem":168,"icon":169},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":171,"path":172,"stem":173,"icon":174},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":176,"path":177,"stem":178,"icon":179},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":181,"path":182,"stem":183,"icon":184},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":186,"path":187,"stem":188,"icon":189},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":191,"path":192,"stem":193,"children":194,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[195,200,205,210],{"title":196,"path":197,"stem":198,"icon":199},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":201,"path":202,"stem":203,"icon":204},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":206,"path":207,"stem":208,"icon":209},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":211,"path":212,"stem":213,"icon":214},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":216,"path":217,"stem":218,"children":219,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[220,225,230],{"title":221,"path":222,"stem":223,"icon":224},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":226,"path":227,"stem":228,"icon":229},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":231,"path":232,"stem":233,"icon":234},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":236,"path":237,"stem":238,"children":239,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[240,244,249,254,259,264,269,274,279,284,289,294,299,304,308,313,318],{"title":41,"path":241,"stem":242,"icon":243},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":245,"path":246,"stem":247,"icon":248},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":250,"path":251,"stem":252,"icon":253},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":255,"path":256,"stem":257,"icon":258},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":260,"path":261,"stem":262,"icon":263},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":265,"path":266,"stem":267,"icon":268},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":270,"path":271,"stem":272,"icon":273},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":275,"path":276,"stem":277,"icon":278},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":280,"path":281,"stem":282,"icon":283},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":285,"path":286,"stem":287,"icon":288},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":290,"path":291,"stem":292,"icon":293},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":295,"path":296,"stem":297,"icon":298},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":300,"path":301,"stem":302,"icon":303},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":305,"path":306,"stem":307,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":309,"path":310,"stem":311,"icon":312},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":314,"path":315,"stem":316,"icon":317},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":319,"path":320,"stem":321,"icon":322},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":324,"path":325,"stem":326,"children":327,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[328,331,336,364,391,423,444,449,454,458],{"title":41,"path":329,"stem":330,"icon":112},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":332,"path":333,"stem":334,"icon":335},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":337,"icon":338,"path":339,"stem":340,"children":341,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[342,345,350,355,360],{"title":41,"path":343,"stem":344,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":346,"path":347,"stem":348,"icon":349},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":351,"path":352,"stem":353,"icon":354},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":356,"path":357,"stem":358,"icon":359},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":361,"path":362,"stem":363,"icon":142},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":365,"icon":366,"path":367,"stem":368,"children":369,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[370,373,378,383,387],{"title":41,"path":371,"stem":372,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":374,"path":375,"stem":376,"icon":377},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":379,"path":380,"stem":381,"icon":382},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":384,"path":385,"stem":386,"icon":335},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":388,"path":389,"stem":390,"icon":117},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":392,"icon":393,"path":394,"stem":395,"children":396,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[397,400,405,410,415,419],{"title":41,"path":398,"stem":399,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":401,"path":402,"stem":403,"icon":404},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":406,"path":407,"stem":408,"icon":409},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":411,"path":412,"stem":413,"icon":414},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":416,"path":417,"stem":418,"icon":393},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":420,"path":421,"stem":422,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":361,"icon":117,"path":424,"stem":425,"children":426,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[427,430,435,440],{"title":41,"path":428,"stem":429,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":431,"path":432,"stem":433,"icon":434},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":436,"path":437,"stem":438,"icon":439},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":441,"path":442,"stem":443,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":445,"path":446,"stem":447,"icon":448},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":450,"path":451,"stem":452,"icon":453},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":455,"path":456,"stem":457,"icon":439},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":459,"icon":460,"path":461,"stem":462,"children":463,"page":34},"Signals","i-lucide-scan-search","\u002Fuse-cases\u002Fsignals","5.use-cases\u002F7.signals",[464,467,472,477,480],{"title":41,"path":465,"stem":466,"icon":44},"\u002Fuse-cases\u002Fsignals\u002Foverview","5.use-cases\u002F7.signals\u002F01.overview",{"title":468,"path":469,"stem":470,"icon":471},"What You Can Ask","\u002Fuse-cases\u002Fsignals\u002Fask","5.use-cases\u002F7.signals\u002F02.ask","i-lucide-message-circle-question",{"title":473,"path":474,"stem":475,"icon":476},"What It Costs","\u002Fuse-cases\u002Fsignals\u002Fcost","5.use-cases\u002F7.signals\u002F03.cost","i-lucide-coins",{"title":441,"path":478,"stem":479,"icon":84},"\u002Fuse-cases\u002Fsignals\u002Freference","5.use-cases\u002F7.signals\u002F04.reference",{"title":420,"path":481,"stem":482,"icon":483},"\u002Fuse-cases\u002Fsignals\u002Frecipes","5.use-cases\u002F7.signals\u002F05.recipes","i-lucide-lightbulb",{"title":485,"path":486,"stem":487,"children":488,"page":34},"Extend","\u002Fextend","6.extend",[489,493,498,503,507,512,516,520,524,528,533,538],{"title":41,"path":490,"stem":491,"icon":492},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":494,"path":495,"stem":496,"icon":497},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":499,"path":500,"stem":501,"icon":502},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":504,"path":505,"stem":506,"icon":497},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":508,"path":509,"stem":510,"icon":511},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":420,"path":513,"stem":514,"icon":515},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":517,"path":518,"stem":519,"icon":492},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":521,"path":522,"stem":523,"icon":448},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":525,"path":526,"stem":527,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":529,"path":530,"stem":531,"icon":532},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":534,"path":535,"stem":536,"icon":537},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":539,"path":540,"stem":541,"icon":542},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":441,"path":544,"stem":545,"children":546,"page":34},"\u002Freference","7.reference",[547,551,556,559,564,568,573,577],{"title":41,"path":548,"stem":549,"icon":550},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":552,"path":553,"stem":554,"icon":555},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":388,"path":557,"stem":558,"icon":117},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":560,"path":561,"stem":562,"icon":563},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":565,"path":566,"stem":567,"icon":393},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":569,"path":570,"stem":571,"icon":572},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":574,"path":575,"stem":576,"icon":448},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":578,"path":579,"stem":580,"icon":581},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"title":583,"path":584,"stem":585,"children":586,"page":34},"Compare","\u002Fcompare","8.compare",[587,591,595,599,603],{"title":588,"path":589,"stem":590,"icon":572},"evlog vs Pino","\u002Fcompare\u002Fpino","8.compare\u002F1.pino",{"title":592,"path":593,"stem":594,"icon":209},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","8.compare\u002F2.opentelemetry",{"title":596,"path":597,"stem":598,"icon":572},"evlog vs LogTape","\u002Fcompare\u002Flogtape","8.compare\u002F3.logtape",{"title":600,"path":601,"stem":602,"icon":572},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","8.compare\u002F4.winston",{"title":604,"path":605,"stem":606,"icon":572},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","8.compare\u002F5.consola",{"id":608,"title":609,"body":610,"description":1439,"extension":1440,"links":1441,"meta":1448,"navigation":1449,"path":593,"seo":1450,"stem":594,"__hash__":1451},"docs\u002F8.compare\u002F2.opentelemetry.md","evlog and OpenTelemetry: connect logs to traces",{"type":611,"value":612,"toc":1433},"minimark",[613,617,622,634,645,649,658,661,688,695,1179,1182,1198,1208,1211,1333,1340,1344,1360,1382,1396,1400,1409,1415,1429],[614,615,616],"p",{},"You already export traces to an OpenTelemetry Collector and want application logs beside them. evlog can build those log events and send them through OTLP. Keep the tracing instrumentation: evlog does not create spans or metrics.",[618,619,621],"h2",{"id":620},"assign-each-layer-a-job","Assign each layer a job",[623,624,631],"pre",{"className":625,"code":627,"filename":628,"language":629,"meta":630},[626],"language-text","Application fields -> evlog event -> OTLP HTTP \u002Fv1\u002Flogs -> Collector -> backend\nActive OTel span  -> traceId + spanId on the event\nOTel SDK         -> spans and metrics                -> Collector -> backend\n","Data flow","text","",[632,633,627],"code",{"__ignoreMap":630},[614,635,636,637,644],{},"The SDK instruments operations, the Collector receives and processes telemetry, and the backend provides storage, queries, and alerts. ",[638,639,643],"a",{"href":640,"rel":641},"https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002F",[642],"nofollow","OpenTelemetry's documentation"," describes those responsibilities. Semantic conventions standardize shared attributes, while custom application attributes remain valid.",[618,646,648],{"id":647},"export-an-event-with-the-active-span-context","Export an event with the active span context",[614,650,651,652,657],{},"This example assumes a Node.js application with its OpenTelemetry SDK and context manager already initialized. The function must run inside an active span to attach trace context. Follow the ",[638,653,656],{"href":654,"rel":655},"https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Flanguages\u002Fjs\u002Finstrumentation\u002F",[642],"JavaScript instrumentation guide"," if tracing is not configured yet.",[614,659,660],{},"Install the logging package and OTel API in that application:",[623,662,667],{"className":663,"code":664,"filename":665,"language":666,"meta":630,"style":630},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install evlog @opentelemetry\u002Fapi\n","Terminal","bash",[632,668,669],{"__ignoreMap":630},[670,671,674,678,682,685],"span",{"class":672,"line":673},"line",1,[670,675,677],{"class":676},"sBMFI","npm",[670,679,681],{"class":680},"sfazB"," install",[670,683,684],{"class":680}," evlog",[670,686,687],{"class":680}," @opentelemetry\u002Fapi\n",[614,689,690,691,694],{},"The function writes a completed checkout event as local JSON and exports it through OTLP. It awaits delivery explicitly: a failed export is logged with the drain name and does not throw, so the request path never breaks. Use ",[632,692,693],{},"drain.raw({ event })"," when the caller must observe failures. Do not also register this drain globally, which would export the event twice.",[623,696,701],{"className":697,"code":698,"filename":699,"language":700,"meta":630,"style":630},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { isSpanContextValid, trace } from '@opentelemetry\u002Fapi'\nimport { createLogger, initLogger } from 'evlog'\nimport { createOTLPDrain } from 'evlog\u002Fotlp'\n\ninitLogger({ env: { service: 'checkout' }, pretty: false })\nconst drain = createOTLPDrain({ recordShape: 'compact' })\n\nexport async function recordCheckout(orderId: string, outcome: 'paid' | 'declined') {\n  const log = createLogger({ orderId, outcome })\n  const spanContext = trace.getActiveSpan()?.spanContext()\n  if (spanContext && isSpanContextValid(spanContext)) {\n    log.set({ traceId: spanContext.traceId, spanId: spanContext.spanId })\n  }\n  if (outcome === 'declined') log.error(new Error('Payment declined'))\n  const event = log.emit()\n  if (event) await drain({ event })\n}\n","checkout-log.ts","typescript",[632,702,703,738,764,785,792,844,879,884,940,969,999,1025,1070,1076,1126,1145,1173],{"__ignoreMap":630},[670,704,705,709,713,717,720,723,726,729,732,735],{"class":672,"line":673},[670,706,708],{"class":707},"s7zQu","import",[670,710,712],{"class":711},"sMK4o"," {",[670,714,716],{"class":715},"sTEyZ"," isSpanContextValid",[670,718,719],{"class":711},",",[670,721,722],{"class":715}," trace",[670,724,725],{"class":711}," }",[670,727,728],{"class":707}," from",[670,730,731],{"class":711}," '",[670,733,734],{"class":680},"@opentelemetry\u002Fapi",[670,736,737],{"class":711},"'\n",[670,739,741,743,745,748,750,753,755,757,759,762],{"class":672,"line":740},2,[670,742,708],{"class":707},[670,744,712],{"class":711},[670,746,747],{"class":715}," createLogger",[670,749,719],{"class":711},[670,751,752],{"class":715}," initLogger",[670,754,725],{"class":711},[670,756,728],{"class":707},[670,758,731],{"class":711},[670,760,761],{"class":680},"evlog",[670,763,737],{"class":711},[670,765,767,769,771,774,776,778,780,783],{"class":672,"line":766},3,[670,768,708],{"class":707},[670,770,712],{"class":711},[670,772,773],{"class":715}," createOTLPDrain",[670,775,725],{"class":711},[670,777,728],{"class":707},[670,779,731],{"class":711},[670,781,782],{"class":680},"evlog\u002Fotlp",[670,784,737],{"class":711},[670,786,788],{"class":672,"line":787},4,[670,789,791],{"emptyLinePlaceholder":790},true,"\n",[670,793,795,799,802,805,809,812,814,817,819,821,824,827,830,833,835,839,841],{"class":672,"line":794},5,[670,796,798],{"class":797},"s2Zo4","initLogger",[670,800,801],{"class":715},"(",[670,803,804],{"class":711},"{",[670,806,808],{"class":807},"swJcz"," env",[670,810,811],{"class":711},":",[670,813,712],{"class":711},[670,815,816],{"class":807}," service",[670,818,811],{"class":711},[670,820,731],{"class":711},[670,822,823],{"class":680},"checkout",[670,825,826],{"class":711},"'",[670,828,829],{"class":711}," },",[670,831,832],{"class":807}," pretty",[670,834,811],{"class":711},[670,836,838],{"class":837},"sfNiH"," false",[670,840,725],{"class":711},[670,842,843],{"class":715},")\n",[670,845,847,851,854,857,859,861,863,866,868,870,873,875,877],{"class":672,"line":846},6,[670,848,850],{"class":849},"spNyl","const",[670,852,853],{"class":715}," drain ",[670,855,856],{"class":711},"=",[670,858,773],{"class":797},[670,860,801],{"class":715},[670,862,804],{"class":711},[670,864,865],{"class":807}," recordShape",[670,867,811],{"class":711},[670,869,731],{"class":711},[670,871,872],{"class":680},"compact",[670,874,826],{"class":711},[670,876,725],{"class":711},[670,878,843],{"class":715},[670,880,882],{"class":672,"line":881},7,[670,883,791],{"emptyLinePlaceholder":790},[670,885,887,890,893,896,899,901,905,907,910,912,915,917,919,922,924,927,929,932,934,937],{"class":672,"line":886},8,[670,888,889],{"class":707},"export",[670,891,892],{"class":849}," async",[670,894,895],{"class":849}," function",[670,897,898],{"class":797}," recordCheckout",[670,900,801],{"class":711},[670,902,904],{"class":903},"sHdIc","orderId",[670,906,811],{"class":711},[670,908,909],{"class":676}," string",[670,911,719],{"class":711},[670,913,914],{"class":903}," outcome",[670,916,811],{"class":711},[670,918,731],{"class":711},[670,920,921],{"class":680},"paid",[670,923,826],{"class":711},[670,925,926],{"class":711}," |",[670,928,731],{"class":711},[670,930,931],{"class":680},"declined",[670,933,826],{"class":711},[670,935,936],{"class":711},")",[670,938,939],{"class":711}," {\n",[670,941,943,946,949,952,954,956,958,961,963,965,967],{"class":672,"line":942},9,[670,944,945],{"class":849},"  const",[670,947,948],{"class":715}," log",[670,950,951],{"class":711}," =",[670,953,747],{"class":797},[670,955,801],{"class":807},[670,957,804],{"class":711},[670,959,960],{"class":715}," orderId",[670,962,719],{"class":711},[670,964,914],{"class":715},[670,966,725],{"class":711},[670,968,843],{"class":807},[670,970,972,974,977,979,981,984,987,990,993,996],{"class":672,"line":971},10,[670,973,945],{"class":849},[670,975,976],{"class":715}," spanContext",[670,978,951],{"class":711},[670,980,722],{"class":715},[670,982,983],{"class":711},".",[670,985,986],{"class":797},"getActiveSpan",[670,988,989],{"class":807},"()",[670,991,992],{"class":711},"?.",[670,994,995],{"class":797},"spanContext",[670,997,998],{"class":807},"()\n",[670,1000,1002,1005,1008,1010,1013,1015,1017,1019,1022],{"class":672,"line":1001},11,[670,1003,1004],{"class":707},"  if",[670,1006,1007],{"class":807}," (",[670,1009,995],{"class":715},[670,1011,1012],{"class":711}," &&",[670,1014,716],{"class":797},[670,1016,801],{"class":807},[670,1018,995],{"class":715},[670,1020,1021],{"class":807},")) ",[670,1023,1024],{"class":711},"{\n",[670,1026,1028,1031,1033,1036,1038,1040,1043,1045,1047,1049,1052,1054,1057,1059,1061,1063,1066,1068],{"class":672,"line":1027},12,[670,1029,1030],{"class":715},"    log",[670,1032,983],{"class":711},[670,1034,1035],{"class":797},"set",[670,1037,801],{"class":807},[670,1039,804],{"class":711},[670,1041,1042],{"class":807}," traceId",[670,1044,811],{"class":711},[670,1046,976],{"class":715},[670,1048,983],{"class":711},[670,1050,1051],{"class":715},"traceId",[670,1053,719],{"class":711},[670,1055,1056],{"class":807}," spanId",[670,1058,811],{"class":711},[670,1060,976],{"class":715},[670,1062,983],{"class":711},[670,1064,1065],{"class":715},"spanId",[670,1067,725],{"class":711},[670,1069,843],{"class":807},[670,1071,1073],{"class":672,"line":1072},13,[670,1074,1075],{"class":711},"  }\n",[670,1077,1079,1081,1083,1086,1089,1091,1093,1095,1098,1101,1103,1106,1108,1111,1114,1116,1118,1121,1123],{"class":672,"line":1078},14,[670,1080,1004],{"class":707},[670,1082,1007],{"class":807},[670,1084,1085],{"class":715},"outcome",[670,1087,1088],{"class":711}," ===",[670,1090,731],{"class":711},[670,1092,931],{"class":680},[670,1094,826],{"class":711},[670,1096,1097],{"class":807},") ",[670,1099,1100],{"class":715},"log",[670,1102,983],{"class":711},[670,1104,1105],{"class":797},"error",[670,1107,801],{"class":807},[670,1109,1110],{"class":711},"new",[670,1112,1113],{"class":797}," Error",[670,1115,801],{"class":807},[670,1117,826],{"class":711},[670,1119,1120],{"class":680},"Payment declined",[670,1122,826],{"class":711},[670,1124,1125],{"class":807},"))\n",[670,1127,1129,1131,1134,1136,1138,1140,1143],{"class":672,"line":1128},15,[670,1130,945],{"class":849},[670,1132,1133],{"class":715}," event",[670,1135,951],{"class":711},[670,1137,948],{"class":715},[670,1139,983],{"class":711},[670,1141,1142],{"class":797},"emit",[670,1144,998],{"class":807},[670,1146,1148,1150,1152,1155,1157,1160,1163,1165,1167,1169,1171],{"class":672,"line":1147},16,[670,1149,1004],{"class":707},[670,1151,1007],{"class":807},[670,1153,1154],{"class":715},"event",[670,1156,1097],{"class":807},[670,1158,1159],{"class":707},"await",[670,1161,1162],{"class":797}," drain",[670,1164,801],{"class":807},[670,1166,804],{"class":711},[670,1168,1133],{"class":715},[670,1170,725],{"class":711},[670,1172,843],{"class":807},[670,1174,1176],{"class":672,"line":1175},17,[670,1177,1178],{"class":711},"}\n",[614,1180,1181],{},"Configure the OTLP HTTP base endpoint in the application's environment. If it is unset, the drain logs a missing-endpoint warning and skips delivery:",[623,1183,1186],{"className":663,"code":1184,"filename":1185,"language":666,"meta":630,"style":630},"OTLP_ENDPOINT=http:\u002F\u002Flocalhost:4318\n",".env",[632,1187,1188],{"__ignoreMap":630},[670,1189,1190,1193,1195],{"class":672,"line":673},[670,1191,1192],{"class":715},"OTLP_ENDPOINT",[670,1194,856],{"class":711},[670,1196,1197],{"class":680},"http:\u002F\u002Flocalhost:4318\n",[614,1199,1200,1201,1204,1205,1207],{},"Load that file through your application or Node's ",[632,1202,1203],{},"--env-file"," option. A file named ",[632,1206,1185],{}," alone does not configure an arbitrary Node.js process.",[614,1209,1210],{},"For a local Collector, enable a logs pipeline. This minimal configuration prints received records through the debug exporter:",[623,1212,1217],{"className":1213,"code":1214,"filename":1215,"language":1216,"meta":630,"style":630},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","receivers:\n  otlp:\n    protocols:\n      http:\n        endpoint: 127.0.0.1:4318\nexporters:\n  debug:\n    verbosity: detailed\nservice:\n  pipelines:\n    logs:\n      receivers: [otlp]\n      exporters: [debug]\n","otel-collector.yaml","yaml",[632,1218,1219,1227,1234,1241,1248,1258,1265,1272,1282,1289,1296,1303,1319],{"__ignoreMap":630},[670,1220,1221,1224],{"class":672,"line":673},[670,1222,1223],{"class":807},"receivers",[670,1225,1226],{"class":711},":\n",[670,1228,1229,1232],{"class":672,"line":740},[670,1230,1231],{"class":807},"  otlp",[670,1233,1226],{"class":711},[670,1235,1236,1239],{"class":672,"line":766},[670,1237,1238],{"class":807},"    protocols",[670,1240,1226],{"class":711},[670,1242,1243,1246],{"class":672,"line":787},[670,1244,1245],{"class":807},"      http",[670,1247,1226],{"class":711},[670,1249,1250,1253,1255],{"class":672,"line":794},[670,1251,1252],{"class":807},"        endpoint",[670,1254,811],{"class":711},[670,1256,1257],{"class":680}," 127.0.0.1:4318\n",[670,1259,1260,1263],{"class":672,"line":846},[670,1261,1262],{"class":807},"exporters",[670,1264,1226],{"class":711},[670,1266,1267,1270],{"class":672,"line":881},[670,1268,1269],{"class":807},"  debug",[670,1271,1226],{"class":711},[670,1273,1274,1277,1279],{"class":672,"line":886},[670,1275,1276],{"class":807},"    verbosity",[670,1278,811],{"class":711},[670,1280,1281],{"class":680}," detailed\n",[670,1283,1284,1287],{"class":672,"line":942},[670,1285,1286],{"class":807},"service",[670,1288,1226],{"class":711},[670,1290,1291,1294],{"class":672,"line":971},[670,1292,1293],{"class":807},"  pipelines",[670,1295,1226],{"class":711},[670,1297,1298,1301],{"class":672,"line":1001},[670,1299,1300],{"class":807},"    logs",[670,1302,1226],{"class":711},[670,1304,1305,1308,1310,1313,1316],{"class":672,"line":1027},[670,1306,1307],{"class":807},"      receivers",[670,1309,811],{"class":711},[670,1311,1312],{"class":711}," [",[670,1314,1315],{"class":680},"otlp",[670,1317,1318],{"class":711},"]\n",[670,1320,1321,1324,1326,1328,1331],{"class":672,"line":1072},[670,1322,1323],{"class":807},"      exporters",[670,1325,811],{"class":711},[670,1327,1312],{"class":711},[670,1329,1330],{"class":680},"debug",[670,1332,1318],{"class":711},[614,1334,1335,1336,1339],{},"Run the Collector with this configuration and call ",[632,1337,1338],{},"recordCheckout('order-123', 'paid')"," inside an instrumented operation. A Collector in a separate container needs a reachable receiver address and port mapping. Use the loopback configuration above for processes on the same host.",[618,1341,1343],{"id":1342},"verify-correlation-before-shipping","Verify correlation before shipping",[614,1345,1346,1347,1349,1350,1353,1354,1356,1357,1359],{},"Find the record by ",[632,1348,904],{},". Its resource should contain ",[632,1351,1352],{},"service.name: checkout",", and its ",[632,1355,1051],{}," and ",[632,1358,1065],{}," should match the active span from the same operation. Without a valid active span the event still exports, but those identifiers are absent.",[614,1361,1362,1363,1366,1367,1370,1371,1356,1374,1377,1378,1381],{},"The drain maps level and timestamp to OTLP severity and time fields. With ",[632,1364,1365],{},"recordShape: 'compact'",", nested application fields become dotted attributes. The default JSON shape uses a serialized event body and sends nested attribute values as OTLP key-value lists. Set ",[632,1368,1369],{},"semanticConventions: true"," to add OpenTelemetry attribute names such as ",[632,1372,1373],{},"http.request.method",[632,1375,1376],{},"gen_ai.usage.input_tokens"," next to the evlog ones. The ",[638,1379,1380],{"href":207},"OTLP adapter reference"," describes the mapping and delivery options.",[614,1383,1384,1385,1388,1389,1392,1393,1395],{},"The TraceContext enricher reads an incoming ",[632,1386,1387],{},"traceparent"," and records its span identifier as ",[632,1390,1391],{},"parentSpanId",", because that span belongs to the caller. It never sets ",[632,1394,1065],{},". Use the active SDK context as above to link the event to the server span.",[618,1397,1399],{"id":1398},"decide-what-to-sample-and-how-to-deliver","Decide what to sample and how to deliver",[614,1401,1402,1403,1408],{},"Event sampling in evlog and ",[638,1404,1407],{"href":1405,"rel":1406},"https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fconcepts\u002Fsampling\u002F",[642],"trace sampling in OpenTelemetry"," operate on different signals. A retained log can reference a trace that your tracing policy discarded. Coordinate the policies before relying on navigation from every error log to a stored trace.",[614,1410,1411,1412,1414],{},"This example waits for the network request. For production handler integration, configure the drain pipeline and the framework's background-delivery lifecycle deliberately. The adapter supports OTLP HTTP logs, not a gRPC-only endpoint. Serialization, batching, retries, and export add costs that event-construction microbenchmarks do not measure. See ",[638,1413,388],{"href":557}," for those boundaries.",[614,1416,1417,1418,1421,1422,1425,1426,983],{},"If you use Nitro, the integration can invoke ",[632,1419,1420],{},"createOTLPDrain()"," through ",[632,1423,1424],{},"evlog:drain"," after evlog is enabled. Keep your existing OTel instrumentation in either setup. For a library-to-library decision, continue with ",[638,1427,1428],{"href":570},"evlog vs other loggers",[1430,1431,1432],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}",{"title":630,"searchDepth":740,"depth":740,"links":1434},[1435,1436,1437,1438],{"id":620,"depth":740,"text":621},{"id":647,"depth":740,"text":648},{"id":1342,"depth":740,"text":1343},{"id":1398,"depth":740,"text":1399},"Send evlog events to an OpenTelemetry Collector over OTLP HTTP and attach the active trace context without replacing tracing.","md",[1442,1446],{"label":1443,"icon":209,"to":207,"color":1444,"variant":1445},"OTLP Adapter","neutral","subtle",{"label":1447,"icon":117,"to":557,"color":1444,"variant":1445},"Performance Benchmarks",{},{"title":592,"icon":209},{"title":609,"description":1439},"X62ApeMFhfvXJr5hjjq9R2aC1Uwmyj9GTdDyOKe8K10",[1453,1455],{"title":588,"path":589,"stem":590,"description":1454,"icon":572,"children":-1},"Compare request context, serializers, transports, and migration costs before moving a Pino application to evlog.",{"title":596,"path":597,"stem":598,"description":1456,"icon":572,"children":-1},"Compare LogTape categories, application-owned configuration, context propagation, and testing with evlog request events.",1791114779822]