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