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