[{"data":1,"prerenderedAt":2937},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-hybrid-loki":598,"-integrate-adapters-hybrid-loki-surround":2932},[4,35,85,138,318,453,475,534,573],{"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],{"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},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":104,"path":105,"stem":106,"icon":107},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":109,"path":110,"stem":111,"icon":112},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":114,"path":115,"stem":116,"icon":117},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":119,"path":120,"stem":121,"icon":122},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":124,"path":125,"stem":126,"icon":127},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":129,"path":130,"stem":131,"icon":132},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":134,"path":135,"stem":136,"icon":137},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":139,"path":140,"stem":141,"children":142,"page":34},"Integrate","\u002Fintegrate","4.integrate",[143,147,230],{"title":41,"path":144,"stem":145,"icon":146},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":148,"path":149,"stem":150,"children":151,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[152,155,185,210],{"title":41,"path":153,"stem":154,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":156,"path":157,"stem":158,"children":159,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[160,165,170,175,180],{"title":161,"path":162,"stem":163,"icon":164},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":166,"path":167,"stem":168,"icon":169},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":171,"path":172,"stem":173,"icon":174},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":176,"path":177,"stem":178,"icon":179},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":181,"path":182,"stem":183,"icon":184},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":186,"path":187,"stem":188,"children":189,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[190,195,200,205],{"title":191,"path":192,"stem":193,"icon":194},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":196,"path":197,"stem":198,"icon":199},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":201,"path":202,"stem":203,"icon":204},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":206,"path":207,"stem":208,"icon":209},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":211,"path":212,"stem":213,"children":214,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[215,220,225],{"title":216,"path":217,"stem":218,"icon":219},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":221,"path":222,"stem":223,"icon":224},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":226,"path":227,"stem":228,"icon":229},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":231,"path":232,"stem":233,"children":234,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[235,239,244,249,254,259,264,269,274,279,284,289,294,299,303,308,313],{"title":41,"path":236,"stem":237,"icon":238},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":240,"path":241,"stem":242,"icon":243},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":245,"path":246,"stem":247,"icon":248},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":250,"path":251,"stem":252,"icon":253},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":255,"path":256,"stem":257,"icon":258},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":260,"path":261,"stem":262,"icon":263},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":265,"path":266,"stem":267,"icon":268},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":270,"path":271,"stem":272,"icon":273},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":275,"path":276,"stem":277,"icon":278},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":280,"path":281,"stem":282,"icon":283},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":285,"path":286,"stem":287,"icon":288},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":290,"path":291,"stem":292,"icon":293},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":295,"path":296,"stem":297,"icon":298},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":300,"path":301,"stem":302,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":304,"path":305,"stem":306,"icon":307},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":309,"path":310,"stem":311,"icon":312},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":314,"path":315,"stem":316,"icon":317},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[323,326,331,359,386,418,439,444,449],{"title":41,"path":324,"stem":325,"icon":107},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":327,"path":328,"stem":329,"icon":330},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[337,340,345,350,355],{"title":41,"path":338,"stem":339,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":341,"path":342,"stem":343,"icon":344},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":346,"path":347,"stem":348,"icon":349},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":351,"path":352,"stem":353,"icon":354},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":356,"path":357,"stem":358,"icon":137},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[365,368,373,378,382],{"title":41,"path":366,"stem":367,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":369,"path":370,"stem":371,"icon":372},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":374,"path":375,"stem":376,"icon":377},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":379,"path":380,"stem":381,"icon":330},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":383,"path":384,"stem":385,"icon":112},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":387,"icon":388,"path":389,"stem":390,"children":391,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[392,395,400,405,410,414],{"title":41,"path":393,"stem":394,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":404},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":406,"path":407,"stem":408,"icon":409},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":411,"path":412,"stem":413,"icon":388},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":415,"path":416,"stem":417,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":356,"icon":112,"path":419,"stem":420,"children":421,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[422,425,430,435],{"title":41,"path":423,"stem":424,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":426,"path":427,"stem":428,"icon":429},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":431,"path":432,"stem":433,"icon":434},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":436,"path":437,"stem":438,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":440,"path":441,"stem":442,"icon":443},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":445,"path":446,"stem":447,"icon":448},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":450,"path":451,"stem":452,"icon":434},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":454,"path":455,"stem":456,"children":457,"page":34},"Libraries","\u002Flibraries","6.libraries",[458,462,467,470],{"title":41,"path":459,"stem":460,"icon":461},"\u002Flibraries\u002Foverview","6.libraries\u002F0.overview","i-lucide-package",{"title":463,"path":464,"stem":465,"icon":466},"Emitting Events","\u002Flibraries\u002Femitting","6.libraries\u002F1.emitting","i-lucide-radio",{"title":56,"path":468,"stem":469,"icon":59},"\u002Flibraries\u002Ferrors","6.libraries\u002F2.errors",{"title":471,"path":472,"stem":473,"icon":474},"Testing","\u002Flibraries\u002Ftesting","6.libraries\u002F3.testing","i-lucide-flask-conical",{"title":476,"path":477,"stem":478,"children":479,"page":34},"Extend","\u002Fextend","7.extend",[480,484,489,494,498,503,507,511,515,519,524,529],{"title":41,"path":481,"stem":482,"icon":483},"\u002Fextend\u002Foverview","7.extend\u002F0.overview","i-lucide-blocks",{"title":485,"path":486,"stem":487,"icon":488},"Stream","\u002Fextend\u002Fstream","7.extend\u002F1.stream","i-lucide-radio-tower",{"title":490,"path":491,"stem":492,"icon":493},"Custom framework","\u002Fextend\u002Fcustom-framework","7.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":495,"path":496,"stem":497,"icon":488},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","7.extend\u002F11.diagnostics-channel",{"title":499,"path":500,"stem":501,"icon":502},"FS reader","\u002Fextend\u002Ffs-reader","7.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":504,"stem":505,"icon":506},"\u002Fextend\u002Fconsumer-recipes","7.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":508,"path":509,"stem":510,"icon":483},"Plugins","\u002Fextend\u002Fplugins","7.extend\u002F4.plugins",{"title":512,"path":513,"stem":514,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","7.extend\u002F5.custom-enrichers",{"title":516,"path":517,"stem":518,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","7.extend\u002F6.tail-sampling",{"title":520,"path":521,"stem":522,"icon":523},"Identity headers","\u002Fextend\u002Fidentity-headers","7.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":525,"path":526,"stem":527,"icon":528},"Custom drains","\u002Fextend\u002Fcustom-drains","7.extend\u002F8.custom-drains","i-lucide-share-2",{"title":530,"path":531,"stem":532,"icon":533},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","7.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":535,"stem":536,"children":537,"page":34},"\u002Freference","8.reference",[538,542,547,550,555,559,564,568],{"title":41,"path":539,"stem":540,"icon":541},"\u002Freference\u002Foverview","8.reference\u002F0.overview","i-lucide-book-marked",{"title":543,"path":544,"stem":545,"icon":546},"Configuration","\u002Freference\u002Fconfiguration","8.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":548,"stem":549,"icon":112},"\u002Freference\u002Fperformance","8.reference\u002F2.performance",{"title":551,"path":552,"stem":553,"icon":554},"Vite Plugin","\u002Freference\u002Fvite-plugin","8.reference\u002F3.vite-plugin","i-custom-vite",{"title":556,"path":557,"stem":558,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","8.reference\u002F4.best-practices",{"title":560,"path":561,"stem":562,"icon":563},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","8.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":565,"path":566,"stem":567,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","8.reference\u002F6.agent-skills",{"title":569,"path":570,"stem":571,"icon":572},"Cost","\u002Freference\u002Fcost","8.reference\u002F7.cost","i-lucide-receipt",{"title":574,"path":575,"stem":576,"children":577,"page":34},"Compare","\u002Fcompare","9.compare",[578,582,586,590,594],{"title":579,"path":580,"stem":581,"icon":563},"evlog vs Pino","\u002Fcompare\u002Fpino","9.compare\u002F1.pino",{"title":583,"path":584,"stem":585,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","9.compare\u002F2.opentelemetry",{"title":587,"path":588,"stem":589,"icon":563},"evlog vs LogTape","\u002Fcompare\u002Flogtape","9.compare\u002F3.logtape",{"title":591,"path":592,"stem":593,"icon":563},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","9.compare\u002F4.winston",{"title":595,"path":596,"stem":597,"icon":563},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","9.compare\u002F5.consola",{"id":599,"title":600,"body":601,"description":2915,"extension":2916,"links":2917,"meta":2928,"navigation":2929,"path":192,"seo":2930,"stem":193,"__hash__":2931},"docs\u002F4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki.md","Grafana Loki Adapter",{"type":602,"value":603,"toc":2894},"minimark",[604,615,650,700,704,707,750,753,760,1550,1553,1558,1646,1650,1653,1674,1677,1842,1846,1849,1853,1856,1886,1903,1912,1963,1986,1995,1999,2006,2077,2109,2128,2132,2206,2211,2215,2227,2230,2328,2331,2335,2340,2362,2377,2392,2407,2411,2414,2608,2611,2615,2618,2677,2687,2696,2700,2718,2732,2745,2755,2759,2762,2850,2862,2866,2890],[605,606,607,608,614],"p",{},"The Loki adapter pushes wide events to ",[609,610,191],"a",{"href":611,"rel":612},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Floki\u002Flatest\u002F",[613],"nofollow"," via its push API. It works with a self-hosted single-tenant instance, a multi-tenant deployment, and Grafana Cloud.",[605,616,617,618,622,623,627,628,631,632,635,636,627,639,627,642,645,646,649],{},"Each event is pushed as a ",[619,620,621],"strong",{},"JSON log line"," under a small, low-cardinality label set. That distinction matters in Loki: labels are indexed and billed by cardinality, while the log line is searched at query time. evlog labels only ",[624,625,626],"code",{},"service",", ",[624,629,630],{},"environment",", and ",[624,633,634],{},"level"," by default, and leaves everything else (",[624,637,638],{},"requestId",[624,640,641],{},"path",[624,643,644],{},"user",", your custom fields) in the line, queryable with ",[624,647,648],{},"| json",".",[651,652,655,658,688],"prompt",{":actions":653,"description":654,"icon":194},"[\"copy\",\"cursor\",\"claude\"]","Add the Grafana Loki drain adapter",[605,656,657],{},"Add the Grafana Loki drain adapter to send evlog wide events to Loki.",[659,660,661,665,668,671,674,682,685],"ol",{},[662,663,664],"li",{},"Identify which framework I'm using and follow its evlog integration pattern",[662,666,667],{},"Install evlog if not already installed",[662,669,670],{},"Import createLokiDrain from 'evlog\u002Floki'",[662,672,673],{},"Wire createLokiDrain() into my framework's drain configuration",[662,675,676,677,681],{},"Set LOKI_ENDPOINT (e.g. ",[609,678,679],{"href":679,"rel":680},"http:\u002F\u002Flocalhost:3100",[613],"). For Grafana Cloud also set LOKI_USER (instance ID) and LOKI_API_KEY",[662,683,684],{},"For multi-tenant self-hosted Loki, set LOKI_TENANT_ID instead",[662,686,687],{},"Test by triggering a request and querying {service=\"my-app\"} in Grafana",[605,689,690,691,695,696],{},"Adapter docs: ",[609,692,693],{"href":693,"rel":694},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki",[613],"\nFramework setup: ",[609,697,698],{"href":698,"rel":699},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Foverview",[613],[701,702,20],"h2",{"id":703},"installation",[605,705,706],{},"The Loki adapter comes bundled with evlog:",[708,709,715],"pre",{"className":710,"code":711,"filename":712,"language":713,"meta":714,"style":714},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createLokiDrain } from 'evlog\u002Floki'\n","src\u002Findex.ts","typescript","",[624,716,717],{"__ignoreMap":714},[718,719,722,726,730,734,737,740,743,747],"span",{"class":720,"line":721},"line",1,[718,723,725],{"class":724},"s7zQu","import",[718,727,729],{"class":728},"sMK4o"," {",[718,731,733],{"class":732},"sTEyZ"," createLokiDrain",[718,735,736],{"class":728}," }",[718,738,739],{"class":724}," from",[718,741,742],{"class":728}," '",[718,744,746],{"class":745},"sfazB","evlog\u002Floki",[718,748,749],{"class":728},"'\n",[701,751,25],{"id":752},"quick-start",[605,754,755,756,759],{},"Set ",[624,757,758],{},"LOKI_ENDPOINT"," and wire the drain into your framework.",[761,762,763,877,999,1103,1210,1315,1452],"code-group",{},[708,764,767],{"className":710,"code":765,"filename":766,"language":713,"meta":714,"style":714},"\u002F\u002F server\u002Fplugins\u002Fevlog.ts\nimport { createLokiDrain } from 'evlog\u002Floki'\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', createLokiDrain())\n})\n","Nuxt \u002F Nitro",[624,768,769,775,794,801,833,868],{"__ignoreMap":714},[718,770,771],{"class":720,"line":721},[718,772,774],{"class":773},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog.ts\n",[718,776,778,780,782,784,786,788,790,792],{"class":720,"line":777},2,[718,779,725],{"class":724},[718,781,729],{"class":728},[718,783,733],{"class":732},[718,785,736],{"class":728},[718,787,739],{"class":724},[718,789,742],{"class":728},[718,791,746],{"class":745},[718,793,749],{"class":728},[718,795,797],{"class":720,"line":796},3,[718,798,800],{"emptyLinePlaceholder":799},true,"\n",[718,802,804,807,810,814,817,819,823,826,830],{"class":720,"line":803},4,[718,805,806],{"class":724},"export",[718,808,809],{"class":724}," default",[718,811,813],{"class":812},"s2Zo4"," defineNitroPlugin",[718,815,816],{"class":732},"(",[718,818,816],{"class":728},[718,820,822],{"class":821},"sHdIc","nitroApp",[718,824,825],{"class":728},")",[718,827,829],{"class":828},"spNyl"," =>",[718,831,832],{"class":728}," {\n",[718,834,836,839,841,844,846,849,852,855,858,860,863,865],{"class":720,"line":835},5,[718,837,838],{"class":732},"  nitroApp",[718,840,649],{"class":728},[718,842,843],{"class":732},"hooks",[718,845,649],{"class":728},[718,847,848],{"class":812},"hook",[718,850,816],{"class":851},"swJcz",[718,853,854],{"class":728},"'",[718,856,857],{"class":745},"evlog:drain",[718,859,854],{"class":728},[718,861,862],{"class":728},",",[718,864,733],{"class":812},[718,866,867],{"class":851},"())\n",[718,869,871,874],{"class":720,"line":870},6,[718,872,873],{"class":728},"}",[718,875,876],{"class":732},")\n",[708,878,880],{"className":710,"code":879,"filename":275,"language":713,"meta":714,"style":714},"import { Hono } from 'hono'\nimport { evlog } from 'evlog\u002Fhono'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\nconst app = new Hono()\napp.use(evlog({ drain: createLokiDrain() }))\n",[624,881,882,902,922,940,944,963],{"__ignoreMap":714},[718,883,884,886,888,891,893,895,897,900],{"class":720,"line":721},[718,885,725],{"class":724},[718,887,729],{"class":728},[718,889,890],{"class":732}," Hono",[718,892,736],{"class":728},[718,894,739],{"class":724},[718,896,742],{"class":728},[718,898,899],{"class":745},"hono",[718,901,749],{"class":728},[718,903,904,906,908,911,913,915,917,920],{"class":720,"line":777},[718,905,725],{"class":724},[718,907,729],{"class":728},[718,909,910],{"class":732}," evlog",[718,912,736],{"class":728},[718,914,739],{"class":724},[718,916,742],{"class":728},[718,918,919],{"class":745},"evlog\u002Fhono",[718,921,749],{"class":728},[718,923,924,926,928,930,932,934,936,938],{"class":720,"line":796},[718,925,725],{"class":724},[718,927,729],{"class":728},[718,929,733],{"class":732},[718,931,736],{"class":728},[718,933,739],{"class":724},[718,935,742],{"class":728},[718,937,746],{"class":745},[718,939,749],{"class":728},[718,941,942],{"class":720,"line":803},[718,943,800],{"emptyLinePlaceholder":799},[718,945,946,949,952,955,958,960],{"class":720,"line":835},[718,947,948],{"class":828},"const",[718,950,951],{"class":732}," app ",[718,953,954],{"class":728},"=",[718,956,957],{"class":728}," new",[718,959,890],{"class":812},[718,961,962],{"class":732},"()\n",[718,964,965,968,970,973,975,978,980,983,986,989,991,994,996],{"class":720,"line":870},[718,966,967],{"class":732},"app",[718,969,649],{"class":728},[718,971,972],{"class":812},"use",[718,974,816],{"class":732},[718,976,977],{"class":812},"evlog",[718,979,816],{"class":732},[718,981,982],{"class":728},"{",[718,984,985],{"class":851}," drain",[718,987,988],{"class":728},":",[718,990,733],{"class":812},[718,992,993],{"class":732},"() ",[718,995,873],{"class":728},[718,997,998],{"class":732},"))\n",[708,1000,1002],{"className":710,"code":1001,"filename":270,"language":713,"meta":714,"style":714},"import express from 'express'\nimport { evlog } from 'evlog\u002Fexpress'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\nconst app = express()\napp.use(evlog({ drain: createLokiDrain() }))\n",[624,1003,1004,1021,1040,1058,1062,1075],{"__ignoreMap":714},[718,1005,1006,1008,1011,1014,1016,1019],{"class":720,"line":721},[718,1007,725],{"class":724},[718,1009,1010],{"class":732}," express ",[718,1012,1013],{"class":724},"from",[718,1015,742],{"class":728},[718,1017,1018],{"class":745},"express",[718,1020,749],{"class":728},[718,1022,1023,1025,1027,1029,1031,1033,1035,1038],{"class":720,"line":777},[718,1024,725],{"class":724},[718,1026,729],{"class":728},[718,1028,910],{"class":732},[718,1030,736],{"class":728},[718,1032,739],{"class":724},[718,1034,742],{"class":728},[718,1036,1037],{"class":745},"evlog\u002Fexpress",[718,1039,749],{"class":728},[718,1041,1042,1044,1046,1048,1050,1052,1054,1056],{"class":720,"line":796},[718,1043,725],{"class":724},[718,1045,729],{"class":728},[718,1047,733],{"class":732},[718,1049,736],{"class":728},[718,1051,739],{"class":724},[718,1053,742],{"class":728},[718,1055,746],{"class":745},[718,1057,749],{"class":728},[718,1059,1060],{"class":720,"line":803},[718,1061,800],{"emptyLinePlaceholder":799},[718,1063,1064,1066,1068,1070,1073],{"class":720,"line":835},[718,1065,948],{"class":828},[718,1067,951],{"class":732},[718,1069,954],{"class":728},[718,1071,1072],{"class":812}," express",[718,1074,962],{"class":732},[718,1076,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1101],{"class":720,"line":870},[718,1078,967],{"class":732},[718,1080,649],{"class":728},[718,1082,972],{"class":812},[718,1084,816],{"class":732},[718,1086,977],{"class":812},[718,1088,816],{"class":732},[718,1090,982],{"class":728},[718,1092,985],{"class":851},[718,1094,988],{"class":728},[718,1096,733],{"class":812},[718,1098,993],{"class":732},[718,1100,873],{"class":728},[718,1102,998],{"class":732},[708,1104,1106],{"className":710,"code":1105,"filename":280,"language":713,"meta":714,"style":714},"import Fastify from 'fastify'\nimport { evlog } from 'evlog\u002Ffastify'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\nconst app = Fastify()\nawait app.register(evlog, { drain: createLokiDrain() })\n",[624,1107,1108,1124,1143,1161,1165,1178],{"__ignoreMap":714},[718,1109,1110,1112,1115,1117,1119,1122],{"class":720,"line":721},[718,1111,725],{"class":724},[718,1113,1114],{"class":732}," Fastify ",[718,1116,1013],{"class":724},[718,1118,742],{"class":728},[718,1120,1121],{"class":745},"fastify",[718,1123,749],{"class":728},[718,1125,1126,1128,1130,1132,1134,1136,1138,1141],{"class":720,"line":777},[718,1127,725],{"class":724},[718,1129,729],{"class":728},[718,1131,910],{"class":732},[718,1133,736],{"class":728},[718,1135,739],{"class":724},[718,1137,742],{"class":728},[718,1139,1140],{"class":745},"evlog\u002Ffastify",[718,1142,749],{"class":728},[718,1144,1145,1147,1149,1151,1153,1155,1157,1159],{"class":720,"line":796},[718,1146,725],{"class":724},[718,1148,729],{"class":728},[718,1150,733],{"class":732},[718,1152,736],{"class":728},[718,1154,739],{"class":724},[718,1156,742],{"class":728},[718,1158,746],{"class":745},[718,1160,749],{"class":728},[718,1162,1163],{"class":720,"line":803},[718,1164,800],{"emptyLinePlaceholder":799},[718,1166,1167,1169,1171,1173,1176],{"class":720,"line":835},[718,1168,948],{"class":828},[718,1170,951],{"class":732},[718,1172,954],{"class":728},[718,1174,1175],{"class":812}," Fastify",[718,1177,962],{"class":732},[718,1179,1180,1183,1186,1188,1191,1194,1196,1198,1200,1202,1204,1206,1208],{"class":720,"line":870},[718,1181,1182],{"class":724},"await",[718,1184,1185],{"class":732}," app",[718,1187,649],{"class":728},[718,1189,1190],{"class":812},"register",[718,1192,1193],{"class":732},"(evlog",[718,1195,862],{"class":728},[718,1197,729],{"class":728},[718,1199,985],{"class":851},[718,1201,988],{"class":728},[718,1203,733],{"class":812},[718,1205,993],{"class":732},[718,1207,873],{"class":728},[718,1209,876],{"class":732},[708,1211,1213],{"className":710,"code":1212,"filename":285,"language":713,"meta":714,"style":714},"import { Elysia } from 'elysia'\nimport { evlog } from 'evlog\u002Felysia'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\nconst app = new Elysia().use(evlog({ drain: createLokiDrain() }))\n",[624,1214,1215,1235,1254,1272,1276],{"__ignoreMap":714},[718,1216,1217,1219,1221,1224,1226,1228,1230,1233],{"class":720,"line":721},[718,1218,725],{"class":724},[718,1220,729],{"class":728},[718,1222,1223],{"class":732}," Elysia",[718,1225,736],{"class":728},[718,1227,739],{"class":724},[718,1229,742],{"class":728},[718,1231,1232],{"class":745},"elysia",[718,1234,749],{"class":728},[718,1236,1237,1239,1241,1243,1245,1247,1249,1252],{"class":720,"line":777},[718,1238,725],{"class":724},[718,1240,729],{"class":728},[718,1242,910],{"class":732},[718,1244,736],{"class":728},[718,1246,739],{"class":724},[718,1248,742],{"class":728},[718,1250,1251],{"class":745},"evlog\u002Felysia",[718,1253,749],{"class":728},[718,1255,1256,1258,1260,1262,1264,1266,1268,1270],{"class":720,"line":796},[718,1257,725],{"class":724},[718,1259,729],{"class":728},[718,1261,733],{"class":732},[718,1263,736],{"class":728},[718,1265,739],{"class":724},[718,1267,742],{"class":728},[718,1269,746],{"class":745},[718,1271,749],{"class":728},[718,1273,1274],{"class":720,"line":803},[718,1275,800],{"emptyLinePlaceholder":799},[718,1277,1278,1280,1282,1284,1286,1288,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313],{"class":720,"line":835},[718,1279,948],{"class":828},[718,1281,951],{"class":732},[718,1283,954],{"class":728},[718,1285,957],{"class":728},[718,1287,1223],{"class":812},[718,1289,1290],{"class":732},"()",[718,1292,649],{"class":728},[718,1294,972],{"class":812},[718,1296,816],{"class":732},[718,1298,977],{"class":812},[718,1300,816],{"class":732},[718,1302,982],{"class":728},[718,1304,985],{"class":851},[718,1306,988],{"class":728},[718,1308,733],{"class":812},[718,1310,993],{"class":732},[718,1312,873],{"class":728},[718,1314,998],{"class":732},[708,1316,1318],{"className":710,"code":1317,"filename":265,"language":713,"meta":714,"style":714},"import { Module } from '@nestjs\u002Fcommon'\nimport { EvlogModule } from 'evlog\u002Fnestjs'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\n@Module({\n  imports: [EvlogModule.forRoot({ drain: createLokiDrain() })],\n})\nexport class AppModule {}\n",[624,1319,1320,1340,1360,1378,1382,1395,1430,1437],{"__ignoreMap":714},[718,1321,1322,1324,1326,1329,1331,1333,1335,1338],{"class":720,"line":721},[718,1323,725],{"class":724},[718,1325,729],{"class":728},[718,1327,1328],{"class":732}," Module",[718,1330,736],{"class":728},[718,1332,739],{"class":724},[718,1334,742],{"class":728},[718,1336,1337],{"class":745},"@nestjs\u002Fcommon",[718,1339,749],{"class":728},[718,1341,1342,1344,1346,1349,1351,1353,1355,1358],{"class":720,"line":777},[718,1343,725],{"class":724},[718,1345,729],{"class":728},[718,1347,1348],{"class":732}," EvlogModule",[718,1350,736],{"class":728},[718,1352,739],{"class":724},[718,1354,742],{"class":728},[718,1356,1357],{"class":745},"evlog\u002Fnestjs",[718,1359,749],{"class":728},[718,1361,1362,1364,1366,1368,1370,1372,1374,1376],{"class":720,"line":796},[718,1363,725],{"class":724},[718,1365,729],{"class":728},[718,1367,733],{"class":732},[718,1369,736],{"class":728},[718,1371,739],{"class":724},[718,1373,742],{"class":728},[718,1375,746],{"class":745},[718,1377,749],{"class":728},[718,1379,1380],{"class":720,"line":803},[718,1381,800],{"emptyLinePlaceholder":799},[718,1383,1384,1387,1390,1392],{"class":720,"line":835},[718,1385,1386],{"class":728},"@",[718,1388,1389],{"class":812},"Module",[718,1391,816],{"class":732},[718,1393,1394],{"class":728},"{\n",[718,1396,1397,1400,1402,1405,1407,1410,1412,1414,1416,1418,1420,1422,1424,1427],{"class":720,"line":870},[718,1398,1399],{"class":851},"  imports",[718,1401,988],{"class":728},[718,1403,1404],{"class":732}," [EvlogModule",[718,1406,649],{"class":728},[718,1408,1409],{"class":812},"forRoot",[718,1411,816],{"class":732},[718,1413,982],{"class":728},[718,1415,985],{"class":851},[718,1417,988],{"class":728},[718,1419,733],{"class":812},[718,1421,993],{"class":732},[718,1423,873],{"class":728},[718,1425,1426],{"class":732},")]",[718,1428,1429],{"class":728},",\n",[718,1431,1433,1435],{"class":720,"line":1432},7,[718,1434,873],{"class":728},[718,1436,876],{"class":732},[718,1438,1440,1442,1445,1449],{"class":720,"line":1439},8,[718,1441,806],{"class":724},[718,1443,1444],{"class":828}," class",[718,1446,1448],{"class":1447},"sBMFI"," AppModule",[718,1450,1451],{"class":728}," {}\n",[708,1453,1455],{"className":710,"code":1454,"filename":300,"language":713,"meta":714,"style":714},"import { initLogger } from 'evlog'\nimport { createLokiDrain } from 'evlog\u002Floki'\n\ninitLogger({\n  env: { service: 'my-app' },\n  drain: createLokiDrain(),\n})\n",[624,1456,1457,1476,1494,1498,1507,1531,1544],{"__ignoreMap":714},[718,1458,1459,1461,1463,1466,1468,1470,1472,1474],{"class":720,"line":721},[718,1460,725],{"class":724},[718,1462,729],{"class":728},[718,1464,1465],{"class":732}," initLogger",[718,1467,736],{"class":728},[718,1469,739],{"class":724},[718,1471,742],{"class":728},[718,1473,977],{"class":745},[718,1475,749],{"class":728},[718,1477,1478,1480,1482,1484,1486,1488,1490,1492],{"class":720,"line":777},[718,1479,725],{"class":724},[718,1481,729],{"class":728},[718,1483,733],{"class":732},[718,1485,736],{"class":728},[718,1487,739],{"class":724},[718,1489,742],{"class":728},[718,1491,746],{"class":745},[718,1493,749],{"class":728},[718,1495,1496],{"class":720,"line":796},[718,1497,800],{"emptyLinePlaceholder":799},[718,1499,1500,1503,1505],{"class":720,"line":803},[718,1501,1502],{"class":812},"initLogger",[718,1504,816],{"class":732},[718,1506,1394],{"class":728},[718,1508,1509,1512,1514,1516,1519,1521,1523,1526,1528],{"class":720,"line":835},[718,1510,1511],{"class":851},"  env",[718,1513,988],{"class":728},[718,1515,729],{"class":728},[718,1517,1518],{"class":851}," service",[718,1520,988],{"class":728},[718,1522,742],{"class":728},[718,1524,1525],{"class":745},"my-app",[718,1527,854],{"class":728},[718,1529,1530],{"class":728}," },\n",[718,1532,1533,1536,1538,1540,1542],{"class":720,"line":870},[718,1534,1535],{"class":851},"  drain",[718,1537,988],{"class":728},[718,1539,733],{"class":812},[718,1541,1290],{"class":732},[718,1543,1429],{"class":728},[718,1545,1546,1548],{"class":720,"line":1432},[718,1547,873],{"class":728},[718,1549,876],{"class":732},[701,1551,543],{"id":1552},"configuration",[1554,1555,1557],"h3",{"id":1556},"environment-variables","Environment variables",[1559,1560,1561,1577],"table",{},[1562,1563,1564],"thead",{},[1565,1566,1567,1571,1574],"tr",{},[1568,1569,1570],"th",{},"Variable",[1568,1572,1573],{},"Required",[1568,1575,1576],{},"Description",[1578,1579,1580,1597,1617,1631],"tbody",{},[1565,1581,1582,1587,1590],{},[1583,1584,1585],"td",{},[624,1586,758],{},[1583,1588,1589],{},"Yes",[1583,1591,1592,1593,1596],{},"Base URL of the Loki instance, without the push path (",[624,1594,1595],{},"LOKI_URL"," also accepted)",[1565,1598,1599,1604,1607],{},[1583,1600,1601],{},[624,1602,1603],{},"LOKI_API_KEY",[1583,1605,1606],{},"No",[1583,1608,1609,1610,1613,1614,1596],{},"API token. Sent as Basic with ",[624,1611,1612],{},"LOKI_USER",", otherwise as Bearer (",[624,1615,1616],{},"GRAFANA_API_KEY",[1565,1618,1619,1623,1625],{},[1583,1620,1621],{},[624,1622,1612],{},[1583,1624,1606],{},[1583,1626,1627,1628,1596],{},"Grafana Cloud instance ID. Switches auth to Basic (",[624,1629,1630],{},"GRAFANA_USER",[1565,1632,1633,1638,1640],{},[1583,1634,1635],{},[624,1636,1637],{},"LOKI_TENANT_ID",[1583,1639,1606],{},[1583,1641,1642,1643],{},"Tenant for multi-tenant self-hosted Loki, sent as ",[624,1644,1645],{},"X-Scope-OrgID",[1554,1647,1649],{"id":1648},"priority","Priority",[605,1651,1652],{},"Configuration is resolved highest to lowest:",[659,1654,1655,1661,1667,1672],{},[662,1656,1657,1658],{},"Overrides passed to ",[624,1659,1660],{},"createLokiDrain()",[662,1662,1663,1666],{},[624,1664,1665],{},"runtimeConfig.evlog.loki"," (Nitro)",[662,1668,1669,1666],{},[624,1670,1671],{},"runtimeConfig.loki",[662,1673,1557],{},[1554,1675,346],{"id":1676},"options",[1559,1678,1679,1694],{},[1562,1680,1681],{},[1565,1682,1683,1686,1689,1692],{},[1568,1684,1685],{},"Option",[1568,1687,1688],{},"Type",[1568,1690,1691],{},"Default",[1568,1693,1576],{},[1578,1695,1696,1717,1733,1748,1766,1786,1803,1823],{},[1565,1697,1698,1703,1708,1711],{},[1583,1699,1700],{},[624,1701,1702],{},"endpoint",[1583,1704,1705],{},[624,1706,1707],{},"string",[1583,1709,1710],{},"—",[1583,1712,1713,1714],{},"Base URL, without ",[624,1715,1716],{},"\u002Floki\u002Fapi\u002Fv1\u002Fpush",[1565,1718,1719,1724,1728,1730],{},[1583,1720,1721],{},[624,1722,1723],{},"apiKey",[1583,1725,1726],{},[624,1727,1707],{},[1583,1729,1710],{},[1583,1731,1732],{},"API token",[1565,1734,1735,1739,1743,1745],{},[1583,1736,1737],{},[624,1738,644],{},[1583,1740,1741],{},[624,1742,1707],{},[1583,1744,1710],{},[1583,1746,1747],{},"Grafana Cloud instance ID (enables Basic auth)",[1565,1749,1750,1755,1759,1761],{},[1583,1751,1752],{},[624,1753,1754],{},"tenantId",[1583,1756,1757],{},[624,1758,1707],{},[1583,1760,1710],{},[1583,1762,1763,1765],{},[624,1764,1645],{}," for multi-tenant Loki",[1565,1767,1768,1773,1778,1783],{},[1583,1769,1770],{},[624,1771,1772],{},"labelFields",[1583,1774,1775],{},[624,1776,1777],{},"string[]",[1583,1779,1780],{},[624,1781,1782],{},"['service', 'environment', 'level']",[1583,1784,1785],{},"Event fields promoted to Loki labels",[1565,1787,1788,1793,1798,1800],{},[1583,1789,1790],{},[624,1791,1792],{},"labels",[1583,1794,1795],{},[624,1796,1797],{},"Record\u003Cstring, string>",[1583,1799,1710],{},[1583,1801,1802],{},"Static labels merged into every stream",[1565,1804,1805,1810,1815,1820],{},[1583,1806,1807],{},[624,1808,1809],{},"timeout",[1583,1811,1812],{},[624,1813,1814],{},"number",[1583,1816,1817],{},[624,1818,1819],{},"5000",[1583,1821,1822],{},"Request timeout in ms",[1565,1824,1825,1830,1834,1839],{},[1583,1826,1827],{},[624,1828,1829],{},"retries",[1583,1831,1832],{},[624,1833,1814],{},[1583,1835,1836],{},[624,1837,1838],{},"2",[1583,1840,1841],{},"Retry attempts on transient failures",[701,1843,1845],{"id":1844},"deployment","Deployment",[605,1847,1848],{},"Loki runs either way, and the adapter is the same in both cases. Only\nauthentication differs.",[1554,1850,1852],{"id":1851},"self-hosted","Self-hosted",[605,1854,1855],{},"A single-tenant instance needs nothing but the endpoint:",[708,1857,1860],{"className":710,"code":1858,"filename":1859,"language":713,"meta":714,"style":714},"createLokiDrain({ endpoint: 'http:\u002F\u002Flocalhost:3100' })\n","server\u002Fplugins\u002Fevlog.ts",[624,1861,1862],{"__ignoreMap":714},[718,1863,1864,1867,1869,1871,1874,1876,1878,1880,1882,1884],{"class":720,"line":721},[718,1865,1866],{"class":812},"createLokiDrain",[718,1868,816],{"class":732},[718,1870,982],{"class":728},[718,1872,1873],{"class":851}," endpoint",[718,1875,988],{"class":728},[718,1877,742],{"class":728},[718,1879,679],{"class":745},[718,1881,854],{"class":728},[718,1883,736],{"class":728},[718,1885,876],{"class":732},[708,1887,1892],{"className":1888,"code":1889,"filename":1890,"language":1891,"meta":714,"style":714},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","LOKI_ENDPOINT=http:\u002F\u002Flocalhost:3100\n",".env","bash",[624,1893,1894],{"__ignoreMap":714},[718,1895,1896,1898,1900],{"class":720,"line":721},[718,1897,758],{"class":732},[718,1899,954],{"class":728},[718,1901,1902],{"class":745},"http:\u002F\u002Flocalhost:3100\n",[605,1904,1905,1906,1909,1910,988],{},"For a ",[619,1907,1908],{},"multi-tenant"," deployment, name the tenant, and it is sent as ",[624,1911,1645],{},[708,1913,1915],{"className":710,"code":1914,"filename":1859,"language":713,"meta":714,"style":714},"createLokiDrain({\n  endpoint: 'http:\u002F\u002Floki.internal:3100',\n  tenantId: 'team-checkout',\n})\n",[624,1916,1917,1925,1941,1957],{"__ignoreMap":714},[718,1918,1919,1921,1923],{"class":720,"line":721},[718,1920,1866],{"class":812},[718,1922,816],{"class":732},[718,1924,1394],{"class":728},[718,1926,1927,1930,1932,1934,1937,1939],{"class":720,"line":777},[718,1928,1929],{"class":851},"  endpoint",[718,1931,988],{"class":728},[718,1933,742],{"class":728},[718,1935,1936],{"class":745},"http:\u002F\u002Floki.internal:3100",[718,1938,854],{"class":728},[718,1940,1429],{"class":728},[718,1942,1943,1946,1948,1950,1953,1955],{"class":720,"line":796},[718,1944,1945],{"class":851},"  tenantId",[718,1947,988],{"class":728},[718,1949,742],{"class":728},[718,1951,1952],{"class":745},"team-checkout",[718,1954,854],{"class":728},[718,1956,1429],{"class":728},[718,1958,1959,1961],{"class":720,"line":803},[718,1960,873],{"class":728},[718,1962,876],{"class":732},[708,1964,1966],{"className":1888,"code":1965,"filename":1890,"language":1891,"meta":714,"style":714},"LOKI_ENDPOINT=http:\u002F\u002Floki.internal:3100\nLOKI_TENANT_ID=team-checkout\n",[624,1967,1968,1977],{"__ignoreMap":714},[718,1969,1970,1972,1974],{"class":720,"line":721},[718,1971,758],{"class":732},[718,1973,954],{"class":728},[718,1975,1976],{"class":745},"http:\u002F\u002Floki.internal:3100\n",[718,1978,1979,1981,1983],{"class":720,"line":777},[718,1980,1637],{"class":732},[718,1982,954],{"class":728},[718,1984,1985],{"class":745},"team-checkout\n",[605,1987,1988,1989,1991,1992,649],{},"If your instance sits behind an authenticating proxy, ",[624,1990,1723],{}," alone is sent as\n",[624,1993,1994],{},"Authorization: Bearer",[1554,1996,1998],{"id":1997},"grafana-cloud","Grafana Cloud",[605,2000,2001,2002,2005],{},"Grafana Cloud authenticates with your ",[619,2003,2004],{},"instance ID"," plus an access policy\ntoken, sent together as HTTP Basic:",[708,2007,2009],{"className":710,"code":2008,"filename":1859,"language":713,"meta":714,"style":714},"createLokiDrain({\n  endpoint: 'https:\u002F\u002Flogs-prod-eu-west-0.grafana.net',\n  user: '123456',\n  apiKey: process.env.GRAFANA_API_KEY,\n})\n",[624,2010,2011,2019,2034,2050,2071],{"__ignoreMap":714},[718,2012,2013,2015,2017],{"class":720,"line":721},[718,2014,1866],{"class":812},[718,2016,816],{"class":732},[718,2018,1394],{"class":728},[718,2020,2021,2023,2025,2027,2030,2032],{"class":720,"line":777},[718,2022,1929],{"class":851},[718,2024,988],{"class":728},[718,2026,742],{"class":728},[718,2028,2029],{"class":745},"https:\u002F\u002Flogs-prod-eu-west-0.grafana.net",[718,2031,854],{"class":728},[718,2033,1429],{"class":728},[718,2035,2036,2039,2041,2043,2046,2048],{"class":720,"line":796},[718,2037,2038],{"class":851},"  user",[718,2040,988],{"class":728},[718,2042,742],{"class":728},[718,2044,2045],{"class":745},"123456",[718,2047,854],{"class":728},[718,2049,1429],{"class":728},[718,2051,2052,2055,2057,2060,2062,2065,2067,2069],{"class":720,"line":803},[718,2053,2054],{"class":851},"  apiKey",[718,2056,988],{"class":728},[718,2058,2059],{"class":732}," process",[718,2061,649],{"class":728},[718,2063,2064],{"class":732},"env",[718,2066,649],{"class":728},[718,2068,1616],{"class":732},[718,2070,1429],{"class":728},[718,2072,2073,2075],{"class":720,"line":835},[718,2074,873],{"class":728},[718,2076,876],{"class":732},[708,2078,2080],{"className":1888,"code":2079,"filename":1890,"language":1891,"meta":714,"style":714},"LOKI_ENDPOINT=https:\u002F\u002Flogs-prod-eu-west-0.grafana.net\nLOKI_USER=123456\nLOKI_API_KEY=glc_xxx\n",[624,2081,2082,2091,2100],{"__ignoreMap":714},[718,2083,2084,2086,2088],{"class":720,"line":721},[718,2085,758],{"class":732},[718,2087,954],{"class":728},[718,2089,2090],{"class":745},"https:\u002F\u002Flogs-prod-eu-west-0.grafana.net\n",[718,2092,2093,2095,2097],{"class":720,"line":777},[718,2094,1612],{"class":732},[718,2096,954],{"class":728},[718,2098,2099],{"class":745},"123456\n",[718,2101,2102,2104,2106],{"class":720,"line":796},[718,2103,1603],{"class":732},[718,2105,954],{"class":728},[718,2107,2108],{"class":745},"glc_xxx\n",[2110,2111,2113,2115,2116,2119,2120,2124,2125,649],"callout",{"color":2112,"icon":13},"info",[624,2114,644],{}," is the ",[619,2117,2118],{},"numeric instance ID"," of the Loki datasource. Find it under\n",[2121,2122,2123],"em",{},"Connections → Data sources → Loki"," in your Grafana Cloud stack. It is not your\naccount email. Using the wrong value is the usual cause of a ",[624,2126,2127],{},"401",[1554,2129,2131],{"id":2130},"which-auth-applies","Which auth applies",[1559,2133,2134,2153],{},[1562,2135,2136],{},[1565,2137,2138,2142,2146,2150],{},[1568,2139,2140],{},[624,2141,644],{},[1568,2143,2144],{},[624,2145,1723],{},[1568,2147,2148],{},[624,2149,1754],{},[1568,2151,2152],{},"Header sent",[1578,2154,2155,2169,2182,2195],{},[1565,2156,2157,2160,2162,2164],{},[1583,2158,2159],{},"✓",[1583,2161,2159],{},[1583,2163],{},[1583,2165,2166],{},[624,2167,2168],{},"Authorization: Basic base64(user:apiKey)",[1565,2170,2171,2173,2175,2177],{},[1583,2172],{},[1583,2174,2159],{},[1583,2176],{},[1583,2178,2179],{},[624,2180,2181],{},"Authorization: Bearer \u003CapiKey>",[1565,2183,2184,2186,2188,2190],{},[1583,2185],{},[1583,2187],{},[1583,2189,2159],{},[1583,2191,2192],{},[624,2193,2194],{},"X-Scope-OrgID: \u003CtenantId>",[1565,2196,2197,2199,2201,2203],{},[1583,2198],{},[1583,2200],{},[1583,2202],{},[1583,2204,2205],{},"none — unauthenticated instance",[605,2207,2208,2210],{},[624,2209,1754],{}," is independent and can be combined with either auth mode.",[701,2212,2214],{"id":2213},"labels-and-cardinality","Labels and cardinality",[2110,2216,2219,2220,2222,2223,2226],{"color":2217,"icon":2218},"warning","i-lucide-triangle-alert","Never promote a high-cardinality field to a label. Loki creates one stream per unique label combination, so labelling ",[624,2221,638],{}," or ",[624,2224,2225],{},"userId"," will create millions of streams and degrade or break your instance.",[605,2228,2229],{},"Add a label only for values you filter on and that have a bounded set:",[708,2231,2233],{"className":710,"code":2232,"filename":1859,"language":713,"meta":714,"style":714},"createLokiDrain({\n  \u002F\u002F `region` has a handful of values — safe\n  labelFields: ['service', 'environment', 'level', 'region'],\n  \u002F\u002F Static labels for everything in this deployment\n  labels: { cluster: 'prod-eu' },\n})\n",[624,2234,2235,2243,2248,2294,2299,2322],{"__ignoreMap":714},[718,2236,2237,2239,2241],{"class":720,"line":721},[718,2238,1866],{"class":812},[718,2240,816],{"class":732},[718,2242,1394],{"class":728},[718,2244,2245],{"class":720,"line":777},[718,2246,2247],{"class":773},"  \u002F\u002F `region` has a handful of values — safe\n",[718,2249,2250,2253,2255,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284,2287,2289,2292],{"class":720,"line":796},[718,2251,2252],{"class":851},"  labelFields",[718,2254,988],{"class":728},[718,2256,2257],{"class":732}," [",[718,2259,854],{"class":728},[718,2261,626],{"class":745},[718,2263,854],{"class":728},[718,2265,862],{"class":728},[718,2267,742],{"class":728},[718,2269,630],{"class":745},[718,2271,854],{"class":728},[718,2273,862],{"class":728},[718,2275,742],{"class":728},[718,2277,634],{"class":745},[718,2279,854],{"class":728},[718,2281,862],{"class":728},[718,2283,742],{"class":728},[718,2285,2286],{"class":745},"region",[718,2288,854],{"class":728},[718,2290,2291],{"class":732},"]",[718,2293,1429],{"class":728},[718,2295,2296],{"class":720,"line":803},[718,2297,2298],{"class":773},"  \u002F\u002F Static labels for everything in this deployment\n",[718,2300,2301,2304,2306,2308,2311,2313,2315,2318,2320],{"class":720,"line":835},[718,2302,2303],{"class":851},"  labels",[718,2305,988],{"class":728},[718,2307,729],{"class":728},[718,2309,2310],{"class":851}," cluster",[718,2312,988],{"class":728},[718,2314,742],{"class":728},[718,2316,2317],{"class":745},"prod-eu",[718,2319,854],{"class":728},[718,2321,1530],{"class":728},[718,2323,2324,2326],{"class":720,"line":870},[718,2325,873],{"class":728},[718,2327,876],{"class":732},[605,2329,2330],{},"Everything else stays in the JSON line and is fully queryable. See below.",[701,2332,2334],{"id":2333},"querying-in-grafana","Querying in Grafana",[605,2336,2337,2338,988],{},"Filter by label, then reach into the wide event with ",[624,2339,648],{},[708,2341,2345],{"className":2342,"code":2343,"language":2344,"meta":714,"style":714},"language-logql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{service=\"checkout\", environment=\"production\"}\n  | json\n  | status >= 500\n","logql",[624,2346,2347,2352,2357],{"__ignoreMap":714},[718,2348,2349],{"class":720,"line":721},[718,2350,2351],{},"{service=\"checkout\", environment=\"production\"}\n",[718,2353,2354],{"class":720,"line":777},[718,2355,2356],{},"  | json\n",[718,2358,2359],{"class":720,"line":796},[718,2360,2361],{},"  | status >= 500\n",[708,2363,2365],{"className":2342,"code":2364,"language":2344,"meta":714,"style":714},"# Slow requests on one route\n{service=\"checkout\"} | json | path=\"\u002Fapi\u002Forders\" | durationMs > 1000\n",[624,2366,2367,2372],{"__ignoreMap":714},[718,2368,2369],{"class":720,"line":721},[718,2370,2371],{},"# Slow requests on one route\n",[718,2373,2374],{"class":720,"line":777},[718,2375,2376],{},"{service=\"checkout\"} | json | path=\"\u002Fapi\u002Forders\" | durationMs > 1000\n",[708,2378,2380],{"className":2342,"code":2379,"language":2344,"meta":714,"style":714},"# One request end to end\n{service=\"checkout\"} | json | requestId=\"4a8ff3a8-...\"\n",[624,2381,2382,2387],{"__ignoreMap":714},[718,2383,2384],{"class":720,"line":721},[718,2385,2386],{},"# One request end to end\n",[718,2388,2389],{"class":720,"line":777},[718,2390,2391],{},"{service=\"checkout\"} | json | requestId=\"4a8ff3a8-...\"\n",[708,2393,2395],{"className":2342,"code":2394,"language":2344,"meta":714,"style":714},"# Error rate per service\nsum by (service) (rate({environment=\"production\", level=\"error\"}[5m]))\n",[624,2396,2397,2402],{"__ignoreMap":714},[718,2398,2399],{"class":720,"line":721},[718,2400,2401],{},"# Error rate per service\n",[718,2403,2404],{"class":720,"line":777},[718,2405,2406],{},"sum by (service) (rate({environment=\"production\", level=\"error\"}[5m]))\n",[701,2408,2410],{"id":2409},"batching","Batching",[605,2412,2413],{},"Pair the drain with a pipeline to push in batches rather than per request:",[708,2415,2417],{"className":710,"code":2416,"filename":1859,"language":713,"meta":714,"style":714},"import { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createLokiDrain } from 'evlog\u002Floki'\nimport type { DrainContext } from 'evlog'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 5000 },\n})\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', pipeline(createLokiDrain()))\n})\n",[624,2418,2419,2439,2457,2479,2483,2507,2537,2543,2547,2568,2601],{"__ignoreMap":714},[718,2420,2421,2423,2425,2428,2430,2432,2434,2437],{"class":720,"line":721},[718,2422,725],{"class":724},[718,2424,729],{"class":728},[718,2426,2427],{"class":732}," createDrainPipeline",[718,2429,736],{"class":728},[718,2431,739],{"class":724},[718,2433,742],{"class":728},[718,2435,2436],{"class":745},"evlog\u002Fpipeline",[718,2438,749],{"class":728},[718,2440,2441,2443,2445,2447,2449,2451,2453,2455],{"class":720,"line":777},[718,2442,725],{"class":724},[718,2444,729],{"class":728},[718,2446,733],{"class":732},[718,2448,736],{"class":728},[718,2450,739],{"class":724},[718,2452,742],{"class":728},[718,2454,746],{"class":745},[718,2456,749],{"class":728},[718,2458,2459,2461,2464,2466,2469,2471,2473,2475,2477],{"class":720,"line":796},[718,2460,725],{"class":724},[718,2462,2463],{"class":724}," type",[718,2465,729],{"class":728},[718,2467,2468],{"class":732}," DrainContext",[718,2470,736],{"class":728},[718,2472,739],{"class":724},[718,2474,742],{"class":728},[718,2476,977],{"class":745},[718,2478,749],{"class":728},[718,2480,2481],{"class":720,"line":803},[718,2482,800],{"emptyLinePlaceholder":799},[718,2484,2485,2487,2490,2492,2494,2497,2500,2503,2505],{"class":720,"line":835},[718,2486,948],{"class":828},[718,2488,2489],{"class":732}," pipeline ",[718,2491,954],{"class":728},[718,2493,2427],{"class":812},[718,2495,2496],{"class":728},"\u003C",[718,2498,2499],{"class":1447},"DrainContext",[718,2501,2502],{"class":728},">",[718,2504,816],{"class":732},[718,2506,1394],{"class":728},[718,2508,2509,2512,2514,2516,2519,2521,2525,2527,2530,2532,2535],{"class":720,"line":870},[718,2510,2511],{"class":851},"  batch",[718,2513,988],{"class":728},[718,2515,729],{"class":728},[718,2517,2518],{"class":851}," size",[718,2520,988],{"class":728},[718,2522,2524],{"class":2523},"sbssI"," 100",[718,2526,862],{"class":728},[718,2528,2529],{"class":851}," intervalMs",[718,2531,988],{"class":728},[718,2533,2534],{"class":2523}," 5000",[718,2536,1530],{"class":728},[718,2538,2539,2541],{"class":720,"line":1432},[718,2540,873],{"class":728},[718,2542,876],{"class":732},[718,2544,2545],{"class":720,"line":1439},[718,2546,800],{"emptyLinePlaceholder":799},[718,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566],{"class":720,"line":2549},9,[718,2551,806],{"class":724},[718,2553,809],{"class":724},[718,2555,813],{"class":812},[718,2557,816],{"class":732},[718,2559,816],{"class":728},[718,2561,822],{"class":821},[718,2563,825],{"class":728},[718,2565,829],{"class":828},[718,2567,832],{"class":728},[718,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2594,2596,2598],{"class":720,"line":2570},10,[718,2572,838],{"class":732},[718,2574,649],{"class":728},[718,2576,843],{"class":732},[718,2578,649],{"class":728},[718,2580,848],{"class":812},[718,2582,816],{"class":851},[718,2584,854],{"class":728},[718,2586,857],{"class":745},[718,2588,854],{"class":728},[718,2590,862],{"class":728},[718,2592,2593],{"class":812}," pipeline",[718,2595,816],{"class":851},[718,2597,1866],{"class":812},[718,2599,2600],{"class":851},"()))\n",[718,2602,2604,2606],{"class":720,"line":2603},11,[718,2605,873],{"class":728},[718,2607,876],{"class":732},[605,2609,2610],{},"Events sharing a label set are grouped into a single Loki stream, and entries are sorted by timestamp, because Loki rejects out-of-order pushes within a stream.",[701,2612,2614],{"id":2613},"verify-it-locally","Verify it locally",[605,2616,2617],{},"Spin up Loki in Docker and push a real event, with no cloud account needed:",[708,2619,2622],{"className":1888,"code":2620,"filename":2621,"language":1891,"meta":714,"style":714},"docker compose -f packages\u002Fevlog\u002Ftest\u002Fe2e\u002Fdocker-compose.yml up -d\nLOKI_ENDPOINT=http:\u002F\u002Flocalhost:3100 pnpm run test:e2e\ndocker compose -f packages\u002Fevlog\u002Ftest\u002Fe2e\u002Fdocker-compose.yml down -v\n","Terminal",[624,2623,2624,2644,2661],{"__ignoreMap":714},[718,2625,2626,2629,2632,2635,2638,2641],{"class":720,"line":721},[718,2627,2628],{"class":1447},"docker",[718,2630,2631],{"class":745}," compose",[718,2633,2634],{"class":745}," -f",[718,2636,2637],{"class":745}," packages\u002Fevlog\u002Ftest\u002Fe2e\u002Fdocker-compose.yml",[718,2639,2640],{"class":745}," up",[718,2642,2643],{"class":745}," -d\n",[718,2645,2646,2648,2650,2652,2655,2658],{"class":720,"line":777},[718,2647,758],{"class":732},[718,2649,954],{"class":728},[718,2651,679],{"class":745},[718,2653,2654],{"class":1447}," pnpm",[718,2656,2657],{"class":745}," run",[718,2659,2660],{"class":745}," test:e2e\n",[718,2662,2663,2665,2667,2669,2671,2674],{"class":720,"line":796},[718,2664,2628],{"class":1447},[718,2666,2631],{"class":745},[718,2668,2634],{"class":745},[718,2670,2637],{"class":745},[718,2672,2673],{"class":745}," down",[718,2675,2676],{"class":745}," -v\n",[605,2678,2679,2680,2683,2684,2686],{},"The suite is a ",[619,2681,2682],{},"round-trip",": it pushes events, queries them back through\nLoki's range API, and asserts the label set, the JSON log line and the\ntimestamp survived. Without ",[624,2685,758],{}," it skips itself with a visible\nlabel rather than passing silently.",[605,2688,2689,2690,2692,2693,649],{},"To eyeball the result instead, point any Grafana at ",[624,2691,679],{},"\nand run ",[624,2694,2695],{},"{service=\"evlog-e2e\"}",[701,2697,2699],{"id":2698},"troubleshooting","Troubleshooting",[605,2701,2702,2707,2708,2710,2711,2713,2714,2717],{},[619,2703,2704,649],{},[624,2705,2706],{},"Missing endpoint"," ",[624,2709,758],{}," is unset and no ",[624,2712,1702],{}," was passed. The drain logs ",[624,2715,2716],{},"[evlog\u002Floki] Missing endpoint"," once and then does nothing, so requests are never blocked or failed.",[605,2719,2720,2725,2726,2728,2729,2731],{},[619,2721,2722,649],{},[624,2723,2724],{},"Loki API error: 401"," On Grafana Cloud, check that ",[624,2727,644],{}," is the numeric ",[619,2730,2004],{}," of the Loki datasource, not your account email.",[605,2733,2734,2740,2741,2744],{},[619,2735,2736,2739],{},[624,2737,2738],{},"Loki API error: 400"," mentioning out-of-order entries."," Older Loki versions reject entries older than the most recent one in a stream. evlog sorts within each push; if you still hit this, enable ",[624,2742,2743],{},"unordered_writes"," in Loki or reduce the batch interval.",[605,2746,2747,2750,2751,2754],{},[619,2748,2749],{},"Nothing appears in Grafana."," Confirm the label set you are querying. Run ",[624,2752,2753],{},"{service=~\".+\"}"," first to see which streams arrived.",[701,2756,2758],{"id":2757},"direct-api-usage","Direct API usage",[605,2760,2761],{},"Bypass the drain to push events yourself:",[708,2763,2766],{"className":710,"code":2764,"filename":2765,"language":713,"meta":714,"style":714},"import { sendBatchToLoki, sendToLoki } from 'evlog\u002Floki'\n\nawait sendToLoki(event, { endpoint: 'http:\u002F\u002Flocalhost:3100' })\nawait sendBatchToLoki(events, { endpoint: 'http:\u002F\u002Flocalhost:3100' })\n","scripts\u002Fbackfill.ts",[624,2767,2768,2792,2796,2823],{"__ignoreMap":714},[718,2769,2770,2772,2774,2777,2779,2782,2784,2786,2788,2790],{"class":720,"line":721},[718,2771,725],{"class":724},[718,2773,729],{"class":728},[718,2775,2776],{"class":732}," sendBatchToLoki",[718,2778,862],{"class":728},[718,2780,2781],{"class":732}," sendToLoki",[718,2783,736],{"class":728},[718,2785,739],{"class":724},[718,2787,742],{"class":728},[718,2789,746],{"class":745},[718,2791,749],{"class":728},[718,2793,2794],{"class":720,"line":777},[718,2795,800],{"emptyLinePlaceholder":799},[718,2797,2798,2800,2802,2805,2807,2809,2811,2813,2815,2817,2819,2821],{"class":720,"line":796},[718,2799,1182],{"class":724},[718,2801,2781],{"class":812},[718,2803,2804],{"class":732},"(event",[718,2806,862],{"class":728},[718,2808,729],{"class":728},[718,2810,1873],{"class":851},[718,2812,988],{"class":728},[718,2814,742],{"class":728},[718,2816,679],{"class":745},[718,2818,854],{"class":728},[718,2820,736],{"class":728},[718,2822,876],{"class":732},[718,2824,2825,2827,2829,2832,2834,2836,2838,2840,2842,2844,2846,2848],{"class":720,"line":803},[718,2826,1182],{"class":724},[718,2828,2776],{"class":812},[718,2830,2831],{"class":732},"(events",[718,2833,862],{"class":728},[718,2835,729],{"class":728},[718,2837,1873],{"class":851},[718,2839,988],{"class":728},[718,2841,742],{"class":728},[718,2843,679],{"class":745},[718,2845,854],{"class":728},[718,2847,736],{"class":728},[718,2849,876],{"class":732},[605,2851,2852,627,2855,631,2858,2861],{},[624,2853,2854],{},"buildLokiPayload()",[624,2856,2857],{},"toLokiLabels()",[624,2859,2860],{},"resolveLokiPushUrl()"," are also exported for custom transports.",[701,2863,2865],{"id":2864},"next-steps","Next steps",[2867,2868,2869,2874,2879,2884],"ul",{},[662,2870,2871,2873],{},[609,2872,66],{"href":67},": control log volume before it reaches Loki",[662,2875,2876,2878],{},[609,2877,440],{"href":441},": add derived fields to every event",[662,2880,2881,2883],{},[609,2882,530],{"href":531},": batching, retries, and fan-out",[662,2885,2886,2889],{},[609,2887,2888],{"href":153},"Adapters Overview",": all available destinations",[2891,2892,2893],"style",{},"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 .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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":714,"searchDepth":777,"depth":777,"links":2895},[2896,2897,2898,2903,2908,2909,2910,2911,2912,2913,2914],{"id":703,"depth":777,"text":20},{"id":752,"depth":777,"text":25},{"id":1552,"depth":777,"text":543,"children":2899},[2900,2901,2902],{"id":1556,"depth":796,"text":1557},{"id":1648,"depth":796,"text":1649},{"id":1676,"depth":796,"text":346},{"id":1844,"depth":777,"text":1845,"children":2904},[2905,2906,2907],{"id":1851,"depth":796,"text":1852},{"id":1997,"depth":796,"text":1998},{"id":2130,"depth":796,"text":2131},{"id":2213,"depth":777,"text":2214},{"id":2333,"depth":777,"text":2334},{"id":2409,"depth":777,"text":2410},{"id":2613,"depth":777,"text":2614},{"id":2698,"depth":777,"text":2699},{"id":2757,"depth":777,"text":2758},{"id":2864,"depth":777,"text":2865},"Push wide events to Grafana Loki — self-hosted, multi-tenant, or Grafana Cloud — with low-cardinality labels and full JSON querying.","md",[2918,2925],{"label":2919,"icon":2920,"to":2921,"target":2922,"color":2923,"variant":2924},"Loki HTTP API","i-lucide-external-link","https:\u002F\u002Fgrafana.com\u002Fdocs\u002Floki\u002Flatest\u002Freference\u002Floki-http-api\u002F","_blank","neutral","subtle",{"label":2926,"icon":2920,"to":2927,"target":2922,"color":2923,"variant":2924},"LogQL","https:\u002F\u002Fgrafana.com\u002Fdocs\u002Floki\u002Flatest\u002Fquery\u002F",{},{"title":191,"icon":194},{"title":600,"description":2915},"3ojNapfXdoP0ukimUFES-lT5m0GMw5mDjlzlQ4F9Dtc",[2933,2935],{"title":181,"path":182,"stem":183,"description":2934,"icon":184,"children":-1},"Send wide events to Datadog Logs via the native HTTP intake API. Supports all Datadog sites and DD_* environment variables.",{"title":196,"path":197,"stem":198,"description":2936,"icon":199,"children":-1},"Insert wide events into ClickHouse over the HTTP interface — typed columns for what you aggregate, full JSON for everything else.",1789076913673]