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