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