[{"data":1,"prerenderedAt":2871},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-express":219,"-frameworks-express-surround":2866},[4,30,105,139,188,205],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","/getting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","/getting-started/agent-skills","1.getting-started/4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Frameworks","/frameworks","2.frameworks",[35,40,45,50,55,60,65,70,75,80,85,90,95,100],{"title":36,"path":37,"stem":38,"icon":39},"Overview","/frameworks/overview","2.frameworks/00.overview","i-lucide-layout-grid",{"title":41,"path":42,"stem":43,"icon":44},"Nuxt","/frameworks/nuxt","2.frameworks/01.nuxt","i-simple-icons-nuxtdotjs",{"title":46,"path":47,"stem":48,"icon":49},"Next.js","/frameworks/nextjs","2.frameworks/02.nextjs","i-simple-icons-nextdotjs",{"title":51,"path":52,"stem":53,"icon":54},"SvelteKit","/frameworks/sveltekit","2.frameworks/03.sveltekit","i-simple-icons-svelte",{"title":56,"path":57,"stem":58,"icon":59},"Nitro","/frameworks/nitro","2.frameworks/04.nitro","i-custom-nitro",{"title":61,"path":62,"stem":63,"icon":64},"TanStack Start","/frameworks/tanstack-start","2.frameworks/05.tanstack-start","i-custom-tanstack",{"title":66,"path":67,"stem":68,"icon":69},"NestJS","/frameworks/nestjs","2.frameworks/06.nestjs","i-simple-icons-nestjs",{"title":71,"path":72,"stem":73,"icon":74},"Express","/frameworks/express","2.frameworks/07.express","i-simple-icons-express",{"title":76,"path":77,"stem":78,"icon":79},"Hono","/frameworks/hono","2.frameworks/08.hono","i-simple-icons-hono",{"title":81,"path":82,"stem":83,"icon":84},"Fastify","/frameworks/fastify","2.frameworks/09.fastify","i-simple-icons-fastify",{"title":86,"path":87,"stem":88,"icon":89},"Elysia","/frameworks/elysia","2.frameworks/10.elysia","i-custom-elysia",{"title":91,"path":92,"stem":93,"icon":94},"Cloudflare Workers","/frameworks/cloudflare-workers","2.frameworks/11.cloudflare-workers","i-simple-icons-cloudflare",{"title":96,"path":97,"stem":98,"icon":99},"Standalone","/frameworks/standalone","2.frameworks/12.standalone","i-simple-icons-typescript",{"title":101,"path":102,"stem":103,"icon":104},"Astro","/frameworks/astro","2.frameworks/13.astro","i-simple-icons-astro",{"title":106,"path":107,"stem":108,"children":109,"page":29},"Core Concepts","/core-concepts","3.core-concepts",[110,115,120,125,129,134],{"title":111,"path":112,"stem":113,"icon":114},"Wide Events","/core-concepts/wide-events","3.core-concepts/1.wide-events","i-lucide-layers",{"title":116,"path":117,"stem":118,"icon":119},"Structured Errors","/core-concepts/structured-errors","3.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":121,"path":122,"stem":123,"icon":124},"Best Practices","/core-concepts/best-practices","3.core-concepts/3.best-practices","i-lucide-shield-check",{"title":126,"path":127,"stem":128,"icon":99},"Typed Fields","/core-concepts/typed-fields","3.core-concepts/4.typed-fields",{"title":130,"path":131,"stem":132,"icon":133},"Sampling","/core-concepts/sampling","3.core-concepts/5.sampling","i-lucide-filter",{"title":135,"path":136,"stem":137,"icon":138},"Client Logging","/core-concepts/client-logging","3.core-concepts/6.client-logging","i-lucide-monitor",{"title":140,"path":141,"stem":142,"children":143,"page":29},"Adapters","/adapters","4.adapters",[144,148,153,158,163,168,173,178,183],{"title":36,"path":145,"stem":146,"icon":147},"/adapters/overview","4.adapters/1.overview","i-custom-plug",{"title":149,"path":150,"stem":151,"icon":152},"Axiom","/adapters/axiom","4.adapters/2.axiom","i-custom-axiom",{"title":154,"path":155,"stem":156,"icon":157},"OTLP","/adapters/otlp","4.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":159,"path":160,"stem":161,"icon":162},"PostHog","/adapters/posthog","4.adapters/4.posthog","i-simple-icons-posthog",{"title":164,"path":165,"stem":166,"icon":167},"Sentry","/adapters/sentry","4.adapters/5.sentry","i-simple-icons-sentry",{"title":169,"path":170,"stem":171,"icon":172},"Better Stack","/adapters/better-stack","4.adapters/6.better-stack","i-simple-icons-betterstack",{"title":174,"path":175,"stem":176,"icon":177},"Custom Adapters","/adapters/custom","4.adapters/7.custom","i-lucide-code",{"title":179,"path":180,"stem":181,"icon":182},"Pipeline","/adapters/pipeline","4.adapters/8.pipeline","i-lucide-workflow",{"title":184,"path":185,"stem":186,"icon":187},"Browser","/adapters/browser","4.adapters/9.browser","i-lucide-globe",{"title":189,"path":190,"stem":191,"children":192,"page":29},"Enrichers","/enrichers","5.enrichers",[193,196,201],{"title":36,"path":194,"stem":195,"icon":28},"/enrichers/overview","5.enrichers/1.overview",{"title":197,"path":198,"stem":199,"icon":200},"Built-in","/enrichers/built-in","5.enrichers/2.built-in","i-lucide-puzzle",{"title":202,"path":203,"stem":204,"icon":177},"Custom","/enrichers/custom","5.enrichers/3.custom",{"title":206,"path":207,"stem":208,"children":209,"page":29},"NuxtHub","/nuxthub","6.nuxthub",[210,214],{"title":36,"path":211,"stem":212,"icon":213},"/nuxthub/overview","6.nuxthub/1.overview","i-lucide-database",{"title":215,"path":216,"stem":217,"icon":218},"Retention","/nuxthub/retention","6.nuxthub/2.retention","i-lucide-clock",{"id":220,"title":71,"body":221,"description":2857,"extension":2858,"links":2859,"meta":2862,"navigation":2863,"path":72,"seo":2864,"stem":73,"__hash__":2865},"docs/2.frameworks/07.express.md",{"type":222,"value":223,"toc":2838},"minimark",[224,237,241,246,274,278,600,606,609,612,919,922,986,990,999,1184,1293,1309,1313,1331,1671,1674,1740,1744,1747,1914,1918,1925,2117,2131,2135,2141,2245,2249,2259,2402,2406,2412,2416,2570,2574,2581,2762,2770,2774,2815,2824,2834],[225,226,227,228,232,233,236],"p",{},"The ",[229,230,231],"code",{},"evlog/express"," middleware auto-creates a request-scoped logger on ",[229,234,235],{},"req.log"," and emits a wide event when the response finishes.",[238,239,20],"h2",{"id":240},"quick-start",[242,243,245],"h3",{"id":244},"_1-install","1. Install",[247,248,253],"pre",{"className":249,"code":250,"language":251,"meta":252,"style":252},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add evlog express\n","bash","",[229,254,255],{"__ignoreMap":252},[256,257,260,264,268,271],"span",{"class":258,"line":259},"line",1,[256,261,263],{"class":262},"sBMFI","bun",[256,265,267],{"class":266},"sfazB"," add",[256,269,270],{"class":266}," evlog",[256,272,273],{"class":266}," express\n",[242,275,277],{"id":276},"_2-initialize-and-register-the-middleware","2. Initialize and register the middleware",[247,279,284],{"className":280,"code":281,"filename":282,"language":283,"meta":252,"style":252},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import express from 'express'\nimport { initLogger } from 'evlog'\nimport { evlog } from 'evlog/express'\n\ninitLogger({\n  env: { service: 'my-api' },\n})\n\nconst app = express()\n\napp.use(evlog())\n\napp.get('/health', (req, res) => {\n  req.log.set({ route: 'health' })\n  res.json({ ok: true })\n})\n\napp.listen(3000)\n","src/index.ts","typescript",[229,285,286,309,333,352,359,372,400,409,414,433,438,457,462,505,542,570,577,582],{"__ignoreMap":252},[256,287,288,292,296,299,303,306],{"class":258,"line":259},[256,289,291],{"class":290},"s7zQu","import",[256,293,295],{"class":294},"sTEyZ"," express ",[256,297,298],{"class":290},"from",[256,300,302],{"class":301},"sMK4o"," '",[256,304,305],{"class":266},"express",[256,307,308],{"class":301},"'\n",[256,310,312,314,317,320,323,326,328,331],{"class":258,"line":311},2,[256,313,291],{"class":290},[256,315,316],{"class":301}," {",[256,318,319],{"class":294}," initLogger",[256,321,322],{"class":301}," }",[256,324,325],{"class":290}," from",[256,327,302],{"class":301},[256,329,330],{"class":266},"evlog",[256,332,308],{"class":301},[256,334,336,338,340,342,344,346,348,350],{"class":258,"line":335},3,[256,337,291],{"class":290},[256,339,316],{"class":301},[256,341,270],{"class":294},[256,343,322],{"class":301},[256,345,325],{"class":290},[256,347,302],{"class":301},[256,349,231],{"class":266},[256,351,308],{"class":301},[256,353,355],{"class":258,"line":354},4,[256,356,358],{"emptyLinePlaceholder":357},true,"\n",[256,360,362,366,369],{"class":258,"line":361},5,[256,363,365],{"class":364},"s2Zo4","initLogger",[256,367,368],{"class":294},"(",[256,370,371],{"class":301},"{\n",[256,373,375,379,382,384,387,389,391,394,397],{"class":258,"line":374},6,[256,376,378],{"class":377},"swJcz","  env",[256,380,381],{"class":301},":",[256,383,316],{"class":301},[256,385,386],{"class":377}," service",[256,388,381],{"class":301},[256,390,302],{"class":301},[256,392,393],{"class":266},"my-api",[256,395,396],{"class":301},"'",[256,398,399],{"class":301}," },\n",[256,401,403,406],{"class":258,"line":402},7,[256,404,405],{"class":301},"}",[256,407,408],{"class":294},")\n",[256,410,412],{"class":258,"line":411},8,[256,413,358],{"emptyLinePlaceholder":357},[256,415,417,421,424,427,430],{"class":258,"line":416},9,[256,418,420],{"class":419},"spNyl","const",[256,422,423],{"class":294}," app ",[256,425,426],{"class":301},"=",[256,428,429],{"class":364}," express",[256,431,432],{"class":294},"()\n",[256,434,436],{"class":258,"line":435},10,[256,437,358],{"emptyLinePlaceholder":357},[256,439,441,444,447,450,452,454],{"class":258,"line":440},11,[256,442,443],{"class":294},"app",[256,445,446],{"class":301},".",[256,448,449],{"class":364},"use",[256,451,368],{"class":294},[256,453,330],{"class":364},[256,455,456],{"class":294},"())\n",[256,458,460],{"class":258,"line":459},12,[256,461,358],{"emptyLinePlaceholder":357},[256,463,465,467,469,472,474,476,479,481,484,487,491,493,496,499,502],{"class":258,"line":464},13,[256,466,443],{"class":294},[256,468,446],{"class":301},[256,470,471],{"class":364},"get",[256,473,368],{"class":294},[256,475,396],{"class":301},[256,477,478],{"class":266},"/health",[256,480,396],{"class":301},[256,482,483],{"class":301},",",[256,485,486],{"class":301}," (",[256,488,490],{"class":489},"sHdIc","req",[256,492,483],{"class":301},[256,494,495],{"class":489}," res",[256,497,498],{"class":301},")",[256,500,501],{"class":419}," =>",[256,503,504],{"class":301}," {\n",[256,506,508,511,513,516,518,521,523,526,529,531,533,536,538,540],{"class":258,"line":507},14,[256,509,510],{"class":294},"  req",[256,512,446],{"class":301},[256,514,515],{"class":294},"log",[256,517,446],{"class":301},[256,519,520],{"class":364},"set",[256,522,368],{"class":377},[256,524,525],{"class":301},"{",[256,527,528],{"class":377}," route",[256,530,381],{"class":301},[256,532,302],{"class":301},[256,534,535],{"class":266},"health",[256,537,396],{"class":301},[256,539,322],{"class":301},[256,541,408],{"class":377},[256,543,545,548,550,553,555,557,560,562,566,568],{"class":258,"line":544},15,[256,546,547],{"class":294},"  res",[256,549,446],{"class":301},[256,551,552],{"class":364},"json",[256,554,368],{"class":377},[256,556,525],{"class":301},[256,558,559],{"class":377}," ok",[256,561,381],{"class":301},[256,563,565],{"class":564},"sfNiH"," true",[256,567,322],{"class":301},[256,569,408],{"class":377},[256,571,573,575],{"class":258,"line":572},16,[256,574,405],{"class":301},[256,576,408],{"class":294},[256,578,580],{"class":258,"line":579},17,[256,581,358],{"emptyLinePlaceholder":357},[256,583,585,587,589,592,594,598],{"class":258,"line":584},18,[256,586,443],{"class":294},[256,588,446],{"class":301},[256,590,591],{"class":364},"listen",[256,593,368],{"class":294},[256,595,597],{"class":596},"sbssI","3000",[256,599,408],{"class":294},[225,601,602,603,605],{},"The logger is available on ",[229,604,235],{}," with full TypeScript support via module augmentation — no extra type annotations needed.",[238,607,111],{"id":608},"wide-events",[225,610,611],{},"Build up context progressively through your handler. One request = one wide event:",[247,613,615],{"className":280,"code":614,"filename":282,"language":283,"meta":252,"style":252},"app.get('/users/:id', async (req, res) => {\n  const userId = req.params.id\n\n  req.log.set({ user: { id: userId } })\n\n  const user = await db.findUser(userId)\n  req.log.set({ user: { name: user.name, plan: user.plan } })\n\n  const orders = await db.findOrders(userId)\n  req.log.set({ orders: { count: orders.length, totalRevenue: sum(orders) } })\n\n  res.json({ user, orders })\n})\n",[229,616,617,653,677,681,717,721,747,801,805,829,887,891,913],{"__ignoreMap":252},[256,618,619,621,623,625,627,629,632,634,636,639,641,643,645,647,649,651],{"class":258,"line":259},[256,620,443],{"class":294},[256,622,446],{"class":301},[256,624,471],{"class":364},[256,626,368],{"class":294},[256,628,396],{"class":301},[256,630,631],{"class":266},"/users/:id",[256,633,396],{"class":301},[256,635,483],{"class":301},[256,637,638],{"class":419}," async",[256,640,486],{"class":301},[256,642,490],{"class":489},[256,644,483],{"class":301},[256,646,495],{"class":489},[256,648,498],{"class":301},[256,650,501],{"class":419},[256,652,504],{"class":301},[256,654,655,658,661,664,667,669,672,674],{"class":258,"line":311},[256,656,657],{"class":419},"  const",[256,659,660],{"class":294}," userId",[256,662,663],{"class":301}," =",[256,665,666],{"class":294}," req",[256,668,446],{"class":301},[256,670,671],{"class":294},"params",[256,673,446],{"class":301},[256,675,676],{"class":294},"id\n",[256,678,679],{"class":258,"line":335},[256,680,358],{"emptyLinePlaceholder":357},[256,682,683,685,687,689,691,693,695,697,700,702,704,707,709,711,713,715],{"class":258,"line":354},[256,684,510],{"class":294},[256,686,446],{"class":301},[256,688,515],{"class":294},[256,690,446],{"class":301},[256,692,520],{"class":364},[256,694,368],{"class":377},[256,696,525],{"class":301},[256,698,699],{"class":377}," user",[256,701,381],{"class":301},[256,703,316],{"class":301},[256,705,706],{"class":377}," id",[256,708,381],{"class":301},[256,710,660],{"class":294},[256,712,322],{"class":301},[256,714,322],{"class":301},[256,716,408],{"class":377},[256,718,719],{"class":258,"line":361},[256,720,358],{"emptyLinePlaceholder":357},[256,722,723,725,727,729,732,735,737,740,742,745],{"class":258,"line":374},[256,724,657],{"class":419},[256,726,699],{"class":294},[256,728,663],{"class":301},[256,730,731],{"class":290}," await",[256,733,734],{"class":294}," db",[256,736,446],{"class":301},[256,738,739],{"class":364},"findUser",[256,741,368],{"class":377},[256,743,744],{"class":294},"userId",[256,746,408],{"class":377},[256,748,749,751,753,755,757,759,761,763,765,767,769,772,774,776,778,781,783,786,788,790,792,795,797,799],{"class":258,"line":402},[256,750,510],{"class":294},[256,752,446],{"class":301},[256,754,515],{"class":294},[256,756,446],{"class":301},[256,758,520],{"class":364},[256,760,368],{"class":377},[256,762,525],{"class":301},[256,764,699],{"class":377},[256,766,381],{"class":301},[256,768,316],{"class":301},[256,770,771],{"class":377}," name",[256,773,381],{"class":301},[256,775,699],{"class":294},[256,777,446],{"class":301},[256,779,780],{"class":294},"name",[256,782,483],{"class":301},[256,784,785],{"class":377}," plan",[256,787,381],{"class":301},[256,789,699],{"class":294},[256,791,446],{"class":301},[256,793,794],{"class":294},"plan",[256,796,322],{"class":301},[256,798,322],{"class":301},[256,800,408],{"class":377},[256,802,803],{"class":258,"line":411},[256,804,358],{"emptyLinePlaceholder":357},[256,806,807,809,812,814,816,818,820,823,825,827],{"class":258,"line":416},[256,808,657],{"class":419},[256,810,811],{"class":294}," orders",[256,813,663],{"class":301},[256,815,731],{"class":290},[256,817,734],{"class":294},[256,819,446],{"class":301},[256,821,822],{"class":364},"findOrders",[256,824,368],{"class":377},[256,826,744],{"class":294},[256,828,408],{"class":377},[256,830,831,833,835,837,839,841,843,845,847,849,851,854,856,858,860,863,865,868,870,873,875,878,881,883,885],{"class":258,"line":435},[256,832,510],{"class":294},[256,834,446],{"class":301},[256,836,515],{"class":294},[256,838,446],{"class":301},[256,840,520],{"class":364},[256,842,368],{"class":377},[256,844,525],{"class":301},[256,846,811],{"class":377},[256,848,381],{"class":301},[256,850,316],{"class":301},[256,852,853],{"class":377}," count",[256,855,381],{"class":301},[256,857,811],{"class":294},[256,859,446],{"class":301},[256,861,862],{"class":294},"length",[256,864,483],{"class":301},[256,866,867],{"class":377}," totalRevenue",[256,869,381],{"class":301},[256,871,872],{"class":364}," sum",[256,874,368],{"class":377},[256,876,877],{"class":294},"orders",[256,879,880],{"class":377},") ",[256,882,405],{"class":301},[256,884,322],{"class":301},[256,886,408],{"class":377},[256,888,889],{"class":258,"line":440},[256,890,358],{"emptyLinePlaceholder":357},[256,892,893,895,897,899,901,903,905,907,909,911],{"class":258,"line":459},[256,894,547],{"class":294},[256,896,446],{"class":301},[256,898,552],{"class":364},[256,900,368],{"class":377},[256,902,525],{"class":301},[256,904,699],{"class":294},[256,906,483],{"class":301},[256,908,811],{"class":294},[256,910,322],{"class":301},[256,912,408],{"class":377},[256,914,915,917],{"class":258,"line":464},[256,916,405],{"class":301},[256,918,408],{"class":294},[225,920,921],{},"All fields are merged into a single wide event emitted when the response finishes:",[247,923,926],{"className":249,"code":924,"filename":925,"language":251,"meta":252,"style":252},"14:58:15 INFO [my-api] GET /users/usr_123 200 in 12ms\n  ├─ orders: count=2 totalRevenue=6298\n  ├─ user: id=usr_123 name=Alice plan=pro\n  └─ requestId: 4a8ff3a8-...\n","Terminal output",[229,927,928,939,959,975],{"__ignoreMap":252},[256,929,930,933,936],{"class":258,"line":259},[256,931,932],{"class":262},"14:58:15",[256,934,935],{"class":266}," INFO",[256,937,938],{"class":294}," [my-api] GET /users/usr_123 200 in 12ms\n",[256,940,941,944,947,950,953,956],{"class":258,"line":311},[256,942,943],{"class":262},"  ├─",[256,945,946],{"class":266}," orders:",[256,948,949],{"class":266}," count=",[256,951,952],{"class":596},"2",[256,954,955],{"class":266}," totalRevenue=",[256,957,958],{"class":596},"6298\n",[256,960,961,963,966,969,972],{"class":258,"line":335},[256,962,943],{"class":262},[256,964,965],{"class":266}," user:",[256,967,968],{"class":266}," id=usr_123",[256,970,971],{"class":266}," name=Alice",[256,973,974],{"class":266}," plan=pro\n",[256,976,977,980,983],{"class":258,"line":354},[256,978,979],{"class":262},"  └─",[256,981,982],{"class":266}," requestId:",[256,984,985],{"class":266}," 4a8ff3a8-...\n",[238,987,989],{"id":988},"uselogger","useLogger()",[225,991,992,993,995,996,998],{},"Use ",[229,994,989],{}," to access the request-scoped logger from anywhere in the call stack — no need to pass ",[229,997,490],{}," through your service layer:",[247,1000,1003],{"className":280,"code":1001,"filename":1002,"language":283,"meta":252,"style":252},"import { useLogger } from 'evlog/express'\n\nexport async function findUser(id: string) {\n  const log = useLogger()\n  log.set({ user: { id } })\n\n  const user = await db.findUser(id)\n  log.set({ user: { name: user.name, plan: user.plan } })\n\n  return user\n}\n","src/services/user.ts",[229,1004,1005,1024,1028,1055,1068,1095,1099,1121,1167,1171,1179],{"__ignoreMap":252},[256,1006,1007,1009,1011,1014,1016,1018,1020,1022],{"class":258,"line":259},[256,1008,291],{"class":290},[256,1010,316],{"class":301},[256,1012,1013],{"class":294}," useLogger",[256,1015,322],{"class":301},[256,1017,325],{"class":290},[256,1019,302],{"class":301},[256,1021,231],{"class":266},[256,1023,308],{"class":301},[256,1025,1026],{"class":258,"line":311},[256,1027,358],{"emptyLinePlaceholder":357},[256,1029,1030,1033,1035,1038,1041,1043,1046,1048,1051,1053],{"class":258,"line":335},[256,1031,1032],{"class":290},"export",[256,1034,638],{"class":419},[256,1036,1037],{"class":419}," function",[256,1039,1040],{"class":364}," findUser",[256,1042,368],{"class":301},[256,1044,1045],{"class":489},"id",[256,1047,381],{"class":301},[256,1049,1050],{"class":262}," string",[256,1052,498],{"class":301},[256,1054,504],{"class":301},[256,1056,1057,1059,1062,1064,1066],{"class":258,"line":354},[256,1058,657],{"class":419},[256,1060,1061],{"class":294}," log",[256,1063,663],{"class":301},[256,1065,1013],{"class":364},[256,1067,432],{"class":377},[256,1069,1070,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093],{"class":258,"line":361},[256,1071,1072],{"class":294},"  log",[256,1074,446],{"class":301},[256,1076,520],{"class":364},[256,1078,368],{"class":377},[256,1080,525],{"class":301},[256,1082,699],{"class":377},[256,1084,381],{"class":301},[256,1086,316],{"class":301},[256,1088,706],{"class":294},[256,1090,322],{"class":301},[256,1092,322],{"class":301},[256,1094,408],{"class":377},[256,1096,1097],{"class":258,"line":374},[256,1098,358],{"emptyLinePlaceholder":357},[256,1100,1101,1103,1105,1107,1109,1111,1113,1115,1117,1119],{"class":258,"line":402},[256,1102,657],{"class":419},[256,1104,699],{"class":294},[256,1106,663],{"class":301},[256,1108,731],{"class":290},[256,1110,734],{"class":294},[256,1112,446],{"class":301},[256,1114,739],{"class":364},[256,1116,368],{"class":377},[256,1118,1045],{"class":294},[256,1120,408],{"class":377},[256,1122,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163,1165],{"class":258,"line":411},[256,1124,1072],{"class":294},[256,1126,446],{"class":301},[256,1128,520],{"class":364},[256,1130,368],{"class":377},[256,1132,525],{"class":301},[256,1134,699],{"class":377},[256,1136,381],{"class":301},[256,1138,316],{"class":301},[256,1140,771],{"class":377},[256,1142,381],{"class":301},[256,1144,699],{"class":294},[256,1146,446],{"class":301},[256,1148,780],{"class":294},[256,1150,483],{"class":301},[256,1152,785],{"class":377},[256,1154,381],{"class":301},[256,1156,699],{"class":294},[256,1158,446],{"class":301},[256,1160,794],{"class":294},[256,1162,322],{"class":301},[256,1164,322],{"class":301},[256,1166,408],{"class":377},[256,1168,1169],{"class":258,"line":416},[256,1170,358],{"emptyLinePlaceholder":357},[256,1172,1173,1176],{"class":258,"line":435},[256,1174,1175],{"class":290},"  return",[256,1177,1178],{"class":294}," user\n",[256,1180,1181],{"class":258,"line":440},[256,1182,1183],{"class":301},"}\n",[247,1185,1187],{"className":280,"code":1186,"filename":282,"language":283,"meta":252,"style":252},"import { findUser } from './services/user'\n\napp.get('/users/:id', async (req, res) => {\n  const user = await findUser(req.params.id)\n  res.json(user)\n})\n",[229,1188,1189,1208,1212,1246,1272,1287],{"__ignoreMap":252},[256,1190,1191,1193,1195,1197,1199,1201,1203,1206],{"class":258,"line":259},[256,1192,291],{"class":290},[256,1194,316],{"class":301},[256,1196,1040],{"class":294},[256,1198,322],{"class":301},[256,1200,325],{"class":290},[256,1202,302],{"class":301},[256,1204,1205],{"class":266},"./services/user",[256,1207,308],{"class":301},[256,1209,1210],{"class":258,"line":311},[256,1211,358],{"emptyLinePlaceholder":357},[256,1213,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244],{"class":258,"line":335},[256,1215,443],{"class":294},[256,1217,446],{"class":301},[256,1219,471],{"class":364},[256,1221,368],{"class":294},[256,1223,396],{"class":301},[256,1225,631],{"class":266},[256,1227,396],{"class":301},[256,1229,483],{"class":301},[256,1231,638],{"class":419},[256,1233,486],{"class":301},[256,1235,490],{"class":489},[256,1237,483],{"class":301},[256,1239,495],{"class":489},[256,1241,498],{"class":301},[256,1243,501],{"class":419},[256,1245,504],{"class":301},[256,1247,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270],{"class":258,"line":354},[256,1249,657],{"class":419},[256,1251,699],{"class":294},[256,1253,663],{"class":301},[256,1255,731],{"class":290},[256,1257,1040],{"class":364},[256,1259,368],{"class":377},[256,1261,490],{"class":294},[256,1263,446],{"class":301},[256,1265,671],{"class":294},[256,1267,446],{"class":301},[256,1269,1045],{"class":294},[256,1271,408],{"class":377},[256,1273,1274,1276,1278,1280,1282,1285],{"class":258,"line":361},[256,1275,547],{"class":294},[256,1277,446],{"class":301},[256,1279,552],{"class":364},[256,1281,368],{"class":377},[256,1283,1284],{"class":294},"user",[256,1286,408],{"class":377},[256,1288,1289,1291],{"class":258,"line":374},[256,1290,405],{"class":301},[256,1292,408],{"class":294},[225,1294,1295,1296,1298,1299,1301,1302,1304,1305,1308],{},"Both ",[229,1297,235],{}," and ",[229,1300,989],{}," return the same logger instance. ",[229,1303,989],{}," uses ",[229,1306,1307],{},"AsyncLocalStorage"," to propagate the logger across async boundaries.",[238,1310,1312],{"id":1311},"error-handling","Error Handling",[225,1314,992,1315,1318,1319,1322,1323,1326,1327,1330],{},[229,1316,1317],{},"createError"," for structured errors with ",[229,1320,1321],{},"why",", ",[229,1324,1325],{},"fix",", and ",[229,1328,1329],{},"link"," fields. Express uses a 4-argument error handler middleware:",[247,1332,1334],{"className":280,"code":1333,"filename":282,"language":283,"meta":252,"style":252},"import { createError, parseError } from 'evlog'\n\napp.get('/checkout', () => {\n  throw createError({\n    message: 'Payment failed',\n    status: 402,\n    why: 'Card declined by issuer',\n    fix: 'Try a different payment method',\n    link: 'https://docs.example.com/payments/declined',\n  })\n})\n\napp.use((err, req, res, next) => {\n  req.log.error(err)\n  const parsed = parseError(err)\n\n  res.status(parsed.status).json({\n    message: parsed.message,\n    why: parsed.why,\n    fix: parsed.fix,\n    link: parsed.link,\n  })\n})\n",[229,1335,1336,1360,1364,1390,1401,1418,1430,1446,1462,1478,1485,1491,1495,1529,1548,1565,1569,1597,1612,1627,1642,1657,1664],{"__ignoreMap":252},[256,1337,1338,1340,1342,1345,1347,1350,1352,1354,1356,1358],{"class":258,"line":259},[256,1339,291],{"class":290},[256,1341,316],{"class":301},[256,1343,1344],{"class":294}," createError",[256,1346,483],{"class":301},[256,1348,1349],{"class":294}," parseError",[256,1351,322],{"class":301},[256,1353,325],{"class":290},[256,1355,302],{"class":301},[256,1357,330],{"class":266},[256,1359,308],{"class":301},[256,1361,1362],{"class":258,"line":311},[256,1363,358],{"emptyLinePlaceholder":357},[256,1365,1366,1368,1370,1372,1374,1376,1379,1381,1383,1386,1388],{"class":258,"line":335},[256,1367,443],{"class":294},[256,1369,446],{"class":301},[256,1371,471],{"class":364},[256,1373,368],{"class":294},[256,1375,396],{"class":301},[256,1377,1378],{"class":266},"/checkout",[256,1380,396],{"class":301},[256,1382,483],{"class":301},[256,1384,1385],{"class":301}," ()",[256,1387,501],{"class":419},[256,1389,504],{"class":301},[256,1391,1392,1395,1397,1399],{"class":258,"line":354},[256,1393,1394],{"class":290},"  throw",[256,1396,1344],{"class":364},[256,1398,368],{"class":377},[256,1400,371],{"class":301},[256,1402,1403,1406,1408,1410,1413,1415],{"class":258,"line":361},[256,1404,1405],{"class":377},"    message",[256,1407,381],{"class":301},[256,1409,302],{"class":301},[256,1411,1412],{"class":266},"Payment failed",[256,1414,396],{"class":301},[256,1416,1417],{"class":301},",\n",[256,1419,1420,1423,1425,1428],{"class":258,"line":374},[256,1421,1422],{"class":377},"    status",[256,1424,381],{"class":301},[256,1426,1427],{"class":596}," 402",[256,1429,1417],{"class":301},[256,1431,1432,1435,1437,1439,1442,1444],{"class":258,"line":402},[256,1433,1434],{"class":377},"    why",[256,1436,381],{"class":301},[256,1438,302],{"class":301},[256,1440,1441],{"class":266},"Card declined by issuer",[256,1443,396],{"class":301},[256,1445,1417],{"class":301},[256,1447,1448,1451,1453,1455,1458,1460],{"class":258,"line":411},[256,1449,1450],{"class":377},"    fix",[256,1452,381],{"class":301},[256,1454,302],{"class":301},[256,1456,1457],{"class":266},"Try a different payment method",[256,1459,396],{"class":301},[256,1461,1417],{"class":301},[256,1463,1464,1467,1469,1471,1474,1476],{"class":258,"line":416},[256,1465,1466],{"class":377},"    link",[256,1468,381],{"class":301},[256,1470,302],{"class":301},[256,1472,1473],{"class":266},"https://docs.example.com/payments/declined",[256,1475,396],{"class":301},[256,1477,1417],{"class":301},[256,1479,1480,1483],{"class":258,"line":435},[256,1481,1482],{"class":301},"  }",[256,1484,408],{"class":377},[256,1486,1487,1489],{"class":258,"line":440},[256,1488,405],{"class":301},[256,1490,408],{"class":294},[256,1492,1493],{"class":258,"line":459},[256,1494,358],{"emptyLinePlaceholder":357},[256,1496,1497,1499,1501,1503,1505,1507,1510,1512,1514,1516,1518,1520,1523,1525,1527],{"class":258,"line":464},[256,1498,443],{"class":294},[256,1500,446],{"class":301},[256,1502,449],{"class":364},[256,1504,368],{"class":294},[256,1506,368],{"class":301},[256,1508,1509],{"class":489},"err",[256,1511,483],{"class":301},[256,1513,666],{"class":489},[256,1515,483],{"class":301},[256,1517,495],{"class":489},[256,1519,483],{"class":301},[256,1521,1522],{"class":489}," next",[256,1524,498],{"class":301},[256,1526,501],{"class":419},[256,1528,504],{"class":301},[256,1530,1531,1533,1535,1537,1539,1542,1544,1546],{"class":258,"line":507},[256,1532,510],{"class":294},[256,1534,446],{"class":301},[256,1536,515],{"class":294},[256,1538,446],{"class":301},[256,1540,1541],{"class":364},"error",[256,1543,368],{"class":377},[256,1545,1509],{"class":294},[256,1547,408],{"class":377},[256,1549,1550,1552,1555,1557,1559,1561,1563],{"class":258,"line":544},[256,1551,657],{"class":419},[256,1553,1554],{"class":294}," parsed",[256,1556,663],{"class":301},[256,1558,1349],{"class":364},[256,1560,368],{"class":377},[256,1562,1509],{"class":294},[256,1564,408],{"class":377},[256,1566,1567],{"class":258,"line":572},[256,1568,358],{"emptyLinePlaceholder":357},[256,1570,1571,1573,1575,1578,1580,1583,1585,1587,1589,1591,1593,1595],{"class":258,"line":579},[256,1572,547],{"class":294},[256,1574,446],{"class":301},[256,1576,1577],{"class":364},"status",[256,1579,368],{"class":377},[256,1581,1582],{"class":294},"parsed",[256,1584,446],{"class":301},[256,1586,1577],{"class":294},[256,1588,498],{"class":377},[256,1590,446],{"class":301},[256,1592,552],{"class":364},[256,1594,368],{"class":377},[256,1596,371],{"class":301},[256,1598,1599,1601,1603,1605,1607,1610],{"class":258,"line":584},[256,1600,1405],{"class":377},[256,1602,381],{"class":301},[256,1604,1554],{"class":294},[256,1606,446],{"class":301},[256,1608,1609],{"class":294},"message",[256,1611,1417],{"class":301},[256,1613,1615,1617,1619,1621,1623,1625],{"class":258,"line":1614},19,[256,1616,1434],{"class":377},[256,1618,381],{"class":301},[256,1620,1554],{"class":294},[256,1622,446],{"class":301},[256,1624,1321],{"class":294},[256,1626,1417],{"class":301},[256,1628,1630,1632,1634,1636,1638,1640],{"class":258,"line":1629},20,[256,1631,1450],{"class":377},[256,1633,381],{"class":301},[256,1635,1554],{"class":294},[256,1637,446],{"class":301},[256,1639,1325],{"class":294},[256,1641,1417],{"class":301},[256,1643,1645,1647,1649,1651,1653,1655],{"class":258,"line":1644},21,[256,1646,1466],{"class":377},[256,1648,381],{"class":301},[256,1650,1554],{"class":294},[256,1652,446],{"class":301},[256,1654,1329],{"class":294},[256,1656,1417],{"class":301},[256,1658,1660,1662],{"class":258,"line":1659},22,[256,1661,1482],{"class":301},[256,1663,408],{"class":377},[256,1665,1667,1669],{"class":258,"line":1666},23,[256,1668,405],{"class":301},[256,1670,408],{"class":294},[225,1672,1673],{},"The error is captured and logged with both the custom context and structured error fields:",[247,1675,1677],{"className":249,"code":1676,"filename":925,"language":251,"meta":252,"style":252},"14:58:20 ERROR [my-api] GET /checkout 402 in 3ms\n  ├─ error: name=EvlogError message=Payment failed status=402\n  ├─ cart: items=3 total=9999\n  └─ requestId: 880a50ac-...\n",[229,1678,1679,1690,1712,1731],{"__ignoreMap":252},[256,1680,1681,1684,1687],{"class":258,"line":259},[256,1682,1683],{"class":262},"14:58:20",[256,1685,1686],{"class":266}," ERROR",[256,1688,1689],{"class":294}," [my-api] GET /checkout 402 in 3ms\n",[256,1691,1692,1694,1697,1700,1703,1706,1709],{"class":258,"line":311},[256,1693,943],{"class":262},[256,1695,1696],{"class":266}," error:",[256,1698,1699],{"class":266}," name=EvlogError",[256,1701,1702],{"class":266}," message=Payment",[256,1704,1705],{"class":266}," failed",[256,1707,1708],{"class":266}," status=",[256,1710,1711],{"class":596},"402\n",[256,1713,1714,1716,1719,1722,1725,1728],{"class":258,"line":335},[256,1715,943],{"class":262},[256,1717,1718],{"class":266}," cart:",[256,1720,1721],{"class":266}," items=",[256,1723,1724],{"class":596},"3",[256,1726,1727],{"class":266}," total=",[256,1729,1730],{"class":596},"9999\n",[256,1732,1733,1735,1737],{"class":258,"line":354},[256,1734,979],{"class":262},[256,1736,982],{"class":266},[256,1738,1739],{"class":266}," 880a50ac-...\n",[238,1741,1743],{"id":1742},"drain-enrichers","Drain & Enrichers",[225,1745,1746],{},"Configure drain adapters and enrichers directly in the middleware options:",[247,1748,1750],{"className":280,"code":1749,"filename":282,"language":283,"meta":252,"style":252},"import { createAxiomDrain } from 'evlog/axiom'\nimport { createUserAgentEnricher } from 'evlog/enrichers'\n\nconst userAgent = createUserAgentEnricher()\n\napp.use(evlog({\n  drain: createAxiomDrain(),\n  enrich: (ctx) => {\n    userAgent(ctx)\n    ctx.event.region = process.env.FLY_REGION\n  },\n}))\n",[229,1751,1752,1772,1792,1796,1809,1813,1829,1843,1861,1872,1902,1907],{"__ignoreMap":252},[256,1753,1754,1756,1758,1761,1763,1765,1767,1770],{"class":258,"line":259},[256,1755,291],{"class":290},[256,1757,316],{"class":301},[256,1759,1760],{"class":294}," createAxiomDrain",[256,1762,322],{"class":301},[256,1764,325],{"class":290},[256,1766,302],{"class":301},[256,1768,1769],{"class":266},"evlog/axiom",[256,1771,308],{"class":301},[256,1773,1774,1776,1778,1781,1783,1785,1787,1790],{"class":258,"line":311},[256,1775,291],{"class":290},[256,1777,316],{"class":301},[256,1779,1780],{"class":294}," createUserAgentEnricher",[256,1782,322],{"class":301},[256,1784,325],{"class":290},[256,1786,302],{"class":301},[256,1788,1789],{"class":266},"evlog/enrichers",[256,1791,308],{"class":301},[256,1793,1794],{"class":258,"line":335},[256,1795,358],{"emptyLinePlaceholder":357},[256,1797,1798,1800,1803,1805,1807],{"class":258,"line":354},[256,1799,420],{"class":419},[256,1801,1802],{"class":294}," userAgent ",[256,1804,426],{"class":301},[256,1806,1780],{"class":364},[256,1808,432],{"class":294},[256,1810,1811],{"class":258,"line":361},[256,1812,358],{"emptyLinePlaceholder":357},[256,1814,1815,1817,1819,1821,1823,1825,1827],{"class":258,"line":374},[256,1816,443],{"class":294},[256,1818,446],{"class":301},[256,1820,449],{"class":364},[256,1822,368],{"class":294},[256,1824,330],{"class":364},[256,1826,368],{"class":294},[256,1828,371],{"class":301},[256,1830,1831,1834,1836,1838,1841],{"class":258,"line":402},[256,1832,1833],{"class":377},"  drain",[256,1835,381],{"class":301},[256,1837,1760],{"class":364},[256,1839,1840],{"class":294},"()",[256,1842,1417],{"class":301},[256,1844,1845,1848,1850,1852,1855,1857,1859],{"class":258,"line":411},[256,1846,1847],{"class":364},"  enrich",[256,1849,381],{"class":301},[256,1851,486],{"class":301},[256,1853,1854],{"class":489},"ctx",[256,1856,498],{"class":301},[256,1858,501],{"class":419},[256,1860,504],{"class":301},[256,1862,1863,1866,1868,1870],{"class":258,"line":416},[256,1864,1865],{"class":364},"    userAgent",[256,1867,368],{"class":377},[256,1869,1854],{"class":294},[256,1871,408],{"class":377},[256,1873,1874,1877,1879,1882,1884,1887,1889,1892,1894,1897,1899],{"class":258,"line":435},[256,1875,1876],{"class":294},"    ctx",[256,1878,446],{"class":301},[256,1880,1881],{"class":294},"event",[256,1883,446],{"class":301},[256,1885,1886],{"class":294},"region",[256,1888,663],{"class":301},[256,1890,1891],{"class":294}," process",[256,1893,446],{"class":301},[256,1895,1896],{"class":294},"env",[256,1898,446],{"class":301},[256,1900,1901],{"class":294},"FLY_REGION\n",[256,1903,1904],{"class":258,"line":440},[256,1905,1906],{"class":301},"  },\n",[256,1908,1909,1911],{"class":258,"line":459},[256,1910,405],{"class":301},[256,1912,1913],{"class":294},"))\n",[242,1915,1917],{"id":1916},"pipeline-batching-retry","Pipeline (Batching & Retry)",[225,1919,1920,1921,1924],{},"For production, wrap your adapter with ",[229,1922,1923],{},"createDrainPipeline"," to batch events and retry on failure:",[247,1926,1928],{"className":280,"code":1927,"filename":282,"language":283,"meta":252,"style":252},"import type { DrainContext } from 'evlog'\nimport { createAxiomDrain } from 'evlog/axiom'\nimport { createDrainPipeline } from 'evlog/pipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 50, intervalMs: 5000 },\n  retry: { maxAttempts: 3 },\n})\nconst drain = pipeline(createAxiomDrain())\n\napp.use(evlog({ drain }))\n",[229,1929,1930,1952,1970,1990,1994,2018,2047,2066,2072,2091,2095],{"__ignoreMap":252},[256,1931,1932,1934,1937,1939,1942,1944,1946,1948,1950],{"class":258,"line":259},[256,1933,291],{"class":290},[256,1935,1936],{"class":290}," type",[256,1938,316],{"class":301},[256,1940,1941],{"class":294}," DrainContext",[256,1943,322],{"class":301},[256,1945,325],{"class":290},[256,1947,302],{"class":301},[256,1949,330],{"class":266},[256,1951,308],{"class":301},[256,1953,1954,1956,1958,1960,1962,1964,1966,1968],{"class":258,"line":311},[256,1955,291],{"class":290},[256,1957,316],{"class":301},[256,1959,1760],{"class":294},[256,1961,322],{"class":301},[256,1963,325],{"class":290},[256,1965,302],{"class":301},[256,1967,1769],{"class":266},[256,1969,308],{"class":301},[256,1971,1972,1974,1976,1979,1981,1983,1985,1988],{"class":258,"line":335},[256,1973,291],{"class":290},[256,1975,316],{"class":301},[256,1977,1978],{"class":294}," createDrainPipeline",[256,1980,322],{"class":301},[256,1982,325],{"class":290},[256,1984,302],{"class":301},[256,1986,1987],{"class":266},"evlog/pipeline",[256,1989,308],{"class":301},[256,1991,1992],{"class":258,"line":354},[256,1993,358],{"emptyLinePlaceholder":357},[256,1995,1996,1998,2001,2003,2005,2008,2011,2014,2016],{"class":258,"line":361},[256,1997,420],{"class":419},[256,1999,2000],{"class":294}," pipeline ",[256,2002,426],{"class":301},[256,2004,1978],{"class":364},[256,2006,2007],{"class":301},"\u003C",[256,2009,2010],{"class":262},"DrainContext",[256,2012,2013],{"class":301},">",[256,2015,368],{"class":294},[256,2017,371],{"class":301},[256,2019,2020,2023,2025,2027,2030,2032,2035,2037,2040,2042,2045],{"class":258,"line":374},[256,2021,2022],{"class":377},"  batch",[256,2024,381],{"class":301},[256,2026,316],{"class":301},[256,2028,2029],{"class":377}," size",[256,2031,381],{"class":301},[256,2033,2034],{"class":596}," 50",[256,2036,483],{"class":301},[256,2038,2039],{"class":377}," intervalMs",[256,2041,381],{"class":301},[256,2043,2044],{"class":596}," 5000",[256,2046,399],{"class":301},[256,2048,2049,2052,2054,2056,2059,2061,2064],{"class":258,"line":402},[256,2050,2051],{"class":377},"  retry",[256,2053,381],{"class":301},[256,2055,316],{"class":301},[256,2057,2058],{"class":377}," maxAttempts",[256,2060,381],{"class":301},[256,2062,2063],{"class":596}," 3",[256,2065,399],{"class":301},[256,2067,2068,2070],{"class":258,"line":411},[256,2069,405],{"class":301},[256,2071,408],{"class":294},[256,2073,2074,2076,2079,2081,2084,2086,2089],{"class":258,"line":416},[256,2075,420],{"class":419},[256,2077,2078],{"class":294}," drain ",[256,2080,426],{"class":301},[256,2082,2083],{"class":364}," pipeline",[256,2085,368],{"class":294},[256,2087,2088],{"class":364},"createAxiomDrain",[256,2090,456],{"class":294},[256,2092,2093],{"class":258,"line":435},[256,2094,358],{"emptyLinePlaceholder":357},[256,2096,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115],{"class":258,"line":440},[256,2098,443],{"class":294},[256,2100,446],{"class":301},[256,2102,449],{"class":364},[256,2104,368],{"class":294},[256,2106,330],{"class":364},[256,2108,368],{"class":294},[256,2110,525],{"class":301},[256,2112,2078],{"class":294},[256,2114,405],{"class":301},[256,2116,1913],{"class":294},[2118,2119,2121,2122,2125,2126,2130],"callout",{"color":2120,"icon":13},"info","Call ",[229,2123,2124],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[2127,2128,2129],"a",{"href":180},"Pipeline docs"," for all options.",[238,2132,2134],{"id":2133},"tail-sampling","Tail Sampling",[225,2136,992,2137,2140],{},[229,2138,2139],{},"keep"," to force-retain specific events regardless of head sampling:",[247,2142,2144],{"className":280,"code":2143,"filename":282,"language":283,"meta":252,"style":252},"app.use(evlog({\n  drain: createAxiomDrain(),\n  keep: (ctx) => {\n    if (ctx.duration && ctx.duration > 2000) ctx.shouldKeep = true\n  },\n}))\n",[229,2145,2146,2162,2174,2191,2235,2239],{"__ignoreMap":252},[256,2147,2148,2150,2152,2154,2156,2158,2160],{"class":258,"line":259},[256,2149,443],{"class":294},[256,2151,446],{"class":301},[256,2153,449],{"class":364},[256,2155,368],{"class":294},[256,2157,330],{"class":364},[256,2159,368],{"class":294},[256,2161,371],{"class":301},[256,2163,2164,2166,2168,2170,2172],{"class":258,"line":311},[256,2165,1833],{"class":377},[256,2167,381],{"class":301},[256,2169,1760],{"class":364},[256,2171,1840],{"class":294},[256,2173,1417],{"class":301},[256,2175,2176,2179,2181,2183,2185,2187,2189],{"class":258,"line":335},[256,2177,2178],{"class":364},"  keep",[256,2180,381],{"class":301},[256,2182,486],{"class":301},[256,2184,1854],{"class":489},[256,2186,498],{"class":301},[256,2188,501],{"class":419},[256,2190,504],{"class":301},[256,2192,2193,2196,2198,2200,2202,2205,2208,2211,2213,2215,2218,2221,2223,2225,2227,2230,2232],{"class":258,"line":354},[256,2194,2195],{"class":290},"    if",[256,2197,486],{"class":377},[256,2199,1854],{"class":294},[256,2201,446],{"class":301},[256,2203,2204],{"class":294},"duration",[256,2206,2207],{"class":301}," &&",[256,2209,2210],{"class":294}," ctx",[256,2212,446],{"class":301},[256,2214,2204],{"class":294},[256,2216,2217],{"class":301}," >",[256,2219,2220],{"class":596}," 2000",[256,2222,880],{"class":377},[256,2224,1854],{"class":294},[256,2226,446],{"class":301},[256,2228,2229],{"class":294},"shouldKeep",[256,2231,663],{"class":301},[256,2233,2234],{"class":564}," true\n",[256,2236,2237],{"class":258,"line":361},[256,2238,1906],{"class":301},[256,2240,2241,2243],{"class":258,"line":374},[256,2242,405],{"class":301},[256,2244,1913],{"class":294},[238,2246,2248],{"id":2247},"route-filtering","Route Filtering",[225,2250,2251,2252,1298,2255,2258],{},"Control which routes are logged with ",[229,2253,2254],{},"include",[229,2256,2257],{},"exclude"," patterns:",[247,2260,2262],{"className":280,"code":2261,"filename":282,"language":283,"meta":252,"style":252},"app.use(evlog({\n  include: ['/api/**'],\n  exclude: ['/_internal/**', '/health'],\n  routes: {\n    '/api/auth/**': { service: 'auth-service' },\n    '/api/payment/**': { service: 'payment-service' },\n  },\n}))\n",[229,2263,2264,2280,2302,2330,2339,2366,2392,2396],{"__ignoreMap":252},[256,2265,2266,2268,2270,2272,2274,2276,2278],{"class":258,"line":259},[256,2267,443],{"class":294},[256,2269,446],{"class":301},[256,2271,449],{"class":364},[256,2273,368],{"class":294},[256,2275,330],{"class":364},[256,2277,368],{"class":294},[256,2279,371],{"class":301},[256,2281,2282,2285,2287,2290,2292,2295,2297,2300],{"class":258,"line":311},[256,2283,2284],{"class":377},"  include",[256,2286,381],{"class":301},[256,2288,2289],{"class":294}," [",[256,2291,396],{"class":301},[256,2293,2294],{"class":266},"/api/**",[256,2296,396],{"class":301},[256,2298,2299],{"class":294},"]",[256,2301,1417],{"class":301},[256,2303,2304,2307,2309,2311,2313,2316,2318,2320,2322,2324,2326,2328],{"class":258,"line":335},[256,2305,2306],{"class":377},"  exclude",[256,2308,381],{"class":301},[256,2310,2289],{"class":294},[256,2312,396],{"class":301},[256,2314,2315],{"class":266},"/_internal/**",[256,2317,396],{"class":301},[256,2319,483],{"class":301},[256,2321,302],{"class":301},[256,2323,478],{"class":266},[256,2325,396],{"class":301},[256,2327,2299],{"class":294},[256,2329,1417],{"class":301},[256,2331,2332,2335,2337],{"class":258,"line":354},[256,2333,2334],{"class":377},"  routes",[256,2336,381],{"class":301},[256,2338,504],{"class":301},[256,2340,2341,2344,2347,2349,2351,2353,2355,2357,2359,2362,2364],{"class":258,"line":361},[256,2342,2343],{"class":301},"    '",[256,2345,2346],{"class":377},"/api/auth/**",[256,2348,396],{"class":301},[256,2350,381],{"class":301},[256,2352,316],{"class":301},[256,2354,386],{"class":377},[256,2356,381],{"class":301},[256,2358,302],{"class":301},[256,2360,2361],{"class":266},"auth-service",[256,2363,396],{"class":301},[256,2365,399],{"class":301},[256,2367,2368,2370,2373,2375,2377,2379,2381,2383,2385,2388,2390],{"class":258,"line":374},[256,2369,2343],{"class":301},[256,2371,2372],{"class":377},"/api/payment/**",[256,2374,396],{"class":301},[256,2376,381],{"class":301},[256,2378,316],{"class":301},[256,2380,386],{"class":377},[256,2382,381],{"class":301},[256,2384,302],{"class":301},[256,2386,2387],{"class":266},"payment-service",[256,2389,396],{"class":301},[256,2391,399],{"class":301},[256,2393,2394],{"class":258,"line":402},[256,2395,1906],{"class":301},[256,2397,2398,2400],{"class":258,"line":411},[256,2399,405],{"class":301},[256,2401,1913],{"class":294},[238,2403,2405],{"id":2404},"client-side-logging","Client-Side Logging",[225,2407,992,2408,2411],{},[229,2409,2410],{},"evlog/browser"," to send structured logs from any frontend to your Express server. This works with any client framework (React, Vue, Svelte, vanilla JS).",[242,2413,2415],{"id":2414},"browser-setup","Browser setup",[247,2417,2420],{"className":280,"code":2418,"filename":2419,"language":283,"meta":252,"style":252},"import { initLogger, log } from 'evlog'\nimport { createBrowserLogDrain } from 'evlog/browser'\n\nconst drain = createBrowserLogDrain({\n  drain: { endpoint: '/v1/ingest' },\n})\ninitLogger({ drain })\n\nlog.info({ action: 'page_view', path: location.pathname })\n","client.ts",[229,2421,2422,2444,2463,2467,2481,2503,2509,2523,2527],{"__ignoreMap":252},[256,2423,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442],{"class":258,"line":259},[256,2425,291],{"class":290},[256,2427,316],{"class":301},[256,2429,319],{"class":294},[256,2431,483],{"class":301},[256,2433,1061],{"class":294},[256,2435,322],{"class":301},[256,2437,325],{"class":290},[256,2439,302],{"class":301},[256,2441,330],{"class":266},[256,2443,308],{"class":301},[256,2445,2446,2448,2450,2453,2455,2457,2459,2461],{"class":258,"line":311},[256,2447,291],{"class":290},[256,2449,316],{"class":301},[256,2451,2452],{"class":294}," createBrowserLogDrain",[256,2454,322],{"class":301},[256,2456,325],{"class":290},[256,2458,302],{"class":301},[256,2460,2410],{"class":266},[256,2462,308],{"class":301},[256,2464,2465],{"class":258,"line":335},[256,2466,358],{"emptyLinePlaceholder":357},[256,2468,2469,2471,2473,2475,2477,2479],{"class":258,"line":354},[256,2470,420],{"class":419},[256,2472,2078],{"class":294},[256,2474,426],{"class":301},[256,2476,2452],{"class":364},[256,2478,368],{"class":294},[256,2480,371],{"class":301},[256,2482,2483,2485,2487,2489,2492,2494,2496,2499,2501],{"class":258,"line":361},[256,2484,1833],{"class":377},[256,2486,381],{"class":301},[256,2488,316],{"class":301},[256,2490,2491],{"class":377}," endpoint",[256,2493,381],{"class":301},[256,2495,302],{"class":301},[256,2497,2498],{"class":266},"/v1/ingest",[256,2500,396],{"class":301},[256,2502,399],{"class":301},[256,2504,2505,2507],{"class":258,"line":374},[256,2506,405],{"class":301},[256,2508,408],{"class":294},[256,2510,2511,2513,2515,2517,2519,2521],{"class":258,"line":402},[256,2512,365],{"class":364},[256,2514,368],{"class":294},[256,2516,525],{"class":301},[256,2518,2078],{"class":294},[256,2520,405],{"class":301},[256,2522,408],{"class":294},[256,2524,2525],{"class":258,"line":411},[256,2526,358],{"emptyLinePlaceholder":357},[256,2528,2529,2531,2533,2535,2537,2539,2542,2544,2546,2549,2551,2553,2556,2558,2561,2563,2566,2568],{"class":258,"line":416},[256,2530,515],{"class":294},[256,2532,446],{"class":301},[256,2534,2120],{"class":364},[256,2536,368],{"class":294},[256,2538,525],{"class":301},[256,2540,2541],{"class":377}," action",[256,2543,381],{"class":301},[256,2545,302],{"class":301},[256,2547,2548],{"class":266},"page_view",[256,2550,396],{"class":301},[256,2552,483],{"class":301},[256,2554,2555],{"class":377}," path",[256,2557,381],{"class":301},[256,2559,2560],{"class":294}," location",[256,2562,446],{"class":301},[256,2564,2565],{"class":294},"pathname ",[256,2567,405],{"class":301},[256,2569,408],{"class":294},[242,2571,2573],{"id":2572},"ingest-endpoint","Ingest endpoint",[225,2575,2576,2577,2580],{},"Add a POST route to receive batched ",[229,2578,2579],{},"DrainContext[]"," from the browser:",[247,2582,2584],{"className":280,"code":2583,"filename":282,"language":283,"meta":252,"style":252},"import type { DrainContext } from 'evlog'\n\napp.post('/v1/ingest', express.json(), (req, res) => {\n  const batch = req.body as DrainContext[]\n  for (const ctx of batch) {\n    console.log('[BROWSER]', JSON.stringify(ctx.event))\n  }\n  res.sendStatus(204)\n})\n",[229,2585,2586,2606,2610,2653,2677,2697,2735,2740,2756],{"__ignoreMap":252},[256,2587,2588,2590,2592,2594,2596,2598,2600,2602,2604],{"class":258,"line":259},[256,2589,291],{"class":290},[256,2591,1936],{"class":290},[256,2593,316],{"class":301},[256,2595,1941],{"class":294},[256,2597,322],{"class":301},[256,2599,325],{"class":290},[256,2601,302],{"class":301},[256,2603,330],{"class":266},[256,2605,308],{"class":301},[256,2607,2608],{"class":258,"line":311},[256,2609,358],{"emptyLinePlaceholder":357},[256,2611,2612,2614,2616,2619,2621,2623,2625,2627,2629,2631,2633,2635,2637,2639,2641,2643,2645,2647,2649,2651],{"class":258,"line":335},[256,2613,443],{"class":294},[256,2615,446],{"class":301},[256,2617,2618],{"class":364},"post",[256,2620,368],{"class":294},[256,2622,396],{"class":301},[256,2624,2498],{"class":266},[256,2626,396],{"class":301},[256,2628,483],{"class":301},[256,2630,429],{"class":294},[256,2632,446],{"class":301},[256,2634,552],{"class":364},[256,2636,1840],{"class":294},[256,2638,483],{"class":301},[256,2640,486],{"class":301},[256,2642,490],{"class":489},[256,2644,483],{"class":301},[256,2646,495],{"class":489},[256,2648,498],{"class":301},[256,2650,501],{"class":419},[256,2652,504],{"class":301},[256,2654,2655,2657,2660,2662,2664,2666,2669,2672,2674],{"class":258,"line":354},[256,2656,657],{"class":419},[256,2658,2659],{"class":294}," batch",[256,2661,663],{"class":301},[256,2663,666],{"class":294},[256,2665,446],{"class":301},[256,2667,2668],{"class":294},"body",[256,2670,2671],{"class":290}," as",[256,2673,1941],{"class":262},[256,2675,2676],{"class":377},"[]\n",[256,2678,2679,2682,2684,2686,2688,2691,2693,2695],{"class":258,"line":361},[256,2680,2681],{"class":290},"  for",[256,2683,486],{"class":377},[256,2685,420],{"class":419},[256,2687,2210],{"class":294},[256,2689,2690],{"class":301}," of",[256,2692,2659],{"class":294},[256,2694,880],{"class":377},[256,2696,371],{"class":301},[256,2698,2699,2702,2704,2706,2708,2710,2713,2715,2717,2720,2722,2725,2727,2729,2731,2733],{"class":258,"line":374},[256,2700,2701],{"class":294},"    console",[256,2703,446],{"class":301},[256,2705,515],{"class":364},[256,2707,368],{"class":377},[256,2709,396],{"class":301},[256,2711,2712],{"class":266},"[BROWSER]",[256,2714,396],{"class":301},[256,2716,483],{"class":301},[256,2718,2719],{"class":294}," JSON",[256,2721,446],{"class":301},[256,2723,2724],{"class":364},"stringify",[256,2726,368],{"class":377},[256,2728,1854],{"class":294},[256,2730,446],{"class":301},[256,2732,1881],{"class":294},[256,2734,1913],{"class":377},[256,2736,2737],{"class":258,"line":402},[256,2738,2739],{"class":301},"  }\n",[256,2741,2742,2744,2746,2749,2751,2754],{"class":258,"line":411},[256,2743,547],{"class":294},[256,2745,446],{"class":301},[256,2747,2748],{"class":364},"sendStatus",[256,2750,368],{"class":377},[256,2752,2753],{"class":596},"204",[256,2755,408],{"class":377},[256,2757,2758,2760],{"class":258,"line":416},[256,2759,405],{"class":301},[256,2761,408],{"class":294},[2118,2763,2765,2766,2769],{"color":2764,"icon":187},"neutral","See the full ",[2127,2767,2768],{"href":185},"Browser Drain"," adapter docs for batching, retry, sendBeacon fallback, and authentication options.",[238,2771,2773],{"id":2772},"run-locally","Run Locally",[247,2775,2777],{"className":249,"code":2776,"language":251,"meta":252,"style":252},"git clone https://github.com/HugoRCD/evlog.git\ncd evlog\nbun install\nbun run example:express\n",[229,2778,2779,2790,2798,2805],{"__ignoreMap":252},[256,2780,2781,2784,2787],{"class":258,"line":259},[256,2782,2783],{"class":262},"git",[256,2785,2786],{"class":266}," clone",[256,2788,2789],{"class":266}," https://github.com/HugoRCD/evlog.git\n",[256,2791,2792,2795],{"class":258,"line":311},[256,2793,2794],{"class":364},"cd",[256,2796,2797],{"class":266}," evlog\n",[256,2799,2800,2802],{"class":258,"line":335},[256,2801,263],{"class":262},[256,2803,2804],{"class":266}," install\n",[256,2806,2807,2809,2812],{"class":258,"line":354},[256,2808,263],{"class":262},[256,2810,2811],{"class":266}," run",[256,2813,2814],{"class":266}," example:express\n",[225,2816,2817,2818,2823],{},"Open ",[2127,2819,2820],{"href":2820,"rel":2821},"http://localhost:3000",[2822],"nofollow"," to explore the interactive test UI.",[2825,2826,2827],"card-group",{},[2828,2829,2833],"card",{"icon":2830,"title":2831,"to":2832},"i-simple-icons-github","Source Code","https://github.com/HugoRCD/evlog/tree/main/examples/express","Browse the complete Express example source on GitHub.",[2835,2836,2837],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":252,"searchDepth":311,"depth":311,"links":2839},[2840,2844,2845,2846,2847,2850,2851,2852,2856],{"id":240,"depth":311,"text":20,"children":2841},[2842,2843],{"id":244,"depth":335,"text":245},{"id":276,"depth":335,"text":277},{"id":608,"depth":311,"text":111},{"id":988,"depth":311,"text":989},{"id":1311,"depth":311,"text":1312},{"id":1742,"depth":311,"text":1743,"children":2848},[2849],{"id":1916,"depth":335,"text":1917},{"id":2133,"depth":311,"text":2134},{"id":2247,"depth":311,"text":2248},{"id":2404,"depth":311,"text":2405,"children":2853},[2854,2855],{"id":2414,"depth":335,"text":2415},{"id":2572,"depth":335,"text":2573},{"id":2772,"depth":311,"text":2773},"Using evlog with Express — automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Express applications.","md",[2860],{"label":2831,"icon":2830,"to":2832,"color":2764,"variant":2861},"subtle",{},{"title":71,"icon":74},{"title":71,"description":2857},"A-HLX57uUCbn24ZXGdxGqV4ltGn44sdAX9xbSW90jBM",[2867,2869],{"title":66,"path":67,"stem":68,"description":2868,"icon":69,"children":-1},"Using evlog with NestJS — automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in NestJS applications.",{"title":76,"path":77,"stem":78,"description":2870,"icon":79,"children":-1},"Using evlog with Hono — automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Hono applications.",1772991603971]