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