[{"data":1,"prerenderedAt":1320},["ShallowReactive",2],{"navigation_docs":3,"-extend-tail-sampling":424,"-extend-tail-sampling-surround":1315},[4,25,75,230,338,393],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Start","\u002Fstart","1.start",[9,14,19],{"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},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F3.quick-start","i-lucide-zap",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Learn","\u002Flearn","2.learn",[30,35,40,45,50,55,60,65,70],{"title":31,"path":32,"stem":33,"icon":34},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":36,"path":37,"stem":38,"icon":39},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":41,"path":42,"stem":43,"icon":44},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":46,"path":47,"stem":48,"icon":49},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":51,"path":52,"stem":53,"icon":54},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":56,"path":57,"stem":58,"icon":59},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":61,"path":62,"stem":63,"icon":64},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":66,"path":67,"stem":68,"icon":69},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":71,"path":72,"stem":73,"icon":74},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":76,"path":77,"stem":78,"children":79,"page":24},"Integrate","\u002Fintegrate","3.integrate",[80,84,147],{"title":31,"path":81,"stem":82,"icon":83},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":85,"path":86,"stem":87,"children":88,"page":24},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[89,92,132],{"title":31,"path":90,"stem":91,"icon":34},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":93,"path":94,"stem":95,"children":96,"page":24},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[97,102,107,112,117,122,127],{"title":98,"path":99,"stem":100,"icon":101},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":103,"path":104,"stem":105,"icon":106},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":108,"path":109,"stem":110,"icon":111},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":113,"path":114,"stem":115,"icon":116},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":118,"path":119,"stem":120,"icon":121},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":123,"path":124,"stem":125,"icon":126},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":128,"path":129,"stem":130,"icon":131},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":133,"path":134,"stem":135,"children":136,"page":24},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[137,142],{"title":138,"path":139,"stem":140,"icon":141},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":143,"path":144,"stem":145,"icon":146},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":148,"path":149,"stem":150,"children":151,"page":24},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[152,156,161,166,171,176,181,186,191,196,201,206,211,216,220,225],{"title":31,"path":153,"stem":154,"icon":155},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":157,"path":158,"stem":159,"icon":160},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":162,"path":163,"stem":164,"icon":165},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":167,"path":168,"stem":169,"icon":170},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":172,"path":173,"stem":174,"icon":175},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":177,"path":178,"stem":179,"icon":180},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":182,"path":183,"stem":184,"icon":185},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":187,"path":188,"stem":189,"icon":190},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":192,"path":193,"stem":194,"icon":195},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":197,"path":198,"stem":199,"icon":200},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":202,"path":203,"stem":204,"icon":205},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":207,"path":208,"stem":209,"icon":210},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":212,"path":213,"stem":214,"icon":215},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":217,"path":218,"stem":219,"icon":69},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":221,"path":222,"stem":223,"icon":224},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":226,"path":227,"stem":228,"icon":229},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":231,"path":232,"stem":233,"children":234,"page":24},"Use Cases","\u002Fuse-cases","4.use-cases",[235,239,244,273,301,333],{"title":31,"path":236,"stem":237,"icon":238},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":240,"path":241,"stem":242,"icon":243},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":245,"icon":246,"path":247,"stem":248,"children":249,"page":24},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[250,253,258,263,268],{"title":31,"path":251,"stem":252,"icon":34},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":254,"path":255,"stem":256,"icon":257},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":259,"path":260,"stem":261,"icon":262},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":264,"path":265,"stem":266,"icon":267},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":269,"path":270,"stem":271,"icon":272},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":274,"icon":275,"path":276,"stem":277,"children":278,"page":24},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[279,282,287,292,296],{"title":31,"path":280,"stem":281,"icon":34},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":283,"path":284,"stem":285,"icon":286},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":288,"path":289,"stem":290,"icon":291},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":293,"path":294,"stem":295,"icon":243},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":297,"path":298,"stem":299,"icon":300},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":24},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[307,310,315,320,325,329],{"title":31,"path":308,"stem":309,"icon":34},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":311,"path":312,"stem":313,"icon":314},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":316,"path":317,"stem":318,"icon":319},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":321,"path":322,"stem":323,"icon":324},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":326,"path":327,"stem":328,"icon":303},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":330,"path":331,"stem":332,"icon":74},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":334,"path":335,"stem":336,"icon":337},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":339,"path":340,"stem":341,"children":342,"page":24},"Extend","\u002Fextend","5.extend",[343,347,352,357,362,366,370,374,378,383,388],{"title":31,"path":344,"stem":345,"icon":346},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":348,"path":349,"stem":350,"icon":351},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":353,"path":354,"stem":355,"icon":356},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":358,"path":359,"stem":360,"icon":361},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":330,"path":363,"stem":364,"icon":365},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":367,"path":368,"stem":369,"icon":346},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":371,"path":372,"stem":373,"icon":337},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":375,"path":376,"stem":377,"icon":59},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":379,"path":380,"stem":381,"icon":382},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":384,"path":385,"stem":386,"icon":387},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":389,"path":390,"stem":391,"icon":392},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":394,"path":395,"stem":396,"children":397,"page":24},"Reference","\u002Freference","6.reference",[398,403,406,411,415,420],{"title":399,"path":400,"stem":401,"icon":402},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":297,"path":404,"stem":405,"icon":300},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":407,"path":408,"stem":409,"icon":410},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":412,"path":413,"stem":414,"icon":303},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":416,"path":417,"stem":418,"icon":419},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":421,"path":422,"stem":423,"icon":337},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":425,"title":426,"body":427,"description":1303,"extension":1304,"links":1305,"meta":1311,"navigation":1312,"path":376,"seo":1313,"stem":377,"__hash__":1314},"docs\u002F5.extend\u002F6.tail-sampling.md","Tail Sampling",{"type":428,"value":429,"toc":1296},"minimark",[430,433,445,465,525,530,536,566,570,573,920,923,927,944,1114,1121,1125,1131,1257,1268,1272,1292],[431,432],"tail-sample-decision",{},[434,435,436,439,440,444],"p",{},[437,438,375],"strong",{}," is a decision made ",[441,442,443],"em",{},"after"," the request runs, with full knowledge of its outcome (status, duration, errors, custom flags). It's how you keep all errors and slow requests while throwing away the bulk of healthy traffic — the opposite of head sampling, which decides up front before knowing what happens.",[434,446,447,448,452,453,456,457,460,461,464],{},"The full theory and config reference — built-in ",[449,450,451],"code",{},"keep"," rules, custom predicates via ",[449,454,455],{},"evlog:emit:keep",", combining head + tail sampling — lives at ",[458,459,56],"a",{"href":57},". This page covers the ",[437,462,463],{},"extension surface",": how to plug your own keep logic into the pipeline.",[466,467,470,473,517],"prompt",{":actions":468,"description":469,"icon":59},"[\"copy\",\"cursor\",\"windsurf\"]","Configure tail sampling on evlog",[434,471,472],{},"Set up tail sampling so I keep all errors and slow requests while dropping healthy noise.",[474,475,476,483,497,500,510],"ul",{},[477,478,479,480],"li",{},"Start with the built-in declarative rules: ",[449,481,482],{},"evlog.sampling.keep = { status: '>=400', duration: '>1000', path: ['\u002Fapi\u002Fauth\u002F*'] }",[477,484,485,486,488,489,492,493,496],{},"For multi-field or derived conditions, register an ",[449,487,455],{}," hook (Nitro: ",[449,490,491],{},"nitroApp.hooks.hook('evlog:emit:keep', (ctx) => ...)","); set ",[449,494,495],{},"ctx.shouldKeep = true"," to keep",[477,498,499],{},"Keep the hook fast — it runs on every request after enrichment; no I\u002FO, no async work",[477,501,502,503,506,507,509],{},"Combine with head sampling (e.g. 10% of healthy traffic) by setting both ",[449,504,505],{},"sample"," (head) and ",[449,508,451],{}," (tail)",[477,511,512,513,516],{},"Always keep error events (",[449,514,515],{},"level: 'error'",") regardless of sampling; double-check rules don't accidentally drop them",[434,518,519,520],{},"Docs: ",[458,521,522],{"href":522,"rel":523},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Ftail-sampling",[524],"nofollow",[526,527,529],"h2",{"id":528},"when-the-built-in-rules-arent-enough","When the built-in rules aren't enough",[434,531,532,533,535],{},"The built-in declarative ",[449,534,451],{}," rules cover the typical cases (status code thresholds, duration thresholds, path matching, level matching). Drop to a custom hook when you need:",[474,537,538,552,560],{},[477,539,540,543,544,547,548,551],{},[437,541,542],{},"Conditional logic on more than one field"," (e.g. \"keep if ",[449,545,546],{},"status >= 500"," AND ",[449,549,550],{},"user.plan === 'enterprise'","\")",[477,553,554,543,557,551],{},[437,555,556],{},"Keep based on a derived value",[449,558,559],{},"event.audit?.context.actor.role === 'admin'",[477,561,562,565],{},[437,563,564],{},"Stateful decisions"," (rare; needs care since sampling runs in the hot path)",[526,567,569],{"id":568},"custom-keep-hook","Custom keep hook",[434,571,572],{},"The hook signature is the same regardless of framework. The wiring depends on your runtime.",[574,575,576,735],"code-group",{},[577,578,584],"pre",{"className":579,"code":580,"filename":581,"language":582,"meta":583,"style":583},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","nitroApp.hooks.hook('evlog:emit:keep', (ctx) => {\n  if (ctx.context.user?.plan === 'enterprise' && ctx.status >= 500) {\n    ctx.shouldKeep = true\n  }\n})\n","Nuxt \u002F Nitro","ts","",[449,585,586,639,702,720,726],{"__ignoreMap":583},[587,588,591,595,599,602,604,608,611,614,617,619,622,625,629,632,636],"span",{"class":589,"line":590},"line",1,[587,592,594],{"class":593},"sTEyZ","nitroApp",[587,596,598],{"class":597},"sMK4o",".",[587,600,601],{"class":593},"hooks",[587,603,598],{"class":597},[587,605,607],{"class":606},"s2Zo4","hook",[587,609,610],{"class":593},"(",[587,612,613],{"class":597},"'",[587,615,455],{"class":616},"sfazB",[587,618,613],{"class":597},[587,620,621],{"class":597},",",[587,623,624],{"class":597}," (",[587,626,628],{"class":627},"sHdIc","ctx",[587,630,631],{"class":597},")",[587,633,635],{"class":634},"spNyl"," =>",[587,637,638],{"class":597}," {\n",[587,640,642,646,649,651,653,656,658,661,664,667,670,673,676,678,681,684,686,689,692,696,699],{"class":589,"line":641},2,[587,643,645],{"class":644},"s7zQu","  if",[587,647,624],{"class":648},"swJcz",[587,650,628],{"class":593},[587,652,598],{"class":597},[587,654,655],{"class":593},"context",[587,657,598],{"class":597},[587,659,660],{"class":593},"user",[587,662,663],{"class":597},"?.",[587,665,666],{"class":593},"plan",[587,668,669],{"class":597}," ===",[587,671,672],{"class":597}," '",[587,674,675],{"class":616},"enterprise",[587,677,613],{"class":597},[587,679,680],{"class":597}," &&",[587,682,683],{"class":593}," ctx",[587,685,598],{"class":597},[587,687,688],{"class":593},"status",[587,690,691],{"class":597}," >=",[587,693,695],{"class":694},"sbssI"," 500",[587,697,698],{"class":648},") ",[587,700,701],{"class":597},"{\n",[587,703,705,708,710,713,716],{"class":589,"line":704},3,[587,706,707],{"class":593},"    ctx",[587,709,598],{"class":597},[587,711,712],{"class":593},"shouldKeep",[587,714,715],{"class":597}," =",[587,717,719],{"class":718},"sfNiH"," true\n",[587,721,723],{"class":589,"line":722},4,[587,724,725],{"class":597},"  }\n",[587,727,729,732],{"class":589,"line":728},5,[587,730,731],{"class":597},"}",[587,733,734],{"class":593},")\n",[577,736,739],{"className":579,"code":737,"filename":738,"language":582,"meta":583,"style":583},"import { definePlugin } from 'evlog\u002Ftoolkit'\n\nexport const keepEnterpriseErrors = definePlugin({\n  name: 'keep-enterprise-errors',\n  keep(ctx) {\n    if (ctx.context.user?.plan === 'enterprise' && ctx.status >= 500) {\n      ctx.shouldKeep = true\n    }\n  },\n})\n\n\u002F\u002F Then: initLogger({ plugins: [keepEnterpriseErrors] })\n\u002F\u002F   or: app.use(evlog({ plugins: [keepEnterpriseErrors] }))\n","Plugin (any framework)",[449,740,741,766,772,792,810,823,869,883,889,895,902,907,914],{"__ignoreMap":583},[587,742,743,746,749,752,755,758,760,763],{"class":589,"line":590},[587,744,745],{"class":644},"import",[587,747,748],{"class":597}," {",[587,750,751],{"class":593}," definePlugin",[587,753,754],{"class":597}," }",[587,756,757],{"class":644}," from",[587,759,672],{"class":597},[587,761,762],{"class":616},"evlog\u002Ftoolkit",[587,764,765],{"class":597},"'\n",[587,767,768],{"class":589,"line":641},[587,769,771],{"emptyLinePlaceholder":770},true,"\n",[587,773,774,777,780,783,786,788,790],{"class":589,"line":704},[587,775,776],{"class":644},"export",[587,778,779],{"class":634}," const",[587,781,782],{"class":593}," keepEnterpriseErrors ",[587,784,785],{"class":597},"=",[587,787,751],{"class":606},[587,789,610],{"class":593},[587,791,701],{"class":597},[587,793,794,797,800,802,805,807],{"class":589,"line":722},[587,795,796],{"class":648},"  name",[587,798,799],{"class":597},":",[587,801,672],{"class":597},[587,803,804],{"class":616},"keep-enterprise-errors",[587,806,613],{"class":597},[587,808,809],{"class":597},",\n",[587,811,812,815,817,819,821],{"class":589,"line":728},[587,813,814],{"class":648},"  keep",[587,816,610],{"class":597},[587,818,628],{"class":627},[587,820,631],{"class":597},[587,822,638],{"class":597},[587,824,826,829,831,833,835,837,839,841,843,845,847,849,851,853,855,857,859,861,863,865,867],{"class":589,"line":825},6,[587,827,828],{"class":644},"    if",[587,830,624],{"class":648},[587,832,628],{"class":593},[587,834,598],{"class":597},[587,836,655],{"class":593},[587,838,598],{"class":597},[587,840,660],{"class":593},[587,842,663],{"class":597},[587,844,666],{"class":593},[587,846,669],{"class":597},[587,848,672],{"class":597},[587,850,675],{"class":616},[587,852,613],{"class":597},[587,854,680],{"class":597},[587,856,683],{"class":593},[587,858,598],{"class":597},[587,860,688],{"class":593},[587,862,691],{"class":597},[587,864,695],{"class":694},[587,866,698],{"class":648},[587,868,701],{"class":597},[587,870,872,875,877,879,881],{"class":589,"line":871},7,[587,873,874],{"class":593},"      ctx",[587,876,598],{"class":597},[587,878,712],{"class":593},[587,880,715],{"class":597},[587,882,719],{"class":718},[587,884,886],{"class":589,"line":885},8,[587,887,888],{"class":597},"    }\n",[587,890,892],{"class":589,"line":891},9,[587,893,894],{"class":597},"  },\n",[587,896,898,900],{"class":589,"line":897},10,[587,899,731],{"class":597},[587,901,734],{"class":593},[587,903,905],{"class":589,"line":904},11,[587,906,771],{"emptyLinePlaceholder":770},[587,908,910],{"class":589,"line":909},12,[587,911,913],{"class":912},"sHwdD","\u002F\u002F Then: initLogger({ plugins: [keepEnterpriseErrors] })\n",[587,915,917],{"class":589,"line":916},13,[587,918,919],{"class":912},"\u002F\u002F   or: app.use(evlog({ plugins: [keepEnterpriseErrors] }))\n",[434,921,922],{},"For non-trivial logic, prefer the plugin shape — it travels with the rest of your evlog config (drains, enrichers) and is reusable across frameworks.",[526,924,926],{"id":925},"composing-several-keep-predicates","Composing several keep predicates",[434,928,929,930,933,934,936,937,939,940,943],{},"Use ",[449,931,932],{},"composeKeep"," from ",[449,935,762],{}," to combine multiple predicates into one hook. Each predicate runs independently and the final ",[449,938,712],{}," is ",[449,941,942],{},"true"," if any of them set it:",[577,945,947],{"className":579,"code":946,"language":582,"meta":583,"style":583},"import { composeKeep } from 'evlog\u002Ftoolkit'\n\nconst keep = composeKeep([\n  ({ duration, shouldKeep }) => duration && duration > 2000 ? true : shouldKeep,\n  ({ event }) => event.level === 'error',\n  ({ context, status }) => context.user?.plan === 'enterprise' && status >= 500,\n])\n",[449,948,949,968,972,987,1032,1062,1109],{"__ignoreMap":583},[587,950,951,953,955,958,960,962,964,966],{"class":589,"line":590},[587,952,745],{"class":644},[587,954,748],{"class":597},[587,956,957],{"class":593}," composeKeep",[587,959,754],{"class":597},[587,961,757],{"class":644},[587,963,672],{"class":597},[587,965,762],{"class":616},[587,967,765],{"class":597},[587,969,970],{"class":589,"line":641},[587,971,771],{"emptyLinePlaceholder":770},[587,973,974,977,980,982,984],{"class":589,"line":704},[587,975,976],{"class":634},"const",[587,978,979],{"class":593}," keep ",[587,981,785],{"class":597},[587,983,957],{"class":606},[587,985,986],{"class":593},"([\n",[587,988,989,992,995,997,1000,1003,1005,1008,1011,1013,1016,1019,1022,1025,1028,1030],{"class":589,"line":722},[587,990,991],{"class":597},"  ({",[587,993,994],{"class":627}," duration",[587,996,621],{"class":597},[587,998,999],{"class":627}," shouldKeep",[587,1001,1002],{"class":597}," })",[587,1004,635],{"class":634},[587,1006,1007],{"class":593}," duration ",[587,1009,1010],{"class":597},"&&",[587,1012,1007],{"class":593},[587,1014,1015],{"class":597},">",[587,1017,1018],{"class":694}," 2000",[587,1020,1021],{"class":597}," ?",[587,1023,1024],{"class":718}," true",[587,1026,1027],{"class":597}," :",[587,1029,999],{"class":593},[587,1031,809],{"class":597},[587,1033,1034,1036,1039,1041,1043,1045,1047,1050,1053,1055,1058,1060],{"class":589,"line":728},[587,1035,991],{"class":597},[587,1037,1038],{"class":627}," event",[587,1040,1002],{"class":597},[587,1042,635],{"class":634},[587,1044,1038],{"class":593},[587,1046,598],{"class":597},[587,1048,1049],{"class":593},"level ",[587,1051,1052],{"class":597},"===",[587,1054,672],{"class":597},[587,1056,1057],{"class":616},"error",[587,1059,613],{"class":597},[587,1061,809],{"class":597},[587,1063,1064,1066,1069,1071,1074,1076,1078,1080,1082,1084,1086,1089,1091,1093,1095,1097,1099,1102,1105,1107],{"class":589,"line":825},[587,1065,991],{"class":597},[587,1067,1068],{"class":627}," context",[587,1070,621],{"class":597},[587,1072,1073],{"class":627}," status",[587,1075,1002],{"class":597},[587,1077,635],{"class":634},[587,1079,1068],{"class":593},[587,1081,598],{"class":597},[587,1083,660],{"class":593},[587,1085,663],{"class":597},[587,1087,1088],{"class":593},"plan ",[587,1090,1052],{"class":597},[587,1092,672],{"class":597},[587,1094,675],{"class":616},[587,1096,613],{"class":597},[587,1098,680],{"class":597},[587,1100,1101],{"class":593}," status ",[587,1103,1104],{"class":597},">=",[587,1106,695],{"class":694},[587,1108,809],{"class":597},[587,1110,1111],{"class":589,"line":871},[587,1112,1113],{"class":593},"])\n",[434,1115,1116,1117,1120],{},"Errors in individual predicates are isolated (logged with the ",[449,1118,1119],{},"[evlog\u002Fkeep]"," prefix) so a buggy predicate cannot silently drop legitimate events.",[526,1122,1124],{"id":1123},"what-you-receive","What you receive",[434,1126,1127,1128,799],{},"The keep hook gets a ",[449,1129,1130],{},"TailSamplingContext",[577,1132,1134],{"className":579,"code":1133,"language":582,"meta":583,"style":583},"interface TailSamplingContext {\n  \u002F** The event level (debug | info | warn | error) *\u002F\n  level: string\n  \u002F** HTTP response status, if known *\u002F\n  status?: number\n  \u002F** Request duration in milliseconds, if measured *\u002F\n  duration?: number\n  \u002F** The full accumulated context (everything log.set'd) *\u002F\n  context: Record\u003Cstring, unknown>\n  \u002F** The fully enriched event ready to drain *\u002F\n  event: WideEvent\n  \u002F** Mutable: set to true to force-keep this event *\u002F\n  shouldKeep: boolean\n}\n",[449,1135,1136,1147,1152,1162,1167,1178,1183,1192,1197,1221,1226,1236,1241,1251],{"__ignoreMap":583},[587,1137,1138,1141,1145],{"class":589,"line":590},[587,1139,1140],{"class":634},"interface",[587,1142,1144],{"class":1143},"sBMFI"," TailSamplingContext",[587,1146,638],{"class":597},[587,1148,1149],{"class":589,"line":641},[587,1150,1151],{"class":912},"  \u002F** The event level (debug | info | warn | error) *\u002F\n",[587,1153,1154,1157,1159],{"class":589,"line":704},[587,1155,1156],{"class":648},"  level",[587,1158,799],{"class":597},[587,1160,1161],{"class":1143}," string\n",[587,1163,1164],{"class":589,"line":722},[587,1165,1166],{"class":912},"  \u002F** HTTP response status, if known *\u002F\n",[587,1168,1169,1172,1175],{"class":589,"line":728},[587,1170,1171],{"class":648},"  status",[587,1173,1174],{"class":597},"?:",[587,1176,1177],{"class":1143}," number\n",[587,1179,1180],{"class":589,"line":825},[587,1181,1182],{"class":912},"  \u002F** Request duration in milliseconds, if measured *\u002F\n",[587,1184,1185,1188,1190],{"class":589,"line":871},[587,1186,1187],{"class":648},"  duration",[587,1189,1174],{"class":597},[587,1191,1177],{"class":1143},[587,1193,1194],{"class":589,"line":885},[587,1195,1196],{"class":912},"  \u002F** The full accumulated context (everything log.set'd) *\u002F\n",[587,1198,1199,1202,1204,1207,1210,1213,1215,1218],{"class":589,"line":891},[587,1200,1201],{"class":648},"  context",[587,1203,799],{"class":597},[587,1205,1206],{"class":1143}," Record",[587,1208,1209],{"class":597},"\u003C",[587,1211,1212],{"class":1143},"string",[587,1214,621],{"class":597},[587,1216,1217],{"class":1143}," unknown",[587,1219,1220],{"class":597},">\n",[587,1222,1223],{"class":589,"line":897},[587,1224,1225],{"class":912},"  \u002F** The fully enriched event ready to drain *\u002F\n",[587,1227,1228,1231,1233],{"class":589,"line":904},[587,1229,1230],{"class":648},"  event",[587,1232,799],{"class":597},[587,1234,1235],{"class":1143}," WideEvent\n",[587,1237,1238],{"class":589,"line":909},[587,1239,1240],{"class":912},"  \u002F** Mutable: set to true to force-keep this event *\u002F\n",[587,1242,1243,1246,1248],{"class":589,"line":916},[587,1244,1245],{"class":648},"  shouldKeep",[587,1247,799],{"class":597},[587,1249,1250],{"class":1143}," boolean\n",[587,1252,1254],{"class":589,"line":1253},14,[587,1255,1256],{"class":597},"}\n",[434,1258,1259,1260,1263,1264,1267],{},"Setting ",[449,1261,1262],{},"shouldKeep = true"," forces the event through. Setting ",[449,1265,1266],{},"shouldKeep = false"," is a no-op (other predicates may still keep it; the head sampler decides the default).",[526,1269,1271],{"id":1270},"next-steps","Next steps",[474,1273,1274,1282,1287],{},[477,1275,1276,1278,1279,1281],{},[458,1277,56],{"href":57}," — head sampling, tail sampling, the built-in declarative ",[449,1280,451],{}," rules",[477,1283,1284,1286],{},[458,1285,367],{"href":368}," — when keep belongs in a multi-hook plugin",[477,1288,1289,1291],{},[458,1290,412],{"href":413}," — keep all errors, double-check the rules",[1293,1294,1295],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":583,"searchDepth":641,"depth":641,"links":1297},[1298,1299,1300,1301,1302],{"id":528,"depth":641,"text":529},{"id":568,"depth":641,"text":569},{"id":925,"depth":641,"text":926},{"id":1123,"depth":641,"text":1124},{"id":1270,"depth":641,"text":1271},"Decide post-hoc whether to keep an event with full knowledge of its outcome (status, duration, errors). The opposite of head sampling — keep all errors and slow requests while throwing away healthy noise.","md",[1306,1310],{"label":1307,"icon":59,"to":57,"color":1308,"variant":1309},"Sampling Reference","neutral","subtle",{"label":367,"icon":346,"to":368,"color":1308,"variant":1309},{},{"title":375,"icon":59},{"title":426,"description":1303},"_8j_omsdjeXznqcjWnH-m1ejJ9pMYcd-Akae8AXYlTs",[1316,1318],{"title":371,"path":372,"stem":373,"description":1317,"icon":337,"children":-1},"Write custom enrichers to add derived context to your wide events. Add deployment metadata, tenant IDs, feature flags, geo, or any computed data — the toolkit handles error isolation, undefined skipping, and the merge step.",{"title":379,"path":380,"stem":381,"description":1319,"icon":382,"children":-1},"Every drain request sent by evlog is tagged with User-Agent and X-Evlog-Source headers so receivers can identify and triage the traffic. Override or suppress them when your custom drain needs different identity.",1778360835312]