[{"data":1,"prerenderedAt":2571},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-self-hosted-loki":515,"-integrate-adapters-self-hosted-loki-surround":2566},[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],{"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},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[185,190,195,200,205],{"title":186,"path":187,"stem":188,"icon":189},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":191,"path":192,"stem":193,"icon":194},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":196,"path":197,"stem":198,"icon":199},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":201,"path":202,"stem":203,"icon":204},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Floki","4.integrate\u002Fadapters\u002Fself-hosted\u002F04.loki","i-simple-icons-grafana",{"title":206,"path":207,"stem":208,"icon":209},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fclickhouse","4.integrate\u002Fadapters\u002Fself-hosted\u002F05.clickhouse","i-simple-icons-clickhouse",{"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":2549,"extension":2550,"links":2551,"meta":2562,"navigation":2563,"path":202,"seo":2564,"stem":203,"__hash__":2565},"docs\u002F4.integrate\u002Fadapters\u002Fself-hosted\u002F04.loki.md","Grafana Loki Adapter",{"type":519,"value":520,"toc":2533},"minimark",[521,532,567,617,621,624,667,670,677,1467,1470,1475,1563,1567,1570,1591,1594,1759,1763,1934,1938,1951,1954,2053,2056,2060,2065,2087,2102,2117,2132,2136,2139,2333,2336,2340,2354,2369,2382,2392,2396,2399,2487,2499,2503,2529],[522,523,524,525,531],"p",{},"The Loki adapter pushes wide events to ",[526,527,201],"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":204},"[\"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\u002Fself-hosted\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-shapes","Deployment shapes",[678,1764,1765,1800,1878],{},[625,1766,1769],{"className":627,"code":1767,"filename":1768,"language":630,"meta":631,"style":631},"\u002F\u002F Single tenant — the endpoint is all you need\ncreateLokiDrain({ endpoint: 'http:\u002F\u002Flocalhost:3100' })\n","Self-hosted",[541,1770,1771,1776],{"__ignoreMap":631},[635,1772,1773],{"class":637,"line":638},[635,1774,1775],{"class":690},"\u002F\u002F Single tenant — the endpoint is all you need\n",[635,1777,1778,1781,1783,1785,1788,1790,1792,1794,1796,1798],{"class":637,"line":694},[635,1779,1780],{"class":729},"createLokiDrain",[635,1782,733],{"class":649},[635,1784,899],{"class":645},[635,1786,1787],{"class":768}," endpoint",[635,1789,905],{"class":645},[635,1791,659],{"class":645},[635,1793,596],{"class":662},[635,1795,771],{"class":645},[635,1797,653],{"class":645},[635,1799,793],{"class":649},[625,1801,1804],{"className":627,"code":1802,"filename":1803,"language":630,"meta":631,"style":631},"\u002F\u002F Instance ID + token are sent as HTTP Basic\ncreateLokiDrain({\n  endpoint: 'https:\u002F\u002Flogs-prod-eu-west-0.grafana.net',\n  user: '123456',\n  apiKey: process.env.GRAFANA_API_KEY,\n})\n","Grafana Cloud",[541,1805,1806,1811,1819,1835,1851,1872],{"__ignoreMap":631},[635,1807,1808],{"class":637,"line":638},[635,1809,1810],{"class":690},"\u002F\u002F Instance ID + token are sent as HTTP Basic\n",[635,1812,1813,1815,1817],{"class":637,"line":694},[635,1814,1780],{"class":729},[635,1816,733],{"class":649},[635,1818,1311],{"class":645},[635,1820,1821,1824,1826,1828,1831,1833],{"class":637,"line":713},[635,1822,1823],{"class":768},"  endpoint",[635,1825,905],{"class":645},[635,1827,659],{"class":645},[635,1829,1830],{"class":662},"https:\u002F\u002Flogs-prod-eu-west-0.grafana.net",[635,1832,771],{"class":645},[635,1834,1346],{"class":645},[635,1836,1837,1840,1842,1844,1847,1849],{"class":637,"line":720},[635,1838,1839],{"class":768},"  user",[635,1841,905],{"class":645},[635,1843,659],{"class":645},[635,1845,1846],{"class":662},"123456",[635,1848,771],{"class":645},[635,1850,1346],{"class":645},[635,1852,1853,1856,1858,1861,1863,1866,1868,1870],{"class":637,"line":752},[635,1854,1855],{"class":768},"  apiKey",[635,1857,905],{"class":645},[635,1859,1860],{"class":649}," process",[635,1862,566],{"class":645},[635,1864,1865],{"class":649},"env",[635,1867,566],{"class":645},[635,1869,1533],{"class":649},[635,1871,1346],{"class":645},[635,1873,1874,1876],{"class":637,"line":787},[635,1875,790],{"class":645},[635,1877,793],{"class":649},[625,1879,1882],{"className":627,"code":1880,"filename":1881,"language":630,"meta":631,"style":631},"\u002F\u002F X-Scope-OrgID selects the tenant\ncreateLokiDrain({\n  endpoint: 'http:\u002F\u002Floki.internal:3100',\n  tenantId: 'team-checkout',\n})\n","Multi-tenant",[541,1883,1884,1889,1897,1912,1928],{"__ignoreMap":631},[635,1885,1886],{"class":637,"line":638},[635,1887,1888],{"class":690},"\u002F\u002F X-Scope-OrgID selects the tenant\n",[635,1890,1891,1893,1895],{"class":637,"line":694},[635,1892,1780],{"class":729},[635,1894,733],{"class":649},[635,1896,1311],{"class":645},[635,1898,1899,1901,1903,1905,1908,1910],{"class":637,"line":713},[635,1900,1823],{"class":768},[635,1902,905],{"class":645},[635,1904,659],{"class":645},[635,1906,1907],{"class":662},"http:\u002F\u002Floki.internal:3100",[635,1909,771],{"class":645},[635,1911,1346],{"class":645},[635,1913,1914,1917,1919,1921,1924,1926],{"class":637,"line":720},[635,1915,1916],{"class":768},"  tenantId",[635,1918,905],{"class":645},[635,1920,659],{"class":645},[635,1922,1923],{"class":662},"team-checkout",[635,1925,771],{"class":645},[635,1927,1346],{"class":645},[635,1929,1930,1932],{"class":637,"line":752},[635,1931,790],{"class":645},[635,1933,793],{"class":649},[618,1935,1937],{"id":1936},"labels-and-cardinality","Labels and cardinality",[1939,1940,1943,1944,1946,1947,1950],"callout",{"color":1941,"icon":1942},"warning","i-lucide-triangle-alert","Never promote a high-cardinality field to a label. Loki creates one stream per unique label combination — labelling ",[541,1945,555],{}," or ",[541,1948,1949],{},"userId"," will create millions of streams and degrade or break your instance.",[522,1952,1953],{},"Add a label only for values you filter on and that have a bounded set:",[625,1955,1958],{"className":627,"code":1956,"filename":1957,"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","server\u002Fplugins\u002Fevlog.ts",[541,1959,1960,1968,1973,2019,2024,2047],{"__ignoreMap":631},[635,1961,1962,1964,1966],{"class":637,"line":638},[635,1963,1780],{"class":729},[635,1965,733],{"class":649},[635,1967,1311],{"class":645},[635,1969,1970],{"class":637,"line":694},[635,1971,1972],{"class":690},"  \u002F\u002F `region` has a handful of values — safe\n",[635,1974,1975,1978,1980,1983,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2012,2014,2017],{"class":637,"line":713},[635,1976,1977],{"class":768},"  labelFields",[635,1979,905],{"class":645},[635,1981,1982],{"class":649}," [",[635,1984,771],{"class":645},[635,1986,543],{"class":662},[635,1988,771],{"class":645},[635,1990,779],{"class":645},[635,1992,659],{"class":645},[635,1994,547],{"class":662},[635,1996,771],{"class":645},[635,1998,779],{"class":645},[635,2000,659],{"class":645},[635,2002,551],{"class":662},[635,2004,771],{"class":645},[635,2006,779],{"class":645},[635,2008,659],{"class":645},[635,2010,2011],{"class":662},"region",[635,2013,771],{"class":645},[635,2015,2016],{"class":649},"]",[635,2018,1346],{"class":645},[635,2020,2021],{"class":637,"line":720},[635,2022,2023],{"class":690},"  \u002F\u002F Static labels for everything in this deployment\n",[635,2025,2026,2029,2031,2033,2036,2038,2040,2043,2045],{"class":637,"line":752},[635,2027,2028],{"class":768},"  labels",[635,2030,905],{"class":645},[635,2032,646],{"class":645},[635,2034,2035],{"class":768}," cluster",[635,2037,905],{"class":645},[635,2039,659],{"class":645},[635,2041,2042],{"class":662},"prod-eu",[635,2044,771],{"class":645},[635,2046,1447],{"class":645},[635,2048,2049,2051],{"class":637,"line":787},[635,2050,790],{"class":645},[635,2052,793],{"class":649},[522,2054,2055],{},"Everything else stays in the JSON line and is fully queryable — see below.",[618,2057,2059],{"id":2058},"querying-in-grafana","Querying in Grafana",[522,2061,2062,2063,905],{},"Filter by label, then reach into the wide event with ",[541,2064,565],{},[625,2066,2070],{"className":2067,"code":2068,"language":2069,"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,2071,2072,2077,2082],{"__ignoreMap":631},[635,2073,2074],{"class":637,"line":638},[635,2075,2076],{},"{service=\"checkout\", environment=\"production\"}\n",[635,2078,2079],{"class":637,"line":694},[635,2080,2081],{},"  | json\n",[635,2083,2084],{"class":637,"line":713},[635,2085,2086],{},"  | status >= 500\n",[625,2088,2090],{"className":2067,"code":2089,"language":2069,"meta":631,"style":631},"# Slow requests on one route\n{service=\"checkout\"} | json | path=\"\u002Fapi\u002Forders\" | duration_ms > 1000\n",[541,2091,2092,2097],{"__ignoreMap":631},[635,2093,2094],{"class":637,"line":638},[635,2095,2096],{},"# Slow requests on one route\n",[635,2098,2099],{"class":637,"line":694},[635,2100,2101],{},"{service=\"checkout\"} | json | path=\"\u002Fapi\u002Forders\" | duration_ms > 1000\n",[625,2103,2105],{"className":2067,"code":2104,"language":2069,"meta":631,"style":631},"# One request end to end\n{service=\"checkout\"} | json | requestId=\"4a8ff3a8-...\"\n",[541,2106,2107,2112],{"__ignoreMap":631},[635,2108,2109],{"class":637,"line":638},[635,2110,2111],{},"# One request end to end\n",[635,2113,2114],{"class":637,"line":694},[635,2115,2116],{},"{service=\"checkout\"} | json | requestId=\"4a8ff3a8-...\"\n",[625,2118,2120],{"className":2067,"code":2119,"language":2069,"meta":631,"style":631},"# Error rate per service\nsum by (service) (rate({environment=\"production\", level=\"error\"}[5m]))\n",[541,2121,2122,2127],{"__ignoreMap":631},[635,2123,2124],{"class":637,"line":638},[635,2125,2126],{},"# Error rate per service\n",[635,2128,2129],{"class":637,"line":694},[635,2130,2131],{},"sum by (service) (rate({environment=\"production\", level=\"error\"}[5m]))\n",[618,2133,2135],{"id":2134},"batching","Batching",[522,2137,2138],{},"Pair the drain with a pipeline to push in batches rather than per request:",[625,2140,2142],{"className":627,"code":2141,"filename":1957,"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,2143,2144,2164,2182,2204,2208,2232,2262,2268,2272,2293,2326],{"__ignoreMap":631},[635,2145,2146,2148,2150,2153,2155,2157,2159,2162],{"class":637,"line":638},[635,2147,642],{"class":641},[635,2149,646],{"class":645},[635,2151,2152],{"class":649}," createDrainPipeline",[635,2154,653],{"class":645},[635,2156,656],{"class":641},[635,2158,659],{"class":645},[635,2160,2161],{"class":662},"evlog\u002Fpipeline",[635,2163,666],{"class":645},[635,2165,2166,2168,2170,2172,2174,2176,2178,2180],{"class":637,"line":694},[635,2167,642],{"class":641},[635,2169,646],{"class":645},[635,2171,650],{"class":649},[635,2173,653],{"class":645},[635,2175,656],{"class":641},[635,2177,659],{"class":645},[635,2179,663],{"class":662},[635,2181,666],{"class":645},[635,2183,2184,2186,2189,2191,2194,2196,2198,2200,2202],{"class":637,"line":713},[635,2185,642],{"class":641},[635,2187,2188],{"class":641}," type",[635,2190,646],{"class":645},[635,2192,2193],{"class":649}," DrainContext",[635,2195,653],{"class":645},[635,2197,656],{"class":641},[635,2199,659],{"class":645},[635,2201,894],{"class":662},[635,2203,666],{"class":645},[635,2205,2206],{"class":637,"line":720},[635,2207,717],{"emptyLinePlaceholder":716},[635,2209,2210,2212,2215,2217,2219,2222,2225,2228,2230],{"class":637,"line":752},[635,2211,865],{"class":745},[635,2213,2214],{"class":649}," pipeline ",[635,2216,871],{"class":645},[635,2218,2152],{"class":729},[635,2220,2221],{"class":645},"\u003C",[635,2223,2224],{"class":1364},"DrainContext",[635,2226,2227],{"class":645},">",[635,2229,733],{"class":649},[635,2231,1311],{"class":645},[635,2233,2234,2237,2239,2241,2244,2246,2250,2252,2255,2257,2260],{"class":637,"line":787},[635,2235,2236],{"class":768},"  batch",[635,2238,905],{"class":645},[635,2240,646],{"class":645},[635,2242,2243],{"class":768}," size",[635,2245,905],{"class":645},[635,2247,2249],{"class":2248},"sbssI"," 100",[635,2251,779],{"class":645},[635,2253,2254],{"class":768}," intervalMs",[635,2256,905],{"class":645},[635,2258,2259],{"class":2248}," 5000",[635,2261,1447],{"class":645},[635,2263,2264,2266],{"class":637,"line":1349},[635,2265,790],{"class":645},[635,2267,793],{"class":649},[635,2269,2270],{"class":637,"line":1356},[635,2271,717],{"emptyLinePlaceholder":716},[635,2273,2275,2277,2279,2281,2283,2285,2287,2289,2291],{"class":637,"line":2274},9,[635,2276,723],{"class":641},[635,2278,726],{"class":641},[635,2280,730],{"class":729},[635,2282,733],{"class":649},[635,2284,733],{"class":645},[635,2286,739],{"class":738},[635,2288,742],{"class":645},[635,2290,746],{"class":745},[635,2292,749],{"class":645},[635,2294,2296,2298,2300,2302,2304,2306,2308,2310,2312,2314,2316,2319,2321,2323],{"class":637,"line":2295},10,[635,2297,755],{"class":649},[635,2299,566],{"class":645},[635,2301,760],{"class":649},[635,2303,566],{"class":645},[635,2305,765],{"class":729},[635,2307,733],{"class":768},[635,2309,771],{"class":645},[635,2311,774],{"class":662},[635,2313,771],{"class":645},[635,2315,779],{"class":645},[635,2317,2318],{"class":729}," pipeline",[635,2320,733],{"class":768},[635,2322,1780],{"class":729},[635,2324,2325],{"class":768},"()))\n",[635,2327,2329,2331],{"class":637,"line":2328},11,[635,2330,790],{"class":645},[635,2332,793],{"class":649},[522,2334,2335],{},"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,2337,2339],{"id":2338},"troubleshooting","Troubleshooting",[522,2341,2342,2347,2348,2350,2351,2353],{},[536,2343,2344],{},[541,2345,2346],{},"Missing endpoint"," — ",[541,2349,675],{}," is unset and no ",[541,2352,1619],{}," was passed. The drain skips silently rather than failing requests.",[522,2355,2356,2361,2362,2364,2365,2368],{},[536,2357,2358],{},[541,2359,2360],{},"Loki API error: 401"," — On Grafana Cloud, check that ",[541,2363,561],{}," is the numeric ",[536,2366,2367],{},"instance ID"," of the Loki datasource, not your account email.",[522,2370,2371,2377,2378,2381],{},[536,2372,2373,2376],{},[541,2374,2375],{},"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,2379,2380],{},"unordered_writes"," in Loki or reduce the batch interval.",[522,2383,2384,2387,2388,2391],{},[536,2385,2386],{},"Nothing appears in Grafana"," — Confirm the label set you are querying. Run ",[541,2389,2390],{},"{service=~\".+\"}"," first to see which streams arrived.",[618,2393,2395],{"id":2394},"direct-api-usage","Direct API usage",[522,2397,2398],{},"Bypass the drain to push events yourself:",[625,2400,2403],{"className":627,"code":2401,"filename":2402,"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,2404,2405,2429,2433,2460],{"__ignoreMap":631},[635,2406,2407,2409,2411,2414,2416,2419,2421,2423,2425,2427],{"class":637,"line":638},[635,2408,642],{"class":641},[635,2410,646],{"class":645},[635,2412,2413],{"class":649}," sendBatchToLoki",[635,2415,779],{"class":645},[635,2417,2418],{"class":649}," sendToLoki",[635,2420,653],{"class":645},[635,2422,656],{"class":641},[635,2424,659],{"class":645},[635,2426,663],{"class":662},[635,2428,666],{"class":645},[635,2430,2431],{"class":637,"line":694},[635,2432,717],{"emptyLinePlaceholder":716},[635,2434,2435,2437,2439,2442,2444,2446,2448,2450,2452,2454,2456,2458],{"class":637,"line":713},[635,2436,1099],{"class":641},[635,2438,2418],{"class":729},[635,2440,2441],{"class":649},"(event",[635,2443,779],{"class":645},[635,2445,646],{"class":645},[635,2447,1787],{"class":768},[635,2449,905],{"class":645},[635,2451,659],{"class":645},[635,2453,596],{"class":662},[635,2455,771],{"class":645},[635,2457,653],{"class":645},[635,2459,793],{"class":649},[635,2461,2462,2464,2466,2469,2471,2473,2475,2477,2479,2481,2483,2485],{"class":637,"line":720},[635,2463,1099],{"class":641},[635,2465,2413],{"class":729},[635,2467,2468],{"class":649},"(events",[635,2470,779],{"class":645},[635,2472,646],{"class":645},[635,2474,1787],{"class":768},[635,2476,905],{"class":645},[635,2478,659],{"class":645},[635,2480,596],{"class":662},[635,2482,771],{"class":645},[635,2484,653],{"class":645},[635,2486,793],{"class":649},[522,2488,2489,544,2492,548,2495,2498],{},[541,2490,2491],{},"buildLokiPayload()",[541,2493,2494],{},"toLokiLabels()",[541,2496,2497],{},"resolveLokiPushUrl()"," are also exported for custom transports.",[618,2500,2502],{"id":2501},"next-steps","Next steps",[2504,2505,2506,2511,2516,2523],"ul",{},[579,2507,2508,2510],{},[526,2509,61],{"href":62}," — control log volume before it reaches Loki",[579,2512,2513,2515],{},[526,2514,421],{"href":422}," — add derived fields to every event",[579,2517,2518,2522],{},[526,2519,2521],{"href":2520},"\u002Flearn\u002Fpipeline","Pipeline"," — batching, retries, and fan-out",[579,2524,2525,2528],{},[526,2526,2527],{"href":138},"Adapters Overview"," — all available destinations",[2530,2531,2532],"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":2534},[2535,2536,2537,2542,2543,2544,2545,2546,2547,2548],{"id":620,"depth":694,"text":20},{"id":669,"depth":694,"text":25},{"id":1469,"depth":694,"text":490,"children":2538},[2539,2540,2541],{"id":1473,"depth":713,"text":1474},{"id":1565,"depth":713,"text":1566},{"id":1593,"depth":713,"text":326},{"id":1761,"depth":694,"text":1762},{"id":1936,"depth":694,"text":1937},{"id":2058,"depth":694,"text":2059},{"id":2134,"depth":694,"text":2135},{"id":2338,"depth":694,"text":2339},{"id":2394,"depth":694,"text":2395},{"id":2501,"depth":694,"text":2502},"Push wide events to Grafana Loki — self-hosted, multi-tenant, or Grafana Cloud — with low-cardinality labels and full JSON querying.","md",[2552,2559],{"label":2553,"icon":2554,"to":2555,"target":2556,"color":2557,"variant":2558},"Loki HTTP API","i-lucide-external-link","https:\u002F\u002Fgrafana.com\u002Fdocs\u002Floki\u002Flatest\u002Freference\u002Floki-http-api\u002F","_blank","neutral","subtle",{"label":2560,"icon":2554,"to":2561,"target":2556,"color":2557,"variant":2558},"LogQL","https:\u002F\u002Fgrafana.com\u002Fdocs\u002Floki\u002Flatest\u002Fquery\u002F",{},{"title":201,"icon":204},{"title":517,"description":2549},"on8BeGIRntDsFuuHKaJil-sFkPJshSYWWVM2JVfEK9s",[2567,2569],{"title":196,"path":197,"stem":198,"description":2568,"icon":199,"children":-1},"Store wide events in an in-memory ring buffer. Works in any runtime — including Cloudflare Workers (workerd) — where the file system is unavailable.",{"title":206,"path":207,"stem":208,"description":2570,"icon":209,"children":-1},"Insert wide events into ClickHouse over the HTTP interface — typed columns for what you aggregate, full JSON for everything else.",1785601315910]