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