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