[{"data":1,"prerenderedAt":5217},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-installation":122,"-getting-started-installation-surround":5212},[4,30,55,105],{"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",{"id":123,"title":124,"body":125,"description":5203,"extension":5204,"links":5205,"meta":5208,"navigation":5209,"path":16,"seo":5210,"stem":17,"__hash__":5211},"docs/1.getting-started/2.installation.md","Install evlog",{"type":126,"value":127,"toc":5184},"minimark",[128,132,137,140,212,219,389,394,649,653,662,812,826,830,833,1010,1013,1034,1046,1049,1052,1057,1064,1205,1220,1224,1231,1389,1396,1400,1407,1592,1614,1618,1629,1822,1828,1858,1883,1887,1893,2191,2195,2198,2409,2485,2488,2585,2592,2595,2609,2708,2712,2741,2755,2761,2907,2911,2918,3021,3029,3032,3091,3096,3099,3238,3432,3439,3443,3445,3495,3502,3546,3550,3553,3869,3872,3890,3893,3916,3928,3932,3935,4415,4417,4437,4444,4448,4450,4500,4503,4760,4767,4771,4789,5150,5158,5162,5165,5169,5173,5180],[129,130,131],"p",{},"evlog supports multiple environments: Nuxt, Nitro, Cloudflare Workers, and standalone TypeScript.",[133,134,136],"h2",{"id":135},"nuxt","Nuxt",[129,138,139],{},"Install evlog via your preferred package manager:",[141,142,143,169,184,198],"code-group",{},[144,145,151],"pre",{"className":146,"code":147,"filename":148,"language":149,"meta":150,"style":150},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog\n","pnpm","bash","",[152,153,154],"code",{"__ignoreMap":150},[155,156,159,162,166],"span",{"class":157,"line":158},"line",1,[155,160,148],{"class":161},"sBMFI",[155,163,165],{"class":164},"sfazB"," add",[155,167,168],{"class":164}," evlog\n",[144,170,173],{"className":146,"code":171,"filename":172,"language":149,"meta":150,"style":150},"npm install evlog\n","npm",[152,174,175],{"__ignoreMap":150},[155,176,177,179,182],{"class":157,"line":158},[155,178,172],{"class":161},[155,180,181],{"class":164}," install",[155,183,168],{"class":164},[144,185,188],{"className":146,"code":186,"filename":187,"language":149,"meta":150,"style":150},"yarn add evlog\n","yarn",[152,189,190],{"__ignoreMap":150},[155,191,192,194,196],{"class":157,"line":158},[155,193,187],{"class":161},[155,195,165],{"class":164},[155,197,168],{"class":164},[144,199,202],{"className":146,"code":200,"filename":201,"language":149,"meta":150,"style":150},"bun add evlog\n","bun",[152,203,204],{"__ignoreMap":150},[155,205,206,208,210],{"class":157,"line":158},[155,207,201],{"class":161},[155,209,165],{"class":164},[155,211,168],{"class":164},[129,213,214,215,218],{},"Then add it to your Nuxt config using the ",[152,216,217],{},"evlog/nuxt"," module:",[144,220,225],{"className":221,"code":222,"filename":223,"language":224,"meta":150,"style":150},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['evlog/nuxt'],\n  evlog: {\n    env: {\n      service: 'my-app',\n    },\n    // Optional: only log specific routes (supports glob patterns)\n    include: ['/api/**'],\n    // Optional: exclude specific routes from logging\n    exclude: ['/api/_nuxt_icon/**'],\n  },\n})\n","nuxt.config.ts","typescript",[152,226,227,248,274,285,295,313,319,326,347,353,374,380],{"__ignoreMap":150},[155,228,229,233,236,240,244],{"class":157,"line":158},[155,230,232],{"class":231},"s7zQu","export",[155,234,235],{"class":231}," default",[155,237,239],{"class":238},"s2Zo4"," defineNuxtConfig",[155,241,243],{"class":242},"sTEyZ","(",[155,245,247],{"class":246},"sMK4o","{\n",[155,249,251,255,258,261,264,266,268,271],{"class":157,"line":250},2,[155,252,254],{"class":253},"swJcz","  modules",[155,256,257],{"class":246},":",[155,259,260],{"class":242}," [",[155,262,263],{"class":246},"'",[155,265,217],{"class":164},[155,267,263],{"class":246},[155,269,270],{"class":242},"]",[155,272,273],{"class":246},",\n",[155,275,277,280,282],{"class":157,"line":276},3,[155,278,279],{"class":253},"  evlog",[155,281,257],{"class":246},[155,283,284],{"class":246}," {\n",[155,286,288,291,293],{"class":157,"line":287},4,[155,289,290],{"class":253},"    env",[155,292,257],{"class":246},[155,294,284],{"class":246},[155,296,298,301,303,306,309,311],{"class":157,"line":297},5,[155,299,300],{"class":253},"      service",[155,302,257],{"class":246},[155,304,305],{"class":246}," '",[155,307,308],{"class":164},"my-app",[155,310,263],{"class":246},[155,312,273],{"class":246},[155,314,316],{"class":157,"line":315},6,[155,317,318],{"class":246},"    },\n",[155,320,322],{"class":157,"line":321},7,[155,323,325],{"class":324},"sHwdD","    // Optional: only log specific routes (supports glob patterns)\n",[155,327,329,332,334,336,338,341,343,345],{"class":157,"line":328},8,[155,330,331],{"class":253},"    include",[155,333,257],{"class":246},[155,335,260],{"class":242},[155,337,263],{"class":246},[155,339,340],{"class":164},"/api/**",[155,342,263],{"class":246},[155,344,270],{"class":242},[155,346,273],{"class":246},[155,348,350],{"class":157,"line":349},9,[155,351,352],{"class":324},"    // Optional: exclude specific routes from logging\n",[155,354,356,359,361,363,365,368,370,372],{"class":157,"line":355},10,[155,357,358],{"class":253},"    exclude",[155,360,257],{"class":246},[155,362,260],{"class":242},[155,364,263],{"class":246},[155,366,367],{"class":164},"/api/_nuxt_icon/**",[155,369,263],{"class":246},[155,371,270],{"class":242},[155,373,273],{"class":246},[155,375,377],{"class":157,"line":376},11,[155,378,379],{"class":246},"  },\n",[155,381,383,386],{"class":157,"line":382},12,[155,384,385],{"class":246},"}",[155,387,388],{"class":242},")\n",[390,391,393],"h3",{"id":392},"configuration-options","Configuration Options",[395,396,397,416],"table",{},[398,399,400],"thead",{},[401,402,403,407,410,413],"tr",{},[404,405,406],"th",{},"Option",[404,408,409],{},"Type",[404,411,412],{},"Default",[404,414,415],{},"Description",[417,418,419,444,464,481,504,525,544,563,587,608,630],"tbody",{},[401,420,421,427,432,437],{},[422,423,424],"td",{},[152,425,426],{},"enabled",[422,428,429],{},[152,430,431],{},"boolean",[422,433,434],{},[152,435,436],{},"true",[422,438,439,440,443],{},"Globally enable/disable all logging. When ",[152,441,442],{},"false",", all operations become no-ops",[401,445,446,451,456,461],{},[422,447,448],{},[152,449,450],{},"env.service",[422,452,453],{},[152,454,455],{},"string",[422,457,458],{},[152,459,460],{},"'app'",[422,462,463],{},"Service name shown in logs",[401,465,466,471,475,478],{},[422,467,468],{},[152,469,470],{},"env.environment",[422,472,473],{},[152,474,455],{},[422,476,477],{},"Auto-detected",[422,479,480],{},"Environment name",[401,482,483,488,493,498],{},[422,484,485],{},[152,486,487],{},"include",[422,489,490],{},[152,491,492],{},"string[]",[422,494,495],{},[152,496,497],{},"undefined",[422,499,500,501,503],{},"Route patterns to log. Supports glob (",[152,502,340],{},"). If not set, all routes are logged",[401,505,506,511,515,519],{},[422,507,508],{},[152,509,510],{},"exclude",[422,512,513],{},[152,514,492],{},[422,516,517],{},[152,518,497],{},[422,520,521,522,524],{},"Route patterns to exclude from logging. Supports glob (",[152,523,367],{},"). Exclusions take precedence over inclusions",[401,526,527,532,537,541],{},[422,528,529],{},[152,530,531],{},"routes",[422,533,534],{},[152,535,536],{},"Record\u003Cstring, RouteConfig>",[422,538,539],{},[152,540,497],{},[422,542,543],{},"Route-specific service configuration. Allows setting different service names for different routes using glob patterns",[401,545,546,551,555,560],{},[422,547,548],{},[152,549,550],{},"pretty",[422,552,553],{},[152,554,431],{},[422,556,557,559],{},[152,558,436],{}," in dev",[422,561,562],{},"Pretty print with tree formatting",[401,564,565,570,575,579],{},[422,566,567],{},[152,568,569],{},"sampling.rates",[422,571,572],{},[152,573,574],{},"object",[422,576,577],{},[152,578,497],{},[422,580,581,582],{},"Head sampling rates per log level (0-100%). See ",[583,584,586],"a",{"href":585},"#sampling","Sampling",[401,588,589,594,599,603],{},[422,590,591],{},[152,592,593],{},"sampling.keep",[422,595,596],{},[152,597,598],{},"array",[422,600,601],{},[152,602,497],{},[422,604,605,606],{},"Tail sampling conditions to force-keep logs. See ",[583,607,586],{"href":585},[401,609,610,615,619,623],{},[422,611,612],{},[152,613,614],{},"transport.enabled",[422,616,617],{},[152,618,431],{},[422,620,621],{},[152,622,442],{},[422,624,625,626],{},"Enable sending client logs to the server. See ",[583,627,629],{"href":628},"#client-transport","Client Transport",[401,631,632,637,641,646],{},[422,633,634],{},[152,635,636],{},"transport.endpoint",[422,638,639],{},[152,640,455],{},[422,642,643],{},[152,644,645],{},"'/api/_evlog/ingest'",[422,647,648],{},"API endpoint for client log ingestion",[390,650,652],{"id":651},"route-filtering","Route Filtering",[129,654,655,656,658,659,661],{},"Use ",[152,657,487],{}," and ",[152,660,510],{}," to control which routes are logged. Both support glob patterns.",[144,663,665],{"className":221,"code":664,"filename":223,"language":224,"meta":150,"style":150},"export default defineNuxtConfig({\n  modules: ['evlog/nuxt'],\n  evlog: {\n    // Log all API and auth routes...\n    include: ['/api/**', '/auth/**'],\n    // ...except internal/noisy routes\n    exclude: [\n      '/api/_nuxt_icon/**',  // Nuxt Icon requests\n      '/api/_content/**',    // Nuxt Content queries\n      '/api/health',         // Health checks\n    ],\n  },\n})\n",[152,666,667,679,697,705,710,738,743,752,766,780,794,801,805],{"__ignoreMap":150},[155,668,669,671,673,675,677],{"class":157,"line":158},[155,670,232],{"class":231},[155,672,235],{"class":231},[155,674,239],{"class":238},[155,676,243],{"class":242},[155,678,247],{"class":246},[155,680,681,683,685,687,689,691,693,695],{"class":157,"line":250},[155,682,254],{"class":253},[155,684,257],{"class":246},[155,686,260],{"class":242},[155,688,263],{"class":246},[155,690,217],{"class":164},[155,692,263],{"class":246},[155,694,270],{"class":242},[155,696,273],{"class":246},[155,698,699,701,703],{"class":157,"line":276},[155,700,279],{"class":253},[155,702,257],{"class":246},[155,704,284],{"class":246},[155,706,707],{"class":157,"line":287},[155,708,709],{"class":324},"    // Log all API and auth routes...\n",[155,711,712,714,716,718,720,722,724,727,729,732,734,736],{"class":157,"line":297},[155,713,331],{"class":253},[155,715,257],{"class":246},[155,717,260],{"class":242},[155,719,263],{"class":246},[155,721,340],{"class":164},[155,723,263],{"class":246},[155,725,726],{"class":246},",",[155,728,305],{"class":246},[155,730,731],{"class":164},"/auth/**",[155,733,263],{"class":246},[155,735,270],{"class":242},[155,737,273],{"class":246},[155,739,740],{"class":157,"line":315},[155,741,742],{"class":324},"    // ...except internal/noisy routes\n",[155,744,745,747,749],{"class":157,"line":321},[155,746,358],{"class":253},[155,748,257],{"class":246},[155,750,751],{"class":242}," [\n",[155,753,754,757,759,761,763],{"class":157,"line":328},[155,755,756],{"class":246},"      '",[155,758,367],{"class":164},[155,760,263],{"class":246},[155,762,726],{"class":246},[155,764,765],{"class":324},"  // Nuxt Icon requests\n",[155,767,768,770,773,775,777],{"class":157,"line":349},[155,769,756],{"class":246},[155,771,772],{"class":164},"/api/_content/**",[155,774,263],{"class":246},[155,776,726],{"class":246},[155,778,779],{"class":324},"    // Nuxt Content queries\n",[155,781,782,784,787,789,791],{"class":157,"line":355},[155,783,756],{"class":246},[155,785,786],{"class":164},"/api/health",[155,788,263],{"class":246},[155,790,726],{"class":246},[155,792,793],{"class":324},"         // Health checks\n",[155,795,796,799],{"class":157,"line":376},[155,797,798],{"class":242},"    ]",[155,800,273],{"class":246},[155,802,803],{"class":157,"line":382},[155,804,379],{"class":246},[155,806,808,810],{"class":157,"line":807},13,[155,809,385],{"class":246},[155,811,388],{"class":242},[813,814,816,820,821,658,823,825],"callout",{"color":815,"icon":13},"info",[817,818,819],"strong",{},"Exclusions take precedence."," If a path matches both ",[152,822,487],{},[152,824,510],{},", it will be excluded.",[390,827,829],{"id":828},"route-based-service-configuration","Route-Based Service Configuration",[129,831,832],{},"In multi-service architectures, configure different service names for different routes:",[144,834,836],{"className":221,"code":835,"filename":223,"language":224,"meta":150,"style":150},"export default defineNuxtConfig({\n  modules: ['evlog/nuxt'],\n  evlog: {\n    env: {\n      service: 'default-service', // Fallback for unmatched routes\n    },\n    routes: {\n      '/api/auth/**': { service: 'auth-service' },\n      '/api/payment/**': { service: 'payment-service' },\n      '/api/booking/**': { service: 'booking-service' },\n    },\n  },\n})\n",[152,837,838,850,868,876,884,902,906,915,944,970,996,1000,1004],{"__ignoreMap":150},[155,839,840,842,844,846,848],{"class":157,"line":158},[155,841,232],{"class":231},[155,843,235],{"class":231},[155,845,239],{"class":238},[155,847,243],{"class":242},[155,849,247],{"class":246},[155,851,852,854,856,858,860,862,864,866],{"class":157,"line":250},[155,853,254],{"class":253},[155,855,257],{"class":246},[155,857,260],{"class":242},[155,859,263],{"class":246},[155,861,217],{"class":164},[155,863,263],{"class":246},[155,865,270],{"class":242},[155,867,273],{"class":246},[155,869,870,872,874],{"class":157,"line":276},[155,871,279],{"class":253},[155,873,257],{"class":246},[155,875,284],{"class":246},[155,877,878,880,882],{"class":157,"line":287},[155,879,290],{"class":253},[155,881,257],{"class":246},[155,883,284],{"class":246},[155,885,886,888,890,892,895,897,899],{"class":157,"line":297},[155,887,300],{"class":253},[155,889,257],{"class":246},[155,891,305],{"class":246},[155,893,894],{"class":164},"default-service",[155,896,263],{"class":246},[155,898,726],{"class":246},[155,900,901],{"class":324}," // Fallback for unmatched routes\n",[155,903,904],{"class":157,"line":315},[155,905,318],{"class":246},[155,907,908,911,913],{"class":157,"line":321},[155,909,910],{"class":253},"    routes",[155,912,257],{"class":246},[155,914,284],{"class":246},[155,916,917,919,922,924,926,929,932,934,936,939,941],{"class":157,"line":328},[155,918,756],{"class":246},[155,920,921],{"class":253},"/api/auth/**",[155,923,263],{"class":246},[155,925,257],{"class":246},[155,927,928],{"class":246}," {",[155,930,931],{"class":253}," service",[155,933,257],{"class":246},[155,935,305],{"class":246},[155,937,938],{"class":164},"auth-service",[155,940,263],{"class":246},[155,942,943],{"class":246}," },\n",[155,945,946,948,951,953,955,957,959,961,963,966,968],{"class":157,"line":349},[155,947,756],{"class":246},[155,949,950],{"class":253},"/api/payment/**",[155,952,263],{"class":246},[155,954,257],{"class":246},[155,956,928],{"class":246},[155,958,931],{"class":253},[155,960,257],{"class":246},[155,962,305],{"class":246},[155,964,965],{"class":164},"payment-service",[155,967,263],{"class":246},[155,969,943],{"class":246},[155,971,972,974,977,979,981,983,985,987,989,992,994],{"class":157,"line":355},[155,973,756],{"class":246},[155,975,976],{"class":253},"/api/booking/**",[155,978,263],{"class":246},[155,980,257],{"class":246},[155,982,928],{"class":246},[155,984,931],{"class":253},[155,986,257],{"class":246},[155,988,305],{"class":246},[155,990,991],{"class":164},"booking-service",[155,993,263],{"class":246},[155,995,943],{"class":246},[155,997,998],{"class":157,"line":376},[155,999,318],{"class":246},[155,1001,1002],{"class":157,"line":382},[155,1003,379],{"class":246},[155,1005,1006,1008],{"class":157,"line":807},[155,1007,385],{"class":246},[155,1009,388],{"class":242},[129,1011,1012],{},"All logs from matching routes will automatically include the configured service name. This is especially useful when:",[1014,1015,1016,1020,1023],"ul",{},[1017,1018,1019],"li",{},"Running multiple microservices behind a single Nuxt server",[1017,1021,1022],{},"Organizing logs by business domain (auth, payment, inventory)",[1017,1024,1025,1026,1029,1030,1033],{},"Differentiating between API versions (",[152,1027,1028],{},"/api/v1/**",", ",[152,1031,1032],{},"/api/v2/**",")",[129,1035,1036,1037,1040,1041,1045],{},"You can also override the service name per handler using ",[152,1038,1039],{},"useLogger(event, 'service-name')",". See ",[583,1042,1044],{"href":1043},"/getting-started/quick-start#service-identification","Quick Start - Service Identification"," for details.",[390,1047,586],{"id":1048},"sampling",[129,1050,1051],{},"At scale, logging everything can become expensive. evlog supports two sampling strategies:",[1053,1054,1056],"h4",{"id":1055},"head-sampling-rates","Head Sampling (rates)",[129,1058,1059,1060,1063],{},"Random sampling based on log level, decided ",[817,1061,1062],{},"before"," the request completes:",[144,1065,1067],{"className":221,"code":1066,"filename":223,"language":224,"meta":150,"style":150},"export default defineNuxtConfig({\n  modules: ['evlog/nuxt'],\n  evlog: {\n    sampling: {\n      rates: {\n        info: 10,    // Keep 10% of info logs\n        warn: 50,    // Keep 50% of warning logs\n        debug: 5,    // Keep 5% of debug logs\n        error: 100,  // Always keep errors (default)\n      },\n    },\n  },\n})\n",[152,1068,1069,1081,1099,1107,1116,1125,1141,1156,1171,1186,1191,1195,1199],{"__ignoreMap":150},[155,1070,1071,1073,1075,1077,1079],{"class":157,"line":158},[155,1072,232],{"class":231},[155,1074,235],{"class":231},[155,1076,239],{"class":238},[155,1078,243],{"class":242},[155,1080,247],{"class":246},[155,1082,1083,1085,1087,1089,1091,1093,1095,1097],{"class":157,"line":250},[155,1084,254],{"class":253},[155,1086,257],{"class":246},[155,1088,260],{"class":242},[155,1090,263],{"class":246},[155,1092,217],{"class":164},[155,1094,263],{"class":246},[155,1096,270],{"class":242},[155,1098,273],{"class":246},[155,1100,1101,1103,1105],{"class":157,"line":276},[155,1102,279],{"class":253},[155,1104,257],{"class":246},[155,1106,284],{"class":246},[155,1108,1109,1112,1114],{"class":157,"line":287},[155,1110,1111],{"class":253},"    sampling",[155,1113,257],{"class":246},[155,1115,284],{"class":246},[155,1117,1118,1121,1123],{"class":157,"line":297},[155,1119,1120],{"class":253},"      rates",[155,1122,257],{"class":246},[155,1124,284],{"class":246},[155,1126,1127,1130,1132,1136,1138],{"class":157,"line":315},[155,1128,1129],{"class":253},"        info",[155,1131,257],{"class":246},[155,1133,1135],{"class":1134},"sbssI"," 10",[155,1137,726],{"class":246},[155,1139,1140],{"class":324},"    // Keep 10% of info logs\n",[155,1142,1143,1146,1148,1151,1153],{"class":157,"line":321},[155,1144,1145],{"class":253},"        warn",[155,1147,257],{"class":246},[155,1149,1150],{"class":1134}," 50",[155,1152,726],{"class":246},[155,1154,1155],{"class":324},"    // Keep 50% of warning logs\n",[155,1157,1158,1161,1163,1166,1168],{"class":157,"line":328},[155,1159,1160],{"class":253},"        debug",[155,1162,257],{"class":246},[155,1164,1165],{"class":1134}," 5",[155,1167,726],{"class":246},[155,1169,1170],{"class":324},"    // Keep 5% of debug logs\n",[155,1172,1173,1176,1178,1181,1183],{"class":157,"line":349},[155,1174,1175],{"class":253},"        error",[155,1177,257],{"class":246},[155,1179,1180],{"class":1134}," 100",[155,1182,726],{"class":246},[155,1184,1185],{"class":324},"  // Always keep errors (default)\n",[155,1187,1188],{"class":157,"line":355},[155,1189,1190],{"class":246},"      },\n",[155,1192,1193],{"class":157,"line":376},[155,1194,318],{"class":246},[155,1196,1197],{"class":157,"line":382},[155,1198,379],{"class":246},[155,1200,1201,1203],{"class":157,"line":807},[155,1202,385],{"class":246},[155,1204,388],{"class":242},[813,1206,1208,1211,1212,1215,1216,1219],{"color":1207,"icon":49},"success",[817,1209,1210],{},"Errors are always logged by default."," Even if you don't specify ",[152,1213,1214],{},"error: 100",", error logs are never sampled out unless you explicitly set ",[152,1217,1218],{},"error: 0",".",[1053,1221,1223],{"id":1222},"tail-sampling-keep","Tail Sampling (keep)",[129,1225,1226,1227,1230],{},"Force-keep logs based on request outcome, evaluated ",[817,1228,1229],{},"after"," the request completes. Useful to always capture slow requests or critical paths even when head sampling would drop them:",[144,1232,1234],{"className":221,"code":1233,"filename":223,"language":224,"meta":150,"style":150},"export default defineNuxtConfig({\n  modules: ['evlog/nuxt'],\n  evlog: {\n    sampling: {\n      rates: { info: 10 },  // Only 10% of info logs\n      keep: [\n        { duration: 1000 },           // Always keep if duration >= 1000ms\n        { status: 400 },              // Always keep if status >= 400\n        { path: '/api/critical/**' }, // Always keep critical paths\n      ],\n    },\n  },\n})\n",[152,1235,1236,1248,1266,1274,1282,1303,1312,1330,1347,1368,1375,1379,1383],{"__ignoreMap":150},[155,1237,1238,1240,1242,1244,1246],{"class":157,"line":158},[155,1239,232],{"class":231},[155,1241,235],{"class":231},[155,1243,239],{"class":238},[155,1245,243],{"class":242},[155,1247,247],{"class":246},[155,1249,1250,1252,1254,1256,1258,1260,1262,1264],{"class":157,"line":250},[155,1251,254],{"class":253},[155,1253,257],{"class":246},[155,1255,260],{"class":242},[155,1257,263],{"class":246},[155,1259,217],{"class":164},[155,1261,263],{"class":246},[155,1263,270],{"class":242},[155,1265,273],{"class":246},[155,1267,1268,1270,1272],{"class":157,"line":276},[155,1269,279],{"class":253},[155,1271,257],{"class":246},[155,1273,284],{"class":246},[155,1275,1276,1278,1280],{"class":157,"line":287},[155,1277,1111],{"class":253},[155,1279,257],{"class":246},[155,1281,284],{"class":246},[155,1283,1284,1286,1288,1290,1293,1295,1297,1300],{"class":157,"line":297},[155,1285,1120],{"class":253},[155,1287,257],{"class":246},[155,1289,928],{"class":246},[155,1291,1292],{"class":253}," info",[155,1294,257],{"class":246},[155,1296,1135],{"class":1134},[155,1298,1299],{"class":246}," },",[155,1301,1302],{"class":324},"  // Only 10% of info logs\n",[155,1304,1305,1308,1310],{"class":157,"line":315},[155,1306,1307],{"class":253},"      keep",[155,1309,257],{"class":246},[155,1311,751],{"class":242},[155,1313,1314,1317,1320,1322,1325,1327],{"class":157,"line":321},[155,1315,1316],{"class":246},"        {",[155,1318,1319],{"class":253}," duration",[155,1321,257],{"class":246},[155,1323,1324],{"class":1134}," 1000",[155,1326,1299],{"class":246},[155,1328,1329],{"class":324},"           // Always keep if duration >= 1000ms\n",[155,1331,1332,1334,1337,1339,1342,1344],{"class":157,"line":328},[155,1333,1316],{"class":246},[155,1335,1336],{"class":253}," status",[155,1338,257],{"class":246},[155,1340,1341],{"class":1134}," 400",[155,1343,1299],{"class":246},[155,1345,1346],{"class":324},"              // Always keep if status >= 400\n",[155,1348,1349,1351,1354,1356,1358,1361,1363,1365],{"class":157,"line":349},[155,1350,1316],{"class":246},[155,1352,1353],{"class":253}," path",[155,1355,257],{"class":246},[155,1357,305],{"class":246},[155,1359,1360],{"class":164},"/api/critical/**",[155,1362,263],{"class":246},[155,1364,1299],{"class":246},[155,1366,1367],{"class":324}," // Always keep critical paths\n",[155,1369,1370,1373],{"class":157,"line":355},[155,1371,1372],{"class":242},"      ]",[155,1374,273],{"class":246},[155,1376,1377],{"class":157,"line":376},[155,1378,318],{"class":246},[155,1380,1381],{"class":157,"line":382},[155,1382,379],{"class":246},[155,1384,1385,1387],{"class":157,"line":807},[155,1386,385],{"class":246},[155,1388,388],{"class":242},[129,1390,1391,1392,1395],{},"Conditions use ",[152,1393,1394],{},">="," comparison and follow OR logic (any match = keep).",[1053,1397,1399],{"id":1398},"custom-tail-sampling-hook","Custom Tail Sampling Hook",[129,1401,1402,1403,1406],{},"For business-specific conditions (premium users, feature flags, etc.), use the ",[152,1404,1405],{},"evlog:emit:keep"," Nitro hook:",[144,1408,1411],{"className":221,"code":1409,"filename":1410,"language":224,"meta":150,"style":150},"export default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:emit:keep', (ctx) => {\n    // Access user from accumulated context\n    const user = ctx.context.user as { premium?: boolean } | undefined\n\n    // Force-keep logs for premium users regardless of sampling rate\n    if (user?.premium) {\n      ctx.shouldKeep = true\n    }\n  })\n})\n","server/plugins/evlog-custom.ts",[152,1412,1413,1438,1475,1480,1527,1533,1538,1558,1574,1579,1586],{"__ignoreMap":150},[155,1414,1415,1417,1419,1422,1424,1426,1430,1432,1436],{"class":157,"line":158},[155,1416,232],{"class":231},[155,1418,235],{"class":231},[155,1420,1421],{"class":238}," defineNitroPlugin",[155,1423,243],{"class":242},[155,1425,243],{"class":246},[155,1427,1429],{"class":1428},"sHdIc","nitroApp",[155,1431,1033],{"class":246},[155,1433,1435],{"class":1434},"spNyl"," =>",[155,1437,284],{"class":246},[155,1439,1440,1443,1445,1448,1450,1453,1455,1457,1459,1461,1463,1466,1469,1471,1473],{"class":157,"line":250},[155,1441,1442],{"class":242},"  nitroApp",[155,1444,1219],{"class":246},[155,1446,1447],{"class":242},"hooks",[155,1449,1219],{"class":246},[155,1451,1452],{"class":238},"hook",[155,1454,243],{"class":253},[155,1456,263],{"class":246},[155,1458,1405],{"class":164},[155,1460,263],{"class":246},[155,1462,726],{"class":246},[155,1464,1465],{"class":246}," (",[155,1467,1468],{"class":1428},"ctx",[155,1470,1033],{"class":246},[155,1472,1435],{"class":1434},[155,1474,284],{"class":246},[155,1476,1477],{"class":157,"line":276},[155,1478,1479],{"class":324},"    // Access user from accumulated context\n",[155,1481,1482,1485,1488,1491,1494,1496,1499,1501,1504,1507,1509,1512,1515,1518,1521,1524],{"class":157,"line":287},[155,1483,1484],{"class":1434},"    const",[155,1486,1487],{"class":242}," user",[155,1489,1490],{"class":246}," =",[155,1492,1493],{"class":242}," ctx",[155,1495,1219],{"class":246},[155,1497,1498],{"class":242},"context",[155,1500,1219],{"class":246},[155,1502,1503],{"class":242},"user",[155,1505,1506],{"class":231}," as",[155,1508,928],{"class":246},[155,1510,1511],{"class":253}," premium",[155,1513,1514],{"class":246},"?:",[155,1516,1517],{"class":161}," boolean",[155,1519,1520],{"class":246}," }",[155,1522,1523],{"class":246}," |",[155,1525,1526],{"class":161}," undefined\n",[155,1528,1529],{"class":157,"line":297},[155,1530,1532],{"emptyLinePlaceholder":1531},true,"\n",[155,1534,1535],{"class":157,"line":315},[155,1536,1537],{"class":324},"    // Force-keep logs for premium users regardless of sampling rate\n",[155,1539,1540,1543,1545,1547,1550,1553,1556],{"class":157,"line":321},[155,1541,1542],{"class":231},"    if",[155,1544,1465],{"class":253},[155,1546,1503],{"class":242},[155,1548,1549],{"class":246},"?.",[155,1551,1552],{"class":242},"premium",[155,1554,1555],{"class":253},") ",[155,1557,247],{"class":246},[155,1559,1560,1563,1565,1568,1570],{"class":157,"line":328},[155,1561,1562],{"class":242},"      ctx",[155,1564,1219],{"class":246},[155,1566,1567],{"class":242},"shouldKeep",[155,1569,1490],{"class":246},[155,1571,1573],{"class":1572},"sfNiH"," true\n",[155,1575,1576],{"class":157,"line":349},[155,1577,1578],{"class":246},"    }\n",[155,1580,1581,1584],{"class":157,"line":355},[155,1582,1583],{"class":246},"  }",[155,1585,388],{"class":253},[155,1587,1588,1590],{"class":157,"line":376},[155,1589,385],{"class":246},[155,1591,388],{"class":242},[129,1593,1594,1595,1598,1599,1029,1602,1029,1605,1029,1608,1611,1612,1219],{},"The hook receives a ",[152,1596,1597],{},"TailSamplingContext"," with ",[152,1600,1601],{},"status",[152,1603,1604],{},"duration",[152,1606,1607],{},"path",[152,1609,1610],{},"method",", and the full accumulated ",[152,1613,1498],{},[390,1615,1617],{"id":1616},"log-draining","Log Draining",[129,1619,1620,1621,1624,1625,1628],{},"Send logs to external services like Axiom, Loki, or custom endpoints using the ",[152,1622,1623],{},"evlog:drain"," hook. The hook is called in ",[817,1626,1627],{},"fire-and-forget"," mode, meaning it never blocks the HTTP response.",[144,1630,1633],{"className":221,"code":1631,"filename":1632,"language":224,"meta":150,"style":150},"export default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', async (ctx) => {\n    // Send wide event to Axiom (fire-and-forget, never blocks response)\n    await fetch('https://api.axiom.co/v1/datasets/logs/ingest', {\n      method: 'POST',\n      headers: { Authorization: `Bearer ${process.env.AXIOM_TOKEN}` },\n      body: JSON.stringify([ctx.event]),\n    })\n  })\n})\n","server/plugins/evlog-axiom.ts",[152,1634,1635,1655,1690,1695,1716,1732,1773,1803,1810,1816],{"__ignoreMap":150},[155,1636,1637,1639,1641,1643,1645,1647,1649,1651,1653],{"class":157,"line":158},[155,1638,232],{"class":231},[155,1640,235],{"class":231},[155,1642,1421],{"class":238},[155,1644,243],{"class":242},[155,1646,243],{"class":246},[155,1648,1429],{"class":1428},[155,1650,1033],{"class":246},[155,1652,1435],{"class":1434},[155,1654,284],{"class":246},[155,1656,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1680,1682,1684,1686,1688],{"class":157,"line":250},[155,1658,1442],{"class":242},[155,1660,1219],{"class":246},[155,1662,1447],{"class":242},[155,1664,1219],{"class":246},[155,1666,1452],{"class":238},[155,1668,243],{"class":253},[155,1670,263],{"class":246},[155,1672,1623],{"class":164},[155,1674,263],{"class":246},[155,1676,726],{"class":246},[155,1678,1679],{"class":1434}," async",[155,1681,1465],{"class":246},[155,1683,1468],{"class":1428},[155,1685,1033],{"class":246},[155,1687,1435],{"class":1434},[155,1689,284],{"class":246},[155,1691,1692],{"class":157,"line":276},[155,1693,1694],{"class":324},"    // Send wide event to Axiom (fire-and-forget, never blocks response)\n",[155,1696,1697,1700,1703,1705,1707,1710,1712,1714],{"class":157,"line":287},[155,1698,1699],{"class":231},"    await",[155,1701,1702],{"class":238}," fetch",[155,1704,243],{"class":253},[155,1706,263],{"class":246},[155,1708,1709],{"class":164},"https://api.axiom.co/v1/datasets/logs/ingest",[155,1711,263],{"class":246},[155,1713,726],{"class":246},[155,1715,284],{"class":246},[155,1717,1718,1721,1723,1725,1728,1730],{"class":157,"line":297},[155,1719,1720],{"class":253},"      method",[155,1722,257],{"class":246},[155,1724,305],{"class":246},[155,1726,1727],{"class":164},"POST",[155,1729,263],{"class":246},[155,1731,273],{"class":246},[155,1733,1734,1737,1739,1741,1744,1746,1749,1752,1755,1758,1760,1763,1765,1768,1771],{"class":157,"line":315},[155,1735,1736],{"class":253},"      headers",[155,1738,257],{"class":246},[155,1740,928],{"class":246},[155,1742,1743],{"class":253}," Authorization",[155,1745,257],{"class":246},[155,1747,1748],{"class":246}," `",[155,1750,1751],{"class":164},"Bearer ",[155,1753,1754],{"class":246},"${",[155,1756,1757],{"class":242},"process",[155,1759,1219],{"class":246},[155,1761,1762],{"class":242},"env",[155,1764,1219],{"class":246},[155,1766,1767],{"class":242},"AXIOM_TOKEN",[155,1769,1770],{"class":246},"}`",[155,1772,943],{"class":246},[155,1774,1775,1778,1780,1783,1785,1788,1791,1793,1795,1798,1801],{"class":157,"line":321},[155,1776,1777],{"class":253},"      body",[155,1779,257],{"class":246},[155,1781,1782],{"class":242}," JSON",[155,1784,1219],{"class":246},[155,1786,1787],{"class":238},"stringify",[155,1789,1790],{"class":253},"([",[155,1792,1468],{"class":242},[155,1794,1219],{"class":246},[155,1796,1797],{"class":242},"event",[155,1799,1800],{"class":253},"])",[155,1802,273],{"class":246},[155,1804,1805,1808],{"class":157,"line":328},[155,1806,1807],{"class":246},"    }",[155,1809,388],{"class":253},[155,1811,1812,1814],{"class":157,"line":349},[155,1813,1583],{"class":246},[155,1815,388],{"class":253},[155,1817,1818,1820],{"class":157,"line":355},[155,1819,385],{"class":246},[155,1821,388],{"class":242},[129,1823,1594,1824,1827],{},[152,1825,1826],{},"DrainContext"," with:",[1014,1829,1830,1839,1852],{},[1017,1831,1832,1834,1835,1838],{},[152,1833,1797],{},": The complete ",[152,1836,1837],{},"WideEvent"," (timestamp, level, service, and all accumulated context)",[1017,1840,1841,1844,1845,1029,1847,1029,1849,1033],{},[152,1842,1843],{},"request",": Optional request metadata (",[152,1846,1610],{},[152,1848,1607],{},[152,1850,1851],{},"requestId",[1017,1853,1854,1857],{},[152,1855,1856],{},"headers",": HTTP headers from the original request (useful for correlation with external services)",[813,1859,1860,1863,1864,1029,1867,1029,1870,1029,1873,1029,1876,1029,1879,1882],{"color":1207,"icon":49},[817,1861,1862],{},"Security:"," Sensitive headers (",[152,1865,1866],{},"authorization",[152,1868,1869],{},"cookie",[152,1871,1872],{},"set-cookie",[152,1874,1875],{},"x-api-key",[152,1877,1878],{},"x-auth-token",[152,1880,1881],{},"proxy-authorization",") are automatically filtered out and never passed to the drain hook.",[1053,1884,1886],{"id":1885},"using-headers-for-external-service-correlation","Using Headers for External Service Correlation",[129,1888,1889,1890,1892],{},"The ",[152,1891,1856],{}," field allows you to correlate logs with external services like PostHog, Sentry, or custom analytics:",[144,1894,1897],{"className":221,"code":1895,"filename":1896,"language":224,"meta":150,"style":150},"export default defineNitroPlugin((nitroApp) => {\n  const posthog = usePostHog()\n\n  nitroApp.hooks.hook('evlog:drain', (ctx) => {\n    if (!posthog) return\n\n    // Extract correlation headers sent from the client\n    // These headers are safe (sensitive headers like Authorization are filtered)\n    const sessionId = ctx.headers?.['x-posthog-session-id']\n    const distinctId = ctx.headers?.['x-posthog-distinct-id']\n\n    if (!distinctId) return\n\n    // Correlate server logs with client sessions in PostHog\n    posthog.capture({\n      distinctId,\n      event: 'server_log',\n      properties: {\n        ...ctx.event,\n        $session_id: sessionId,\n      },\n    })\n  })\n})\n","server/plugins/evlog-posthog.ts",[152,1898,1899,1919,1935,1939,1971,1988,1992,1997,2002,2032,2060,2064,2079,2083,2089,2104,2112,2129,2139,2153,2165,2170,2177,2184],{"__ignoreMap":150},[155,1900,1901,1903,1905,1907,1909,1911,1913,1915,1917],{"class":157,"line":158},[155,1902,232],{"class":231},[155,1904,235],{"class":231},[155,1906,1421],{"class":238},[155,1908,243],{"class":242},[155,1910,243],{"class":246},[155,1912,1429],{"class":1428},[155,1914,1033],{"class":246},[155,1916,1435],{"class":1434},[155,1918,284],{"class":246},[155,1920,1921,1924,1927,1929,1932],{"class":157,"line":250},[155,1922,1923],{"class":1434},"  const",[155,1925,1926],{"class":242}," posthog",[155,1928,1490],{"class":246},[155,1930,1931],{"class":238}," usePostHog",[155,1933,1934],{"class":253},"()\n",[155,1936,1937],{"class":157,"line":276},[155,1938,1532],{"emptyLinePlaceholder":1531},[155,1940,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967,1969],{"class":157,"line":287},[155,1942,1442],{"class":242},[155,1944,1219],{"class":246},[155,1946,1447],{"class":242},[155,1948,1219],{"class":246},[155,1950,1452],{"class":238},[155,1952,243],{"class":253},[155,1954,263],{"class":246},[155,1956,1623],{"class":164},[155,1958,263],{"class":246},[155,1960,726],{"class":246},[155,1962,1465],{"class":246},[155,1964,1468],{"class":1428},[155,1966,1033],{"class":246},[155,1968,1435],{"class":1434},[155,1970,284],{"class":246},[155,1972,1973,1975,1977,1980,1983,1985],{"class":157,"line":297},[155,1974,1542],{"class":231},[155,1976,1465],{"class":253},[155,1978,1979],{"class":246},"!",[155,1981,1982],{"class":242},"posthog",[155,1984,1555],{"class":253},[155,1986,1987],{"class":231},"return\n",[155,1989,1990],{"class":157,"line":315},[155,1991,1532],{"emptyLinePlaceholder":1531},[155,1993,1994],{"class":157,"line":321},[155,1995,1996],{"class":324},"    // Extract correlation headers sent from the client\n",[155,1998,1999],{"class":157,"line":328},[155,2000,2001],{"class":324},"    // These headers are safe (sensitive headers like Authorization are filtered)\n",[155,2003,2004,2006,2009,2011,2013,2015,2017,2019,2022,2024,2027,2029],{"class":157,"line":349},[155,2005,1484],{"class":1434},[155,2007,2008],{"class":242}," sessionId",[155,2010,1490],{"class":246},[155,2012,1493],{"class":242},[155,2014,1219],{"class":246},[155,2016,1856],{"class":242},[155,2018,1549],{"class":246},[155,2020,2021],{"class":253},"[",[155,2023,263],{"class":246},[155,2025,2026],{"class":164},"x-posthog-session-id",[155,2028,263],{"class":246},[155,2030,2031],{"class":253},"]\n",[155,2033,2034,2036,2039,2041,2043,2045,2047,2049,2051,2053,2056,2058],{"class":157,"line":355},[155,2035,1484],{"class":1434},[155,2037,2038],{"class":242}," distinctId",[155,2040,1490],{"class":246},[155,2042,1493],{"class":242},[155,2044,1219],{"class":246},[155,2046,1856],{"class":242},[155,2048,1549],{"class":246},[155,2050,2021],{"class":253},[155,2052,263],{"class":246},[155,2054,2055],{"class":164},"x-posthog-distinct-id",[155,2057,263],{"class":246},[155,2059,2031],{"class":253},[155,2061,2062],{"class":157,"line":376},[155,2063,1532],{"emptyLinePlaceholder":1531},[155,2065,2066,2068,2070,2072,2075,2077],{"class":157,"line":382},[155,2067,1542],{"class":231},[155,2069,1465],{"class":253},[155,2071,1979],{"class":246},[155,2073,2074],{"class":242},"distinctId",[155,2076,1555],{"class":253},[155,2078,1987],{"class":231},[155,2080,2081],{"class":157,"line":807},[155,2082,1532],{"emptyLinePlaceholder":1531},[155,2084,2086],{"class":157,"line":2085},14,[155,2087,2088],{"class":324},"    // Correlate server logs with client sessions in PostHog\n",[155,2090,2092,2095,2097,2100,2102],{"class":157,"line":2091},15,[155,2093,2094],{"class":242},"    posthog",[155,2096,1219],{"class":246},[155,2098,2099],{"class":238},"capture",[155,2101,243],{"class":253},[155,2103,247],{"class":246},[155,2105,2107,2110],{"class":157,"line":2106},16,[155,2108,2109],{"class":242},"      distinctId",[155,2111,273],{"class":246},[155,2113,2115,2118,2120,2122,2125,2127],{"class":157,"line":2114},17,[155,2116,2117],{"class":253},"      event",[155,2119,257],{"class":246},[155,2121,305],{"class":246},[155,2123,2124],{"class":164},"server_log",[155,2126,263],{"class":246},[155,2128,273],{"class":246},[155,2130,2132,2135,2137],{"class":157,"line":2131},18,[155,2133,2134],{"class":253},"      properties",[155,2136,257],{"class":246},[155,2138,284],{"class":246},[155,2140,2142,2145,2147,2149,2151],{"class":157,"line":2141},19,[155,2143,2144],{"class":246},"        ...",[155,2146,1468],{"class":242},[155,2148,1219],{"class":246},[155,2150,1797],{"class":242},[155,2152,273],{"class":246},[155,2154,2156,2159,2161,2163],{"class":157,"line":2155},20,[155,2157,2158],{"class":253},"        $session_id",[155,2160,257],{"class":246},[155,2162,2008],{"class":242},[155,2164,273],{"class":246},[155,2166,2168],{"class":157,"line":2167},21,[155,2169,1190],{"class":246},[155,2171,2173,2175],{"class":157,"line":2172},22,[155,2174,1807],{"class":246},[155,2176,388],{"class":253},[155,2178,2180,2182],{"class":157,"line":2179},23,[155,2181,1583],{"class":246},[155,2183,388],{"class":253},[155,2185,2187,2189],{"class":157,"line":2186},24,[155,2188,385],{"class":246},[155,2190,388],{"class":242},[390,2192,2194],{"id":2193},"event-enrichment","Event Enrichment",[129,2196,2197],{},"Enrich your wide events with derived context like user agent, geo data, request size, and trace context. Enrichers run after emit, before drain.",[144,2199,2202],{"className":221,"code":2200,"filename":2201,"language":224,"meta":150,"style":150},"import {\n  createUserAgentEnricher,\n  createGeoEnricher,\n  createRequestSizeEnricher,\n  createTraceContextEnricher,\n} from 'evlog/enrichers'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const enrichers = [\n    createUserAgentEnricher(),\n    createGeoEnricher(),\n    createRequestSizeEnricher(),\n    createTraceContextEnricher(),\n  ]\n\n  nitroApp.hooks.hook('evlog:enrich', (ctx) => {\n    for (const enricher of enrichers) enricher(ctx)\n  })\n})\n","server/plugins/evlog-enrich.ts",[152,2203,2204,2211,2218,2225,2232,2239,2254,2258,2278,2289,2299,2308,2317,2326,2331,2335,2368,2397,2403],{"__ignoreMap":150},[155,2205,2206,2209],{"class":157,"line":158},[155,2207,2208],{"class":231},"import",[155,2210,284],{"class":246},[155,2212,2213,2216],{"class":157,"line":250},[155,2214,2215],{"class":242},"  createUserAgentEnricher",[155,2217,273],{"class":246},[155,2219,2220,2223],{"class":157,"line":276},[155,2221,2222],{"class":242},"  createGeoEnricher",[155,2224,273],{"class":246},[155,2226,2227,2230],{"class":157,"line":287},[155,2228,2229],{"class":242},"  createRequestSizeEnricher",[155,2231,273],{"class":246},[155,2233,2234,2237],{"class":157,"line":297},[155,2235,2236],{"class":242},"  createTraceContextEnricher",[155,2238,273],{"class":246},[155,2240,2241,2243,2246,2248,2251],{"class":157,"line":315},[155,2242,385],{"class":246},[155,2244,2245],{"class":231}," from",[155,2247,305],{"class":246},[155,2249,2250],{"class":164},"evlog/enrichers",[155,2252,2253],{"class":246},"'\n",[155,2255,2256],{"class":157,"line":321},[155,2257,1532],{"emptyLinePlaceholder":1531},[155,2259,2260,2262,2264,2266,2268,2270,2272,2274,2276],{"class":157,"line":328},[155,2261,232],{"class":231},[155,2263,235],{"class":231},[155,2265,1421],{"class":238},[155,2267,243],{"class":242},[155,2269,243],{"class":246},[155,2271,1429],{"class":1428},[155,2273,1033],{"class":246},[155,2275,1435],{"class":1434},[155,2277,284],{"class":246},[155,2279,2280,2282,2285,2287],{"class":157,"line":349},[155,2281,1923],{"class":1434},[155,2283,2284],{"class":242}," enrichers",[155,2286,1490],{"class":246},[155,2288,751],{"class":253},[155,2290,2291,2294,2297],{"class":157,"line":355},[155,2292,2293],{"class":238},"    createUserAgentEnricher",[155,2295,2296],{"class":253},"()",[155,2298,273],{"class":246},[155,2300,2301,2304,2306],{"class":157,"line":376},[155,2302,2303],{"class":238},"    createGeoEnricher",[155,2305,2296],{"class":253},[155,2307,273],{"class":246},[155,2309,2310,2313,2315],{"class":157,"line":382},[155,2311,2312],{"class":238},"    createRequestSizeEnricher",[155,2314,2296],{"class":253},[155,2316,273],{"class":246},[155,2318,2319,2322,2324],{"class":157,"line":807},[155,2320,2321],{"class":238},"    createTraceContextEnricher",[155,2323,2296],{"class":253},[155,2325,273],{"class":246},[155,2327,2328],{"class":157,"line":2085},[155,2329,2330],{"class":253},"  ]\n",[155,2332,2333],{"class":157,"line":2091},[155,2334,1532],{"emptyLinePlaceholder":1531},[155,2336,2337,2339,2341,2343,2345,2347,2349,2351,2354,2356,2358,2360,2362,2364,2366],{"class":157,"line":2106},[155,2338,1442],{"class":242},[155,2340,1219],{"class":246},[155,2342,1447],{"class":242},[155,2344,1219],{"class":246},[155,2346,1452],{"class":238},[155,2348,243],{"class":253},[155,2350,263],{"class":246},[155,2352,2353],{"class":164},"evlog:enrich",[155,2355,263],{"class":246},[155,2357,726],{"class":246},[155,2359,1465],{"class":246},[155,2361,1468],{"class":1428},[155,2363,1033],{"class":246},[155,2365,1435],{"class":1434},[155,2367,284],{"class":246},[155,2369,2370,2373,2375,2378,2381,2384,2386,2388,2391,2393,2395],{"class":157,"line":2114},[155,2371,2372],{"class":231},"    for",[155,2374,1465],{"class":253},[155,2376,2377],{"class":1434},"const",[155,2379,2380],{"class":242}," enricher",[155,2382,2383],{"class":246}," of",[155,2385,2284],{"class":242},[155,2387,1555],{"class":253},[155,2389,2390],{"class":238},"enricher",[155,2392,243],{"class":253},[155,2394,1468],{"class":242},[155,2396,388],{"class":253},[155,2398,2399,2401],{"class":157,"line":2131},[155,2400,1583],{"class":246},[155,2402,388],{"class":253},[155,2404,2405,2407],{"class":157,"line":2141},[155,2406,385],{"class":246},[155,2408,388],{"class":242},[395,2410,2411,2423],{},[398,2412,2413],{},[401,2414,2415,2418,2421],{},[404,2416,2417],{},"Enricher",[404,2419,2420],{},"Event Field",[404,2422,415],{},[417,2424,2425,2440,2455,2470],{},[401,2426,2427,2432,2437],{},[422,2428,2429],{},[152,2430,2431],{},"createUserAgentEnricher()",[422,2433,2434],{},[152,2435,2436],{},"userAgent",[422,2438,2439],{},"Browser, OS, device type from User-Agent header",[401,2441,2442,2447,2452],{},[422,2443,2444],{},[152,2445,2446],{},"createGeoEnricher()",[422,2448,2449],{},[152,2450,2451],{},"geo",[422,2453,2454],{},"Country, region, city from platform headers (Vercel, Cloudflare)",[401,2456,2457,2462,2467],{},[422,2458,2459],{},[152,2460,2461],{},"createRequestSizeEnricher()",[422,2463,2464],{},[152,2465,2466],{},"requestSize",[422,2468,2469],{},"Request/response payload sizes from Content-Length",[401,2471,2472,2477,2482],{},[422,2473,2474],{},[152,2475,2476],{},"createTraceContextEnricher()",[422,2478,2479],{},[152,2480,2481],{},"traceContext",[422,2483,2484],{},"W3C trace context (traceId, spanId) from traceparent header",[129,2486,2487],{},"You can also write custom enrichers to add any derived context:",[144,2489,2491],{"className":221,"code":2490,"filename":2201,"language":224,"meta":150,"style":150},"export default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:enrich', (ctx) => {\n    ctx.event.deploymentId = process.env.DEPLOYMENT_ID\n  })\n})\n",[152,2492,2493,2513,2545,2573,2579],{"__ignoreMap":150},[155,2494,2495,2497,2499,2501,2503,2505,2507,2509,2511],{"class":157,"line":158},[155,2496,232],{"class":231},[155,2498,235],{"class":231},[155,2500,1421],{"class":238},[155,2502,243],{"class":242},[155,2504,243],{"class":246},[155,2506,1429],{"class":1428},[155,2508,1033],{"class":246},[155,2510,1435],{"class":1434},[155,2512,284],{"class":246},[155,2514,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541,2543],{"class":157,"line":250},[155,2516,1442],{"class":242},[155,2518,1219],{"class":246},[155,2520,1447],{"class":242},[155,2522,1219],{"class":246},[155,2524,1452],{"class":238},[155,2526,243],{"class":253},[155,2528,263],{"class":246},[155,2530,2353],{"class":164},[155,2532,263],{"class":246},[155,2534,726],{"class":246},[155,2536,1465],{"class":246},[155,2538,1468],{"class":1428},[155,2540,1033],{"class":246},[155,2542,1435],{"class":1434},[155,2544,284],{"class":246},[155,2546,2547,2550,2552,2554,2556,2559,2561,2564,2566,2568,2570],{"class":157,"line":276},[155,2548,2549],{"class":242},"    ctx",[155,2551,1219],{"class":246},[155,2553,1797],{"class":242},[155,2555,1219],{"class":246},[155,2557,2558],{"class":242},"deploymentId",[155,2560,1490],{"class":246},[155,2562,2563],{"class":242}," process",[155,2565,1219],{"class":246},[155,2567,1762],{"class":242},[155,2569,1219],{"class":246},[155,2571,2572],{"class":242},"DEPLOYMENT_ID\n",[155,2574,2575,2577],{"class":157,"line":287},[155,2576,1583],{"class":246},[155,2578,388],{"class":253},[155,2580,2581,2583],{"class":157,"line":297},[155,2582,385],{"class":246},[155,2584,388],{"class":242},[129,2586,2587,2588,2591],{},"See the ",[583,2589,2590],{"href":111},"Enrichers guide"," for full documentation.",[390,2593,629],{"id":2594},"client-transport",[129,2596,2597,2598,1029,2601,2604,2605,2608],{},"Send browser logs to your server for centralized logging. When enabled, client-side ",[152,2599,2600],{},"log.info()",[152,2602,2603],{},"log.error()",", etc. calls are automatically sent to the server via the ",[152,2606,2607],{},"/api/_evlog/ingest"," endpoint.",[144,2610,2612],{"className":221,"code":2611,"filename":223,"language":224,"meta":150,"style":150},"export default defineNuxtConfig({\n  modules: ['evlog/nuxt'],\n  evlog: {\n    transport: {\n      enabled: true,  // Enable client log transport\n      endpoint: '/api/_evlog/ingest',  // default\n    },\n  },\n})\n",[152,2613,2614,2626,2644,2652,2661,2676,2694,2698,2702],{"__ignoreMap":150},[155,2615,2616,2618,2620,2622,2624],{"class":157,"line":158},[155,2617,232],{"class":231},[155,2619,235],{"class":231},[155,2621,239],{"class":238},[155,2623,243],{"class":242},[155,2625,247],{"class":246},[155,2627,2628,2630,2632,2634,2636,2638,2640,2642],{"class":157,"line":250},[155,2629,254],{"class":253},[155,2631,257],{"class":246},[155,2633,260],{"class":242},[155,2635,263],{"class":246},[155,2637,217],{"class":164},[155,2639,263],{"class":246},[155,2641,270],{"class":242},[155,2643,273],{"class":246},[155,2645,2646,2648,2650],{"class":157,"line":276},[155,2647,279],{"class":253},[155,2649,257],{"class":246},[155,2651,284],{"class":246},[155,2653,2654,2657,2659],{"class":157,"line":287},[155,2655,2656],{"class":253},"    transport",[155,2658,257],{"class":246},[155,2660,284],{"class":246},[155,2662,2663,2666,2668,2671,2673],{"class":157,"line":297},[155,2664,2665],{"class":253},"      enabled",[155,2667,257],{"class":246},[155,2669,2670],{"class":1572}," true",[155,2672,726],{"class":246},[155,2674,2675],{"class":324},"  // Enable client log transport\n",[155,2677,2678,2681,2683,2685,2687,2689,2691],{"class":157,"line":315},[155,2679,2680],{"class":253},"      endpoint",[155,2682,257],{"class":246},[155,2684,305],{"class":246},[155,2686,2607],{"class":164},[155,2688,263],{"class":246},[155,2690,726],{"class":246},[155,2692,2693],{"class":324},"  // default\n",[155,2695,2696],{"class":157,"line":321},[155,2697,318],{"class":246},[155,2699,2700],{"class":157,"line":328},[155,2701,379],{"class":246},[155,2703,2704,2706],{"class":157,"line":349},[155,2705,385],{"class":246},[155,2707,388],{"class":242},[1053,2709,2711],{"id":2710},"how-it-works","How it works",[2713,2714,2715,2721,2727,2730,2738],"ol",{},[1017,2716,2717,2718],{},"Client calls ",[152,2719,2720],{},"log.info({ action: 'click', button: 'submit' })",[1017,2722,2723,2724,2726],{},"Log is sent to ",[152,2725,2607],{}," via POST",[1017,2728,2729],{},"Server enriches with environment context (service, version, region, etc.)",[1017,2731,2732,2734,2735],{},[152,2733,1623],{}," hook is called with ",[152,2736,2737],{},"source: 'client'",[1017,2739,2740],{},"External services receive the log (Axiom, Loki, etc.)",[813,2742,2743,2744,1029,2747,2750,2751,2754],{"color":815,"icon":13},"Client logs are automatically enriched with the server's environment context. You don't need to send ",[152,2745,2746],{},"service",[152,2748,2749],{},"environment",", or ",[152,2752,2753],{},"version"," from the client.",[129,2756,2757,2758,2760],{},"In your drain hook, you can identify client logs by the ",[152,2759,2737],{}," field:",[144,2762,2765],{"className":221,"code":2763,"filename":2764,"language":224,"meta":150,"style":150},"export default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', async (ctx) => {\n    if (ctx.event.source === 'client') {\n      // Handle client logs specifically\n      console.log('[CLIENT]', ctx.event)\n    }\n    // Send to external service...\n  })\n})\n","server/plugins/evlog-drain.ts",[152,2766,2767,2787,2821,2852,2857,2886,2890,2895,2901],{"__ignoreMap":150},[155,2768,2769,2771,2773,2775,2777,2779,2781,2783,2785],{"class":157,"line":158},[155,2770,232],{"class":231},[155,2772,235],{"class":231},[155,2774,1421],{"class":238},[155,2776,243],{"class":242},[155,2778,243],{"class":246},[155,2780,1429],{"class":1428},[155,2782,1033],{"class":246},[155,2784,1435],{"class":1434},[155,2786,284],{"class":246},[155,2788,2789,2791,2793,2795,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815,2817,2819],{"class":157,"line":250},[155,2790,1442],{"class":242},[155,2792,1219],{"class":246},[155,2794,1447],{"class":242},[155,2796,1219],{"class":246},[155,2798,1452],{"class":238},[155,2800,243],{"class":253},[155,2802,263],{"class":246},[155,2804,1623],{"class":164},[155,2806,263],{"class":246},[155,2808,726],{"class":246},[155,2810,1679],{"class":1434},[155,2812,1465],{"class":246},[155,2814,1468],{"class":1428},[155,2816,1033],{"class":246},[155,2818,1435],{"class":1434},[155,2820,284],{"class":246},[155,2822,2823,2825,2827,2829,2831,2833,2835,2838,2841,2843,2846,2848,2850],{"class":157,"line":276},[155,2824,1542],{"class":231},[155,2826,1465],{"class":253},[155,2828,1468],{"class":242},[155,2830,1219],{"class":246},[155,2832,1797],{"class":242},[155,2834,1219],{"class":246},[155,2836,2837],{"class":242},"source",[155,2839,2840],{"class":246}," ===",[155,2842,305],{"class":246},[155,2844,2845],{"class":164},"client",[155,2847,263],{"class":246},[155,2849,1555],{"class":253},[155,2851,247],{"class":246},[155,2853,2854],{"class":157,"line":287},[155,2855,2856],{"class":324},"      // Handle client logs specifically\n",[155,2858,2859,2862,2864,2867,2869,2871,2874,2876,2878,2880,2882,2884],{"class":157,"line":297},[155,2860,2861],{"class":242},"      console",[155,2863,1219],{"class":246},[155,2865,2866],{"class":238},"log",[155,2868,243],{"class":253},[155,2870,263],{"class":246},[155,2872,2873],{"class":164},"[CLIENT]",[155,2875,263],{"class":246},[155,2877,726],{"class":246},[155,2879,1493],{"class":242},[155,2881,1219],{"class":246},[155,2883,1797],{"class":242},[155,2885,388],{"class":253},[155,2887,2888],{"class":157,"line":315},[155,2889,1578],{"class":246},[155,2891,2892],{"class":157,"line":321},[155,2893,2894],{"class":324},"    // Send to external service...\n",[155,2896,2897,2899],{"class":157,"line":328},[155,2898,1583],{"class":246},[155,2900,388],{"class":253},[155,2902,2903,2905],{"class":157,"line":349},[155,2904,385],{"class":246},[155,2906,388],{"class":242},[1053,2908,2910],{"id":2909},"client-identity","Client Identity",[129,2912,2913,2914,2917],{},"Attach user identity to all client logs with ",[152,2915,2916],{},"setIdentity()",". Identity fields are automatically included in every log and transported to the server, where all drains (Axiom, PostHog, Sentry, etc.) receive them.",[144,2919,2921],{"className":221,"code":2920,"language":224,"meta":150,"style":150},"// After login\nsetIdentity({ userId: 'usr_123', orgId: 'org_456' })\n\nlog.info({ action: 'checkout' })\n// → { userId: 'usr_123', orgId: 'org_456', action: 'checkout', ... }\n\n// After logout\nclearIdentity()\n",[152,2922,2923,2928,2968,2972,3000,3005,3009,3014],{"__ignoreMap":150},[155,2924,2925],{"class":157,"line":158},[155,2926,2927],{"class":324},"// After login\n",[155,2929,2930,2933,2935,2938,2941,2943,2945,2948,2950,2952,2955,2957,2959,2962,2964,2966],{"class":157,"line":250},[155,2931,2932],{"class":238},"setIdentity",[155,2934,243],{"class":242},[155,2936,2937],{"class":246},"{",[155,2939,2940],{"class":253}," userId",[155,2942,257],{"class":246},[155,2944,305],{"class":246},[155,2946,2947],{"class":164},"usr_123",[155,2949,263],{"class":246},[155,2951,726],{"class":246},[155,2953,2954],{"class":253}," orgId",[155,2956,257],{"class":246},[155,2958,305],{"class":246},[155,2960,2961],{"class":164},"org_456",[155,2963,263],{"class":246},[155,2965,1520],{"class":246},[155,2967,388],{"class":242},[155,2969,2970],{"class":157,"line":276},[155,2971,1532],{"emptyLinePlaceholder":1531},[155,2973,2974,2976,2978,2980,2982,2984,2987,2989,2991,2994,2996,2998],{"class":157,"line":287},[155,2975,2866],{"class":242},[155,2977,1219],{"class":246},[155,2979,815],{"class":238},[155,2981,243],{"class":242},[155,2983,2937],{"class":246},[155,2985,2986],{"class":253}," action",[155,2988,257],{"class":246},[155,2990,305],{"class":246},[155,2992,2993],{"class":164},"checkout",[155,2995,263],{"class":246},[155,2997,1520],{"class":246},[155,2999,388],{"class":242},[155,3001,3002],{"class":157,"line":297},[155,3003,3004],{"class":324},"// → { userId: 'usr_123', orgId: 'org_456', action: 'checkout', ... }\n",[155,3006,3007],{"class":157,"line":315},[155,3008,1532],{"emptyLinePlaceholder":1531},[155,3010,3011],{"class":157,"line":321},[155,3012,3013],{"class":324},"// After logout\n",[155,3015,3016,3019],{"class":157,"line":328},[155,3017,3018],{"class":238},"clearIdentity",[155,3020,1934],{"class":242},[129,3022,3023,3024,658,3026,3028],{},"Both ",[152,3025,2932],{},[152,3027,3018],{}," are auto-imported by the Nuxt module.",[129,3030,3031],{},"Per-event fields override identity fields, so you can always pass explicit values:",[144,3033,3035],{"className":221,"code":3034,"language":224,"meta":150,"style":150},"setIdentity({ userId: 'usr_123' })\nlog.info({ userId: 'usr_admin_override' })\n// → { userId: 'usr_admin_override', ... }\n",[152,3036,3037,3059,3086],{"__ignoreMap":150},[155,3038,3039,3041,3043,3045,3047,3049,3051,3053,3055,3057],{"class":157,"line":158},[155,3040,2932],{"class":238},[155,3042,243],{"class":242},[155,3044,2937],{"class":246},[155,3046,2940],{"class":253},[155,3048,257],{"class":246},[155,3050,305],{"class":246},[155,3052,2947],{"class":164},[155,3054,263],{"class":246},[155,3056,1520],{"class":246},[155,3058,388],{"class":242},[155,3060,3061,3063,3065,3067,3069,3071,3073,3075,3077,3080,3082,3084],{"class":157,"line":250},[155,3062,2866],{"class":242},[155,3064,1219],{"class":246},[155,3066,815],{"class":238},[155,3068,243],{"class":242},[155,3070,2937],{"class":246},[155,3072,2940],{"class":253},[155,3074,257],{"class":246},[155,3076,305],{"class":246},[155,3078,3079],{"class":164},"usr_admin_override",[155,3081,263],{"class":246},[155,3083,1520],{"class":246},[155,3085,388],{"class":242},[155,3087,3088],{"class":157,"line":276},[155,3089,3090],{"class":324},"// → { userId: 'usr_admin_override', ... }\n",[3092,3093,3095],"h5",{"id":3094},"syncing-identity-with-auth","Syncing identity with auth",[129,3097,3098],{},"Use a global route middleware to automatically sync identity with your auth state. It runs on every navigation, handling login and logout naturally:",[144,3100,3103],{"className":221,"code":3101,"filename":3102,"language":224,"meta":150,"style":150},"export default defineNuxtRouteMiddleware(() => {\n  const { user } = useAuth() // better-auth, supabase, clerk, etc.\n\n  if (user.value) {\n    setIdentity({ userId: user.value.id, email: user.value.email })\n  } else {\n    clearIdentity()\n  }\n})\n","middleware/identity.global.ts",[152,3104,3105,3122,3143,3147,3165,3211,3220,3227,3232],{"__ignoreMap":150},[155,3106,3107,3109,3111,3114,3116,3118,3120],{"class":157,"line":158},[155,3108,232],{"class":231},[155,3110,235],{"class":231},[155,3112,3113],{"class":238}," defineNuxtRouteMiddleware",[155,3115,243],{"class":242},[155,3117,2296],{"class":246},[155,3119,1435],{"class":1434},[155,3121,284],{"class":246},[155,3123,3124,3126,3128,3130,3132,3134,3137,3140],{"class":157,"line":250},[155,3125,1923],{"class":1434},[155,3127,928],{"class":246},[155,3129,1487],{"class":242},[155,3131,1520],{"class":246},[155,3133,1490],{"class":246},[155,3135,3136],{"class":238}," useAuth",[155,3138,3139],{"class":253},"() ",[155,3141,3142],{"class":324},"// better-auth, supabase, clerk, etc.\n",[155,3144,3145],{"class":157,"line":276},[155,3146,1532],{"emptyLinePlaceholder":1531},[155,3148,3149,3152,3154,3156,3158,3161,3163],{"class":157,"line":287},[155,3150,3151],{"class":231},"  if",[155,3153,1465],{"class":253},[155,3155,1503],{"class":242},[155,3157,1219],{"class":246},[155,3159,3160],{"class":242},"value",[155,3162,1555],{"class":253},[155,3164,247],{"class":246},[155,3166,3167,3170,3172,3174,3176,3178,3180,3182,3184,3186,3189,3191,3194,3196,3198,3200,3202,3204,3207,3209],{"class":157,"line":297},[155,3168,3169],{"class":238},"    setIdentity",[155,3171,243],{"class":253},[155,3173,2937],{"class":246},[155,3175,2940],{"class":253},[155,3177,257],{"class":246},[155,3179,1487],{"class":242},[155,3181,1219],{"class":246},[155,3183,3160],{"class":242},[155,3185,1219],{"class":246},[155,3187,3188],{"class":242},"id",[155,3190,726],{"class":246},[155,3192,3193],{"class":253}," email",[155,3195,257],{"class":246},[155,3197,1487],{"class":242},[155,3199,1219],{"class":246},[155,3201,3160],{"class":242},[155,3203,1219],{"class":246},[155,3205,3206],{"class":242},"email",[155,3208,1520],{"class":246},[155,3210,388],{"class":253},[155,3212,3213,3215,3218],{"class":157,"line":315},[155,3214,1583],{"class":246},[155,3216,3217],{"class":231}," else",[155,3219,284],{"class":246},[155,3221,3222,3225],{"class":157,"line":321},[155,3223,3224],{"class":238},"    clearIdentity",[155,3226,1934],{"class":253},[155,3228,3229],{"class":157,"line":328},[155,3230,3231],{"class":246},"  }\n",[155,3233,3234,3236],{"class":157,"line":349},[155,3235,385],{"class":246},[155,3237,388],{"class":242},[813,3239,3241,3251],{"color":815,"icon":3240},"i-lucide-lightbulb",[129,3242,3243,3246,3247,3250],{},[817,3244,3245],{},"Tip:"," Use Nuxt's ",[152,3248,3249],{},"$production"," override to sample only in production while keeping full visibility in development:",[144,3252,3254],{"className":221,"code":3253,"filename":223,"language":224,"meta":150,"style":150},"export default defineNuxtConfig({\n  modules: ['evlog/nuxt'],\n  evlog: {\n    env: { service: 'my-app' },\n  },\n  $production: {\n    evlog: {\n      sampling: {\n        rates: { info: 10, warn: 50, debug: 0 },\n        keep: [{ duration: 1000 }, { status: 400 }],\n      },\n    },\n  },\n})\n",[152,3255,3256,3268,3286,3294,3314,3318,3327,3336,3345,3381,3414,3418,3422,3426],{"__ignoreMap":150},[155,3257,3258,3260,3262,3264,3266],{"class":157,"line":158},[155,3259,232],{"class":231},[155,3261,235],{"class":231},[155,3263,239],{"class":238},[155,3265,243],{"class":242},[155,3267,247],{"class":246},[155,3269,3270,3272,3274,3276,3278,3280,3282,3284],{"class":157,"line":250},[155,3271,254],{"class":253},[155,3273,257],{"class":246},[155,3275,260],{"class":242},[155,3277,263],{"class":246},[155,3279,217],{"class":164},[155,3281,263],{"class":246},[155,3283,270],{"class":242},[155,3285,273],{"class":246},[155,3287,3288,3290,3292],{"class":157,"line":276},[155,3289,279],{"class":253},[155,3291,257],{"class":246},[155,3293,284],{"class":246},[155,3295,3296,3298,3300,3302,3304,3306,3308,3310,3312],{"class":157,"line":287},[155,3297,290],{"class":253},[155,3299,257],{"class":246},[155,3301,928],{"class":246},[155,3303,931],{"class":253},[155,3305,257],{"class":246},[155,3307,305],{"class":246},[155,3309,308],{"class":164},[155,3311,263],{"class":246},[155,3313,943],{"class":246},[155,3315,3316],{"class":157,"line":297},[155,3317,379],{"class":246},[155,3319,3320,3323,3325],{"class":157,"line":315},[155,3321,3322],{"class":253},"  $production",[155,3324,257],{"class":246},[155,3326,284],{"class":246},[155,3328,3329,3332,3334],{"class":157,"line":321},[155,3330,3331],{"class":253},"    evlog",[155,3333,257],{"class":246},[155,3335,284],{"class":246},[155,3337,3338,3341,3343],{"class":157,"line":328},[155,3339,3340],{"class":253},"      sampling",[155,3342,257],{"class":246},[155,3344,284],{"class":246},[155,3346,3347,3350,3352,3354,3356,3358,3360,3362,3365,3367,3369,3371,3374,3376,3379],{"class":157,"line":349},[155,3348,3349],{"class":253},"        rates",[155,3351,257],{"class":246},[155,3353,928],{"class":246},[155,3355,1292],{"class":253},[155,3357,257],{"class":246},[155,3359,1135],{"class":1134},[155,3361,726],{"class":246},[155,3363,3364],{"class":253}," warn",[155,3366,257],{"class":246},[155,3368,1150],{"class":1134},[155,3370,726],{"class":246},[155,3372,3373],{"class":253}," debug",[155,3375,257],{"class":246},[155,3377,3378],{"class":1134}," 0",[155,3380,943],{"class":246},[155,3382,3383,3386,3388,3390,3392,3394,3396,3398,3400,3402,3404,3406,3408,3410,3412],{"class":157,"line":355},[155,3384,3385],{"class":253},"        keep",[155,3387,257],{"class":246},[155,3389,260],{"class":242},[155,3391,2937],{"class":246},[155,3393,1319],{"class":253},[155,3395,257],{"class":246},[155,3397,1324],{"class":1134},[155,3399,1299],{"class":246},[155,3401,928],{"class":246},[155,3403,1336],{"class":253},[155,3405,257],{"class":246},[155,3407,1341],{"class":1134},[155,3409,1520],{"class":246},[155,3411,270],{"class":242},[155,3413,273],{"class":246},[155,3415,3416],{"class":157,"line":376},[155,3417,1190],{"class":246},[155,3419,3420],{"class":157,"line":382},[155,3421,318],{"class":246},[155,3423,3424],{"class":157,"line":807},[155,3425,379],{"class":246},[155,3427,3428,3430],{"class":157,"line":2085},[155,3429,385],{"class":246},[155,3431,388],{"class":242},[129,3433,3434,3435,3438],{},"That's it! You can now use ",[152,3436,3437],{},"useLogger(event)"," in any API route.",[133,3440,3442],{"id":3441},"nitro","Nitro",[129,3444,139],{},[141,3446,3447,3459,3471,3483],{},[144,3448,3449],{"className":146,"code":147,"filename":148,"language":149,"meta":150,"style":150},[152,3450,3451],{"__ignoreMap":150},[155,3452,3453,3455,3457],{"class":157,"line":158},[155,3454,148],{"class":161},[155,3456,165],{"class":164},[155,3458,168],{"class":164},[144,3460,3461],{"className":146,"code":171,"filename":172,"language":149,"meta":150,"style":150},[152,3462,3463],{"__ignoreMap":150},[155,3464,3465,3467,3469],{"class":157,"line":158},[155,3466,172],{"class":161},[155,3468,181],{"class":164},[155,3470,168],{"class":164},[144,3472,3473],{"className":146,"code":186,"filename":187,"language":149,"meta":150,"style":150},[152,3474,3475],{"__ignoreMap":150},[155,3476,3477,3479,3481],{"class":157,"line":158},[155,3478,187],{"class":161},[155,3480,165],{"class":164},[155,3482,168],{"class":164},[144,3484,3485],{"className":146,"code":200,"filename":201,"language":149,"meta":150,"style":150},[152,3486,3487],{"__ignoreMap":150},[155,3488,3489,3491,3493],{"class":157,"line":158},[155,3490,201],{"class":161},[155,3492,165],{"class":164},[155,3494,168],{"class":164},[129,3496,3497,3498,3501],{},"Then, add evlog as a Nitro plugin (without Nuxt) using the ",[152,3499,3500],{},"evlog/nitro"," plugin:",[144,3503,3506],{"className":221,"code":3504,"filename":3505,"language":224,"meta":150,"style":150},"export default defineNitroConfig({\n  plugins: ['evlog/nitro'],\n})\n","nitro.config.ts",[152,3507,3508,3521,3540],{"__ignoreMap":150},[155,3509,3510,3512,3514,3517,3519],{"class":157,"line":158},[155,3511,232],{"class":231},[155,3513,235],{"class":231},[155,3515,3516],{"class":238}," defineNitroConfig",[155,3518,243],{"class":242},[155,3520,247],{"class":246},[155,3522,3523,3526,3528,3530,3532,3534,3536,3538],{"class":157,"line":250},[155,3524,3525],{"class":253},"  plugins",[155,3527,257],{"class":246},[155,3529,260],{"class":242},[155,3531,263],{"class":246},[155,3533,3500],{"class":164},[155,3535,263],{"class":246},[155,3537,270],{"class":242},[155,3539,273],{"class":246},[155,3541,3542,3544],{"class":157,"line":276},[155,3543,385],{"class":246},[155,3545,388],{"class":242},[133,3547,3549],{"id":3548},"cloudflare-workers","Cloudflare Workers",[129,3551,3552],{},"Use the Workers adapter for structured logs and correct platform severity.",[144,3554,3557],{"className":221,"code":3555,"filename":3556,"language":224,"meta":150,"style":150},"import { initWorkersLogger, createWorkersLogger } from 'evlog/workers'\n\ninitWorkersLogger({\n  env: { service: 'edge-api' },\n})\n\nexport default {\n  async fetch(request: Request) {\n    const log = createWorkersLogger(request)\n\n    try {\n      log.set({ route: 'health' })\n      const response = new Response('ok', { status: 200 })\n      log.emit({ status: response.status })\n      return response\n    } catch (error) {\n      log.error(error as Error)\n      log.emit({ status: 500 })\n      throw error\n    }\n  },\n}\n","src/index.ts",[152,3558,3559,3584,3588,3597,3619,3625,3629,3637,3657,3674,3678,3685,3715,3755,3782,3790,3806,3825,3848,3856,3860,3864],{"__ignoreMap":150},[155,3560,3561,3563,3565,3568,3570,3573,3575,3577,3579,3582],{"class":157,"line":158},[155,3562,2208],{"class":231},[155,3564,928],{"class":246},[155,3566,3567],{"class":242}," initWorkersLogger",[155,3569,726],{"class":246},[155,3571,3572],{"class":242}," createWorkersLogger",[155,3574,1520],{"class":246},[155,3576,2245],{"class":231},[155,3578,305],{"class":246},[155,3580,3581],{"class":164},"evlog/workers",[155,3583,2253],{"class":246},[155,3585,3586],{"class":157,"line":250},[155,3587,1532],{"emptyLinePlaceholder":1531},[155,3589,3590,3593,3595],{"class":157,"line":276},[155,3591,3592],{"class":238},"initWorkersLogger",[155,3594,243],{"class":242},[155,3596,247],{"class":246},[155,3598,3599,3602,3604,3606,3608,3610,3612,3615,3617],{"class":157,"line":287},[155,3600,3601],{"class":253},"  env",[155,3603,257],{"class":246},[155,3605,928],{"class":246},[155,3607,931],{"class":253},[155,3609,257],{"class":246},[155,3611,305],{"class":246},[155,3613,3614],{"class":164},"edge-api",[155,3616,263],{"class":246},[155,3618,943],{"class":246},[155,3620,3621,3623],{"class":157,"line":297},[155,3622,385],{"class":246},[155,3624,388],{"class":242},[155,3626,3627],{"class":157,"line":315},[155,3628,1532],{"emptyLinePlaceholder":1531},[155,3630,3631,3633,3635],{"class":157,"line":321},[155,3632,232],{"class":231},[155,3634,235],{"class":231},[155,3636,284],{"class":246},[155,3638,3639,3642,3644,3646,3648,3650,3653,3655],{"class":157,"line":328},[155,3640,3641],{"class":1434},"  async",[155,3643,1702],{"class":253},[155,3645,243],{"class":246},[155,3647,1843],{"class":1428},[155,3649,257],{"class":246},[155,3651,3652],{"class":161}," Request",[155,3654,1033],{"class":246},[155,3656,284],{"class":246},[155,3658,3659,3661,3664,3666,3668,3670,3672],{"class":157,"line":349},[155,3660,1484],{"class":1434},[155,3662,3663],{"class":242}," log",[155,3665,1490],{"class":246},[155,3667,3572],{"class":238},[155,3669,243],{"class":253},[155,3671,1843],{"class":242},[155,3673,388],{"class":253},[155,3675,3676],{"class":157,"line":355},[155,3677,1532],{"emptyLinePlaceholder":1531},[155,3679,3680,3683],{"class":157,"line":376},[155,3681,3682],{"class":231},"    try",[155,3684,284],{"class":246},[155,3686,3687,3690,3692,3695,3697,3699,3702,3704,3706,3709,3711,3713],{"class":157,"line":382},[155,3688,3689],{"class":242},"      log",[155,3691,1219],{"class":246},[155,3693,3694],{"class":238},"set",[155,3696,243],{"class":253},[155,3698,2937],{"class":246},[155,3700,3701],{"class":253}," route",[155,3703,257],{"class":246},[155,3705,305],{"class":246},[155,3707,3708],{"class":164},"health",[155,3710,263],{"class":246},[155,3712,1520],{"class":246},[155,3714,388],{"class":253},[155,3716,3717,3720,3723,3725,3728,3731,3733,3735,3738,3740,3742,3744,3746,3748,3751,3753],{"class":157,"line":807},[155,3718,3719],{"class":1434},"      const",[155,3721,3722],{"class":242}," response",[155,3724,1490],{"class":246},[155,3726,3727],{"class":246}," new",[155,3729,3730],{"class":238}," Response",[155,3732,243],{"class":253},[155,3734,263],{"class":246},[155,3736,3737],{"class":164},"ok",[155,3739,263],{"class":246},[155,3741,726],{"class":246},[155,3743,928],{"class":246},[155,3745,1336],{"class":253},[155,3747,257],{"class":246},[155,3749,3750],{"class":1134}," 200",[155,3752,1520],{"class":246},[155,3754,388],{"class":253},[155,3756,3757,3759,3761,3764,3766,3768,3770,3772,3774,3776,3778,3780],{"class":157,"line":2085},[155,3758,3689],{"class":242},[155,3760,1219],{"class":246},[155,3762,3763],{"class":238},"emit",[155,3765,243],{"class":253},[155,3767,2937],{"class":246},[155,3769,1336],{"class":253},[155,3771,257],{"class":246},[155,3773,3722],{"class":242},[155,3775,1219],{"class":246},[155,3777,1601],{"class":242},[155,3779,1520],{"class":246},[155,3781,388],{"class":253},[155,3783,3784,3787],{"class":157,"line":2091},[155,3785,3786],{"class":231},"      return",[155,3788,3789],{"class":242}," response\n",[155,3791,3792,3794,3797,3799,3802,3804],{"class":157,"line":2106},[155,3793,1807],{"class":246},[155,3795,3796],{"class":231}," catch",[155,3798,1465],{"class":253},[155,3800,3801],{"class":242},"error",[155,3803,1555],{"class":253},[155,3805,247],{"class":246},[155,3807,3808,3810,3812,3814,3816,3818,3820,3823],{"class":157,"line":2114},[155,3809,3689],{"class":242},[155,3811,1219],{"class":246},[155,3813,3801],{"class":238},[155,3815,243],{"class":253},[155,3817,3801],{"class":242},[155,3819,1506],{"class":231},[155,3821,3822],{"class":161}," Error",[155,3824,388],{"class":253},[155,3826,3827,3829,3831,3833,3835,3837,3839,3841,3844,3846],{"class":157,"line":2131},[155,3828,3689],{"class":242},[155,3830,1219],{"class":246},[155,3832,3763],{"class":238},[155,3834,243],{"class":253},[155,3836,2937],{"class":246},[155,3838,1336],{"class":253},[155,3840,257],{"class":246},[155,3842,3843],{"class":1134}," 500",[155,3845,1520],{"class":246},[155,3847,388],{"class":253},[155,3849,3850,3853],{"class":157,"line":2141},[155,3851,3852],{"class":231},"      throw",[155,3854,3855],{"class":242}," error\n",[155,3857,3858],{"class":157,"line":2155},[155,3859,1578],{"class":246},[155,3861,3862],{"class":157,"line":2167},[155,3863,379],{"class":246},[155,3865,3866],{"class":157,"line":2172},[155,3867,3868],{"class":246},"}\n",[129,3870,3871],{},"Disable invocation logs to avoid duplicate request logs:",[144,3873,3878],{"className":3874,"code":3875,"filename":3876,"language":3877,"meta":150,"style":150},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[observability.logs]\ninvocation_logs = false\n","wrangler.toml","toml",[152,3879,3880,3885],{"__ignoreMap":150},[155,3881,3882],{"class":157,"line":158},[155,3883,3884],{},"[observability.logs]\n",[155,3886,3887],{"class":157,"line":250},[155,3888,3889],{},"invocation_logs = false\n",[129,3891,3892],{},"Notes:",[1014,3894,3895,3904,3910],{},[1017,3896,3897,3899,3900,3903],{},[152,3898,1851],{}," defaults to ",[152,3901,3902],{},"cf-ray"," when available",[1017,3905,3906,3909],{},[152,3907,3908],{},"request.cf"," is included (colo, country, asn) unless disabled",[1017,3911,655,3912,3915],{},[152,3913,3914],{},"headerAllowlist"," to avoid logging sensitive headers",[813,3917,3920,3921,3927],{"color":3918,"icon":3919},"neutral","i-lucide-arrow-right","See the full ",[583,3922,3926],{"href":3923,"rel":3924},"https://github.com/HugoRCD/evlog/tree/main/examples/workers",[3925],"nofollow","workers example"," for a complete working project.",[133,3929,3931],{"id":3930},"hono","Hono",[129,3933,3934],{},"Use the standalone API to create one wide event per request from a Hono middleware.",[144,3936,3938],{"className":221,"code":3937,"filename":3556,"language":224,"meta":150,"style":150},"import { serve } from '@hono/node-server'\nimport { Hono } from 'hono'\nimport { createRequestLogger, initLogger } from 'evlog'\n\ninitLogger({\n  env: { service: 'hono-api' },\n})\n\nconst app = new Hono()\n\napp.use('*', async (c, next) => {\n  const startedAt = Date.now()\n  const log = createRequestLogger({ method: c.req.method, path: c.req.path })\n\n  try {\n    await next()\n  } catch (error) {\n    log.error(error as Error)\n    throw error\n  } finally {\n    log.emit({\n      status: c.res.status,\n      duration: Date.now() - startedAt,\n    })\n  }\n})\n\napp.get('/health', (c) => c.json({ ok: true }))\n\nserve({ fetch: app.fetch, port: 3000 })\n",[152,3939,3940,3960,3979,4004,4008,4017,4038,4044,4048,4064,4068,4107,4126,4177,4181,4188,4196,4210,4229,4236,4245,4257,4277,4299,4305,4310,4317,4322,4374,4379],{"__ignoreMap":150},[155,3941,3942,3944,3946,3949,3951,3953,3955,3958],{"class":157,"line":158},[155,3943,2208],{"class":231},[155,3945,928],{"class":246},[155,3947,3948],{"class":242}," serve",[155,3950,1520],{"class":246},[155,3952,2245],{"class":231},[155,3954,305],{"class":246},[155,3956,3957],{"class":164},"@hono/node-server",[155,3959,2253],{"class":246},[155,3961,3962,3964,3966,3969,3971,3973,3975,3977],{"class":157,"line":250},[155,3963,2208],{"class":231},[155,3965,928],{"class":246},[155,3967,3968],{"class":242}," Hono",[155,3970,1520],{"class":246},[155,3972,2245],{"class":231},[155,3974,305],{"class":246},[155,3976,3930],{"class":164},[155,3978,2253],{"class":246},[155,3980,3981,3983,3985,3988,3990,3993,3995,3997,3999,4002],{"class":157,"line":276},[155,3982,2208],{"class":231},[155,3984,928],{"class":246},[155,3986,3987],{"class":242}," createRequestLogger",[155,3989,726],{"class":246},[155,3991,3992],{"class":242}," initLogger",[155,3994,1520],{"class":246},[155,3996,2245],{"class":231},[155,3998,305],{"class":246},[155,4000,4001],{"class":164},"evlog",[155,4003,2253],{"class":246},[155,4005,4006],{"class":157,"line":287},[155,4007,1532],{"emptyLinePlaceholder":1531},[155,4009,4010,4013,4015],{"class":157,"line":297},[155,4011,4012],{"class":238},"initLogger",[155,4014,243],{"class":242},[155,4016,247],{"class":246},[155,4018,4019,4021,4023,4025,4027,4029,4031,4034,4036],{"class":157,"line":315},[155,4020,3601],{"class":253},[155,4022,257],{"class":246},[155,4024,928],{"class":246},[155,4026,931],{"class":253},[155,4028,257],{"class":246},[155,4030,305],{"class":246},[155,4032,4033],{"class":164},"hono-api",[155,4035,263],{"class":246},[155,4037,943],{"class":246},[155,4039,4040,4042],{"class":157,"line":321},[155,4041,385],{"class":246},[155,4043,388],{"class":242},[155,4045,4046],{"class":157,"line":328},[155,4047,1532],{"emptyLinePlaceholder":1531},[155,4049,4050,4052,4055,4058,4060,4062],{"class":157,"line":349},[155,4051,2377],{"class":1434},[155,4053,4054],{"class":242}," app ",[155,4056,4057],{"class":246},"=",[155,4059,3727],{"class":246},[155,4061,3968],{"class":238},[155,4063,1934],{"class":242},[155,4065,4066],{"class":157,"line":355},[155,4067,1532],{"emptyLinePlaceholder":1531},[155,4069,4070,4073,4075,4078,4080,4082,4085,4087,4089,4091,4093,4096,4098,4101,4103,4105],{"class":157,"line":376},[155,4071,4072],{"class":242},"app",[155,4074,1219],{"class":246},[155,4076,4077],{"class":238},"use",[155,4079,243],{"class":242},[155,4081,263],{"class":246},[155,4083,4084],{"class":164},"*",[155,4086,263],{"class":246},[155,4088,726],{"class":246},[155,4090,1679],{"class":1434},[155,4092,1465],{"class":246},[155,4094,4095],{"class":1428},"c",[155,4097,726],{"class":246},[155,4099,4100],{"class":1428}," next",[155,4102,1033],{"class":246},[155,4104,1435],{"class":1434},[155,4106,284],{"class":246},[155,4108,4109,4111,4114,4116,4119,4121,4124],{"class":157,"line":382},[155,4110,1923],{"class":1434},[155,4112,4113],{"class":242}," startedAt",[155,4115,1490],{"class":246},[155,4117,4118],{"class":242}," Date",[155,4120,1219],{"class":246},[155,4122,4123],{"class":238},"now",[155,4125,1934],{"class":253},[155,4127,4128,4130,4132,4134,4136,4138,4140,4143,4145,4148,4150,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175],{"class":157,"line":807},[155,4129,1923],{"class":1434},[155,4131,3663],{"class":242},[155,4133,1490],{"class":246},[155,4135,3987],{"class":238},[155,4137,243],{"class":253},[155,4139,2937],{"class":246},[155,4141,4142],{"class":253}," method",[155,4144,257],{"class":246},[155,4146,4147],{"class":242}," c",[155,4149,1219],{"class":246},[155,4151,4152],{"class":242},"req",[155,4154,1219],{"class":246},[155,4156,1610],{"class":242},[155,4158,726],{"class":246},[155,4160,1353],{"class":253},[155,4162,257],{"class":246},[155,4164,4147],{"class":242},[155,4166,1219],{"class":246},[155,4168,4152],{"class":242},[155,4170,1219],{"class":246},[155,4172,1607],{"class":242},[155,4174,1520],{"class":246},[155,4176,388],{"class":253},[155,4178,4179],{"class":157,"line":2085},[155,4180,1532],{"emptyLinePlaceholder":1531},[155,4182,4183,4186],{"class":157,"line":2091},[155,4184,4185],{"class":231},"  try",[155,4187,284],{"class":246},[155,4189,4190,4192,4194],{"class":157,"line":2106},[155,4191,1699],{"class":231},[155,4193,4100],{"class":238},[155,4195,1934],{"class":253},[155,4197,4198,4200,4202,4204,4206,4208],{"class":157,"line":2114},[155,4199,1583],{"class":246},[155,4201,3796],{"class":231},[155,4203,1465],{"class":253},[155,4205,3801],{"class":242},[155,4207,1555],{"class":253},[155,4209,247],{"class":246},[155,4211,4212,4215,4217,4219,4221,4223,4225,4227],{"class":157,"line":2131},[155,4213,4214],{"class":242},"    log",[155,4216,1219],{"class":246},[155,4218,3801],{"class":238},[155,4220,243],{"class":253},[155,4222,3801],{"class":242},[155,4224,1506],{"class":231},[155,4226,3822],{"class":161},[155,4228,388],{"class":253},[155,4230,4231,4234],{"class":157,"line":2141},[155,4232,4233],{"class":231},"    throw",[155,4235,3855],{"class":242},[155,4237,4238,4240,4243],{"class":157,"line":2155},[155,4239,1583],{"class":246},[155,4241,4242],{"class":231}," finally",[155,4244,284],{"class":246},[155,4246,4247,4249,4251,4253,4255],{"class":157,"line":2167},[155,4248,4214],{"class":242},[155,4250,1219],{"class":246},[155,4252,3763],{"class":238},[155,4254,243],{"class":253},[155,4256,247],{"class":246},[155,4258,4259,4262,4264,4266,4268,4271,4273,4275],{"class":157,"line":2172},[155,4260,4261],{"class":253},"      status",[155,4263,257],{"class":246},[155,4265,4147],{"class":242},[155,4267,1219],{"class":246},[155,4269,4270],{"class":242},"res",[155,4272,1219],{"class":246},[155,4274,1601],{"class":242},[155,4276,273],{"class":246},[155,4278,4279,4282,4284,4286,4288,4290,4292,4295,4297],{"class":157,"line":2179},[155,4280,4281],{"class":253},"      duration",[155,4283,257],{"class":246},[155,4285,4118],{"class":242},[155,4287,1219],{"class":246},[155,4289,4123],{"class":238},[155,4291,3139],{"class":253},[155,4293,4294],{"class":246},"-",[155,4296,4113],{"class":242},[155,4298,273],{"class":246},[155,4300,4301,4303],{"class":157,"line":2186},[155,4302,1807],{"class":246},[155,4304,388],{"class":253},[155,4306,4308],{"class":157,"line":4307},25,[155,4309,3231],{"class":246},[155,4311,4313,4315],{"class":157,"line":4312},26,[155,4314,385],{"class":246},[155,4316,388],{"class":242},[155,4318,4320],{"class":157,"line":4319},27,[155,4321,1532],{"emptyLinePlaceholder":1531},[155,4323,4325,4327,4329,4332,4334,4336,4339,4341,4343,4345,4347,4349,4351,4353,4355,4358,4360,4362,4365,4367,4369,4371],{"class":157,"line":4324},28,[155,4326,4072],{"class":242},[155,4328,1219],{"class":246},[155,4330,4331],{"class":238},"get",[155,4333,243],{"class":242},[155,4335,263],{"class":246},[155,4337,4338],{"class":164},"/health",[155,4340,263],{"class":246},[155,4342,726],{"class":246},[155,4344,1465],{"class":246},[155,4346,4095],{"class":1428},[155,4348,1033],{"class":246},[155,4350,1435],{"class":1434},[155,4352,4147],{"class":242},[155,4354,1219],{"class":246},[155,4356,4357],{"class":238},"json",[155,4359,243],{"class":242},[155,4361,2937],{"class":246},[155,4363,4364],{"class":253}," ok",[155,4366,257],{"class":246},[155,4368,2670],{"class":1572},[155,4370,1520],{"class":246},[155,4372,4373],{"class":242},"))\n",[155,4375,4377],{"class":157,"line":4376},29,[155,4378,1532],{"emptyLinePlaceholder":1531},[155,4380,4382,4385,4387,4389,4391,4393,4396,4398,4401,4403,4406,4408,4411,4413],{"class":157,"line":4381},30,[155,4383,4384],{"class":238},"serve",[155,4386,243],{"class":242},[155,4388,2937],{"class":246},[155,4390,1702],{"class":253},[155,4392,257],{"class":246},[155,4394,4395],{"class":242}," app",[155,4397,1219],{"class":246},[155,4399,4400],{"class":242},"fetch",[155,4402,726],{"class":246},[155,4404,4405],{"class":253}," port",[155,4407,257],{"class":246},[155,4409,4410],{"class":1134}," 3000",[155,4412,1520],{"class":246},[155,4414,388],{"class":242},[129,4416,3892],{},[1014,4418,4419,4426,4429],{},[1017,4420,4421,4422,4425],{},"Call ",[152,4423,4424],{},"initLogger()"," once at startup",[1017,4427,4428],{},"Use middleware to create and emit one request-scoped logger per request",[1017,4430,4431,4432,1029,4434,4436],{},"Keep request context explicit (",[152,4433,1610],{},[152,4435,1607],{},", request IDs, user metadata)",[813,4438,3920,4439,3927],{"color":3918,"icon":3919},[583,4440,4443],{"href":4441,"rel":4442},"https://github.com/HugoRCD/evlog/tree/main/examples/hono",[3925],"hono example",[133,4445,4447],{"id":4446},"standalone-typescript","Standalone TypeScript",[129,4449,139],{},[141,4451,4452,4464,4476,4488],{},[144,4453,4454],{"className":146,"code":147,"filename":148,"language":149,"meta":150,"style":150},[152,4455,4456],{"__ignoreMap":150},[155,4457,4458,4460,4462],{"class":157,"line":158},[155,4459,148],{"class":161},[155,4461,165],{"class":164},[155,4463,168],{"class":164},[144,4465,4466],{"className":146,"code":171,"filename":172,"language":149,"meta":150,"style":150},[152,4467,4468],{"__ignoreMap":150},[155,4469,4470,4472,4474],{"class":157,"line":158},[155,4471,172],{"class":161},[155,4473,181],{"class":164},[155,4475,168],{"class":164},[144,4477,4478],{"className":146,"code":186,"filename":187,"language":149,"meta":150,"style":150},[152,4479,4480],{"__ignoreMap":150},[155,4481,4482,4484,4486],{"class":157,"line":158},[155,4483,187],{"class":161},[155,4485,165],{"class":164},[155,4487,168],{"class":164},[144,4489,4490],{"className":146,"code":200,"filename":201,"language":149,"meta":150,"style":150},[152,4491,4492],{"__ignoreMap":150},[155,4493,4494,4496,4498],{"class":157,"line":158},[155,4495,201],{"class":161},[155,4497,165],{"class":164},[155,4499,168],{"class":164},[129,4501,4502],{},"Then, use it as any other TypeScript library within your scripts, CLI tools, workers, or apps:",[144,4504,4507],{"className":221,"code":4505,"filename":4506,"language":224,"meta":150,"style":150},"import { initLogger, createRequestLogger } from 'evlog'\n\n// Initialize once at startup\ninitLogger({\n  env: {\n    service: 'my-worker',\n    environment: 'production',\n  },\n  // Optional: sample logs\n  sampling: {\n    rates: { info: 10, debug: 5 },\n  },\n})\n\n// Create a logger for each operation\nconst log = createRequestLogger({ jobId: job.id })\nlog.set({ source: job.source, target: job.target })\nlog.set({ recordsSynced: 150 })\nlog.emit() // Manual emit required in standalone mode\n","scripts/sync-job.ts",[152,4508,4509,4531,4535,4540,4548,4556,4572,4588,4592,4597,4606,4631,4635,4641,4645,4650,4682,4723,4747],{"__ignoreMap":150},[155,4510,4511,4513,4515,4517,4519,4521,4523,4525,4527,4529],{"class":157,"line":158},[155,4512,2208],{"class":231},[155,4514,928],{"class":246},[155,4516,3992],{"class":242},[155,4518,726],{"class":246},[155,4520,3987],{"class":242},[155,4522,1520],{"class":246},[155,4524,2245],{"class":231},[155,4526,305],{"class":246},[155,4528,4001],{"class":164},[155,4530,2253],{"class":246},[155,4532,4533],{"class":157,"line":250},[155,4534,1532],{"emptyLinePlaceholder":1531},[155,4536,4537],{"class":157,"line":276},[155,4538,4539],{"class":324},"// Initialize once at startup\n",[155,4541,4542,4544,4546],{"class":157,"line":287},[155,4543,4012],{"class":238},[155,4545,243],{"class":242},[155,4547,247],{"class":246},[155,4549,4550,4552,4554],{"class":157,"line":297},[155,4551,3601],{"class":253},[155,4553,257],{"class":246},[155,4555,284],{"class":246},[155,4557,4558,4561,4563,4565,4568,4570],{"class":157,"line":315},[155,4559,4560],{"class":253},"    service",[155,4562,257],{"class":246},[155,4564,305],{"class":246},[155,4566,4567],{"class":164},"my-worker",[155,4569,263],{"class":246},[155,4571,273],{"class":246},[155,4573,4574,4577,4579,4581,4584,4586],{"class":157,"line":321},[155,4575,4576],{"class":253},"    environment",[155,4578,257],{"class":246},[155,4580,305],{"class":246},[155,4582,4583],{"class":164},"production",[155,4585,263],{"class":246},[155,4587,273],{"class":246},[155,4589,4590],{"class":157,"line":328},[155,4591,379],{"class":246},[155,4593,4594],{"class":157,"line":349},[155,4595,4596],{"class":324},"  // Optional: sample logs\n",[155,4598,4599,4602,4604],{"class":157,"line":355},[155,4600,4601],{"class":253},"  sampling",[155,4603,257],{"class":246},[155,4605,284],{"class":246},[155,4607,4608,4611,4613,4615,4617,4619,4621,4623,4625,4627,4629],{"class":157,"line":376},[155,4609,4610],{"class":253},"    rates",[155,4612,257],{"class":246},[155,4614,928],{"class":246},[155,4616,1292],{"class":253},[155,4618,257],{"class":246},[155,4620,1135],{"class":1134},[155,4622,726],{"class":246},[155,4624,3373],{"class":253},[155,4626,257],{"class":246},[155,4628,1165],{"class":1134},[155,4630,943],{"class":246},[155,4632,4633],{"class":157,"line":382},[155,4634,379],{"class":246},[155,4636,4637,4639],{"class":157,"line":807},[155,4638,385],{"class":246},[155,4640,388],{"class":242},[155,4642,4643],{"class":157,"line":2085},[155,4644,1532],{"emptyLinePlaceholder":1531},[155,4646,4647],{"class":157,"line":2091},[155,4648,4649],{"class":324},"// Create a logger for each operation\n",[155,4651,4652,4654,4657,4659,4661,4663,4665,4668,4670,4673,4675,4678,4680],{"class":157,"line":2106},[155,4653,2377],{"class":1434},[155,4655,4656],{"class":242}," log ",[155,4658,4057],{"class":246},[155,4660,3987],{"class":238},[155,4662,243],{"class":242},[155,4664,2937],{"class":246},[155,4666,4667],{"class":253}," jobId",[155,4669,257],{"class":246},[155,4671,4672],{"class":242}," job",[155,4674,1219],{"class":246},[155,4676,4677],{"class":242},"id ",[155,4679,385],{"class":246},[155,4681,388],{"class":242},[155,4683,4684,4686,4688,4690,4692,4694,4697,4699,4701,4703,4705,4707,4710,4712,4714,4716,4719,4721],{"class":157,"line":2114},[155,4685,2866],{"class":242},[155,4687,1219],{"class":246},[155,4689,3694],{"class":238},[155,4691,243],{"class":242},[155,4693,2937],{"class":246},[155,4695,4696],{"class":253}," source",[155,4698,257],{"class":246},[155,4700,4672],{"class":242},[155,4702,1219],{"class":246},[155,4704,2837],{"class":242},[155,4706,726],{"class":246},[155,4708,4709],{"class":253}," target",[155,4711,257],{"class":246},[155,4713,4672],{"class":242},[155,4715,1219],{"class":246},[155,4717,4718],{"class":242},"target ",[155,4720,385],{"class":246},[155,4722,388],{"class":242},[155,4724,4725,4727,4729,4731,4733,4735,4738,4740,4743,4745],{"class":157,"line":2131},[155,4726,2866],{"class":242},[155,4728,1219],{"class":246},[155,4730,3694],{"class":238},[155,4732,243],{"class":242},[155,4734,2937],{"class":246},[155,4736,4737],{"class":253}," recordsSynced",[155,4739,257],{"class":246},[155,4741,4742],{"class":1134}," 150",[155,4744,1520],{"class":246},[155,4746,388],{"class":242},[155,4748,4749,4751,4753,4755,4757],{"class":157,"line":2141},[155,4750,2866],{"class":242},[155,4752,1219],{"class":246},[155,4754,3763],{"class":238},[155,4756,3139],{"class":242},[155,4758,4759],{"class":324},"// Manual emit required in standalone mode\n",[813,4761,4762,4763,4766],{"color":815,"icon":13},"In standalone mode, you must call ",[152,4764,4765],{},"log.emit()"," manually. In Nuxt/Nitro, this happens automatically at request end.",[390,4768,4770],{"id":4769},"draining-logs-to-external-services","Draining Logs to External Services",[129,4772,4773,4774,4777,4778,4780,4781,4784,4785,4788],{},"Use the ",[152,4775,4776],{},"drain"," option in ",[152,4779,4012],{}," to automatically send every emitted event to an external service. This works with all built-in ",[583,4782,4783],{"href":62},"adapters"," and the ",[583,4786,4787],{"href":97},"pipeline"," for batching and retry.",[144,4790,4792],{"className":221,"code":4791,"filename":4506,"language":224,"meta":150,"style":150},"import type { DrainContext } from 'evlog'\nimport { initLogger, log, createRequestLogger } from 'evlog'\nimport { createAxiomDrain } from 'evlog/axiom'\nimport { createDrainPipeline } from 'evlog/pipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 10 } })\nconst drain = pipeline(createAxiomDrain())\n\ninitLogger({\n  env: { service: 'my-script', environment: 'production' },\n  drain,\n})\n\n// Every log is automatically drained\nlog.info({ action: 'sync_started' })\n\nconst reqLog = createRequestLogger({ method: 'POST', path: '/sync' })\nreqLog.set({ recordsSynced: 150 })\nreqLog.emit() // drained automatically\n\n// Flush remaining events before exit\nawait drain.flush()\n",[152,4793,4794,4816,4842,4862,4882,4886,4929,4949,4953,4961,4995,5002,5008,5012,5017,5044,5048,5090,5113,5126,5130,5135],{"__ignoreMap":150},[155,4795,4796,4798,4801,4803,4806,4808,4810,4812,4814],{"class":157,"line":158},[155,4797,2208],{"class":231},[155,4799,4800],{"class":231}," type",[155,4802,928],{"class":246},[155,4804,4805],{"class":242}," DrainContext",[155,4807,1520],{"class":246},[155,4809,2245],{"class":231},[155,4811,305],{"class":246},[155,4813,4001],{"class":164},[155,4815,2253],{"class":246},[155,4817,4818,4820,4822,4824,4826,4828,4830,4832,4834,4836,4838,4840],{"class":157,"line":250},[155,4819,2208],{"class":231},[155,4821,928],{"class":246},[155,4823,3992],{"class":242},[155,4825,726],{"class":246},[155,4827,3663],{"class":242},[155,4829,726],{"class":246},[155,4831,3987],{"class":242},[155,4833,1520],{"class":246},[155,4835,2245],{"class":231},[155,4837,305],{"class":246},[155,4839,4001],{"class":164},[155,4841,2253],{"class":246},[155,4843,4844,4846,4848,4851,4853,4855,4857,4860],{"class":157,"line":276},[155,4845,2208],{"class":231},[155,4847,928],{"class":246},[155,4849,4850],{"class":242}," createAxiomDrain",[155,4852,1520],{"class":246},[155,4854,2245],{"class":231},[155,4856,305],{"class":246},[155,4858,4859],{"class":164},"evlog/axiom",[155,4861,2253],{"class":246},[155,4863,4864,4866,4868,4871,4873,4875,4877,4880],{"class":157,"line":287},[155,4865,2208],{"class":231},[155,4867,928],{"class":246},[155,4869,4870],{"class":242}," createDrainPipeline",[155,4872,1520],{"class":246},[155,4874,2245],{"class":231},[155,4876,305],{"class":246},[155,4878,4879],{"class":164},"evlog/pipeline",[155,4881,2253],{"class":246},[155,4883,4884],{"class":157,"line":297},[155,4885,1532],{"emptyLinePlaceholder":1531},[155,4887,4888,4890,4893,4895,4897,4900,4902,4905,4907,4909,4912,4914,4916,4919,4921,4923,4925,4927],{"class":157,"line":315},[155,4889,2377],{"class":1434},[155,4891,4892],{"class":242}," pipeline ",[155,4894,4057],{"class":246},[155,4896,4870],{"class":238},[155,4898,4899],{"class":246},"\u003C",[155,4901,1826],{"class":161},[155,4903,4904],{"class":246},">",[155,4906,243],{"class":242},[155,4908,2937],{"class":246},[155,4910,4911],{"class":253}," batch",[155,4913,257],{"class":246},[155,4915,928],{"class":246},[155,4917,4918],{"class":253}," size",[155,4920,257],{"class":246},[155,4922,1135],{"class":1134},[155,4924,1520],{"class":246},[155,4926,1520],{"class":246},[155,4928,388],{"class":242},[155,4930,4931,4933,4936,4938,4941,4943,4946],{"class":157,"line":321},[155,4932,2377],{"class":1434},[155,4934,4935],{"class":242}," drain ",[155,4937,4057],{"class":246},[155,4939,4940],{"class":238}," pipeline",[155,4942,243],{"class":242},[155,4944,4945],{"class":238},"createAxiomDrain",[155,4947,4948],{"class":242},"())\n",[155,4950,4951],{"class":157,"line":328},[155,4952,1532],{"emptyLinePlaceholder":1531},[155,4954,4955,4957,4959],{"class":157,"line":349},[155,4956,4012],{"class":238},[155,4958,243],{"class":242},[155,4960,247],{"class":246},[155,4962,4963,4965,4967,4969,4971,4973,4975,4978,4980,4982,4985,4987,4989,4991,4993],{"class":157,"line":355},[155,4964,3601],{"class":253},[155,4966,257],{"class":246},[155,4968,928],{"class":246},[155,4970,931],{"class":253},[155,4972,257],{"class":246},[155,4974,305],{"class":246},[155,4976,4977],{"class":164},"my-script",[155,4979,263],{"class":246},[155,4981,726],{"class":246},[155,4983,4984],{"class":253}," environment",[155,4986,257],{"class":246},[155,4988,305],{"class":246},[155,4990,4583],{"class":164},[155,4992,263],{"class":246},[155,4994,943],{"class":246},[155,4996,4997,5000],{"class":157,"line":376},[155,4998,4999],{"class":242},"  drain",[155,5001,273],{"class":246},[155,5003,5004,5006],{"class":157,"line":382},[155,5005,385],{"class":246},[155,5007,388],{"class":242},[155,5009,5010],{"class":157,"line":807},[155,5011,1532],{"emptyLinePlaceholder":1531},[155,5013,5014],{"class":157,"line":2085},[155,5015,5016],{"class":324},"// Every log is automatically drained\n",[155,5018,5019,5021,5023,5025,5027,5029,5031,5033,5035,5038,5040,5042],{"class":157,"line":2091},[155,5020,2866],{"class":242},[155,5022,1219],{"class":246},[155,5024,815],{"class":238},[155,5026,243],{"class":242},[155,5028,2937],{"class":246},[155,5030,2986],{"class":253},[155,5032,257],{"class":246},[155,5034,305],{"class":246},[155,5036,5037],{"class":164},"sync_started",[155,5039,263],{"class":246},[155,5041,1520],{"class":246},[155,5043,388],{"class":242},[155,5045,5046],{"class":157,"line":2106},[155,5047,1532],{"emptyLinePlaceholder":1531},[155,5049,5050,5052,5055,5057,5059,5061,5063,5065,5067,5069,5071,5073,5075,5077,5079,5081,5084,5086,5088],{"class":157,"line":2114},[155,5051,2377],{"class":1434},[155,5053,5054],{"class":242}," reqLog ",[155,5056,4057],{"class":246},[155,5058,3987],{"class":238},[155,5060,243],{"class":242},[155,5062,2937],{"class":246},[155,5064,4142],{"class":253},[155,5066,257],{"class":246},[155,5068,305],{"class":246},[155,5070,1727],{"class":164},[155,5072,263],{"class":246},[155,5074,726],{"class":246},[155,5076,1353],{"class":253},[155,5078,257],{"class":246},[155,5080,305],{"class":246},[155,5082,5083],{"class":164},"/sync",[155,5085,263],{"class":246},[155,5087,1520],{"class":246},[155,5089,388],{"class":242},[155,5091,5092,5095,5097,5099,5101,5103,5105,5107,5109,5111],{"class":157,"line":2131},[155,5093,5094],{"class":242},"reqLog",[155,5096,1219],{"class":246},[155,5098,3694],{"class":238},[155,5100,243],{"class":242},[155,5102,2937],{"class":246},[155,5104,4737],{"class":253},[155,5106,257],{"class":246},[155,5108,4742],{"class":1134},[155,5110,1520],{"class":246},[155,5112,388],{"class":242},[155,5114,5115,5117,5119,5121,5123],{"class":157,"line":2141},[155,5116,5094],{"class":242},[155,5118,1219],{"class":246},[155,5120,3763],{"class":238},[155,5122,3139],{"class":242},[155,5124,5125],{"class":324},"// drained automatically\n",[155,5127,5128],{"class":157,"line":2155},[155,5129,1532],{"emptyLinePlaceholder":1531},[155,5131,5132],{"class":157,"line":2167},[155,5133,5134],{"class":324},"// Flush remaining events before exit\n",[155,5136,5137,5140,5143,5145,5148],{"class":157,"line":2172},[155,5138,5139],{"class":231},"await",[155,5141,5142],{"class":242}," drain",[155,5144,1219],{"class":246},[155,5146,5147],{"class":238},"flush",[155,5149,1934],{"class":242},[813,5151,3920,5152,5157],{"color":3918,"icon":3919},[583,5153,5156],{"href":5154,"rel":5155},"https://github.com/HugoRCD/evlog/tree/main/examples/bun-script",[3925],"bun-script example"," for a complete working script.",[133,5159,5161],{"id":5160},"typescript-configuration","TypeScript Configuration",[129,5163,5164],{},"evlog ships with full TypeScript type definitions. No additional configuration is required.",[813,5166,5168],{"color":1207,"icon":5167},"i-lucide-check","evlog requires TypeScript 5.0 or higher for optimal type inference.",[133,5170,5172],{"id":5171},"next-steps","Next Steps",[1014,5174,5175],{},[1017,5176,5177,5179],{},[583,5178,20],{"href":21}," - Learn the core concepts and start using evlog",[5181,5182,5183],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":150,"searchDepth":250,"depth":250,"links":5185},[5186,5195,5196,5197,5198,5201,5202],{"id":135,"depth":250,"text":136,"children":5187},[5188,5189,5190,5191,5192,5193,5194],{"id":392,"depth":276,"text":393},{"id":651,"depth":276,"text":652},{"id":828,"depth":276,"text":829},{"id":1048,"depth":276,"text":586},{"id":1616,"depth":276,"text":1617},{"id":2193,"depth":276,"text":2194},{"id":2594,"depth":276,"text":629},{"id":3441,"depth":250,"text":3442},{"id":3548,"depth":250,"text":3549},{"id":3930,"depth":250,"text":3931},{"id":4446,"depth":250,"text":4447,"children":5199},[5200],{"id":4769,"depth":276,"text":4770},{"id":5160,"depth":250,"text":5161},{"id":5171,"depth":250,"text":5172},"Install evlog in your Nuxt, Nitro, Cloudflare Workers, or standalone TypeScript project. Configure sampling, log draining, and client transport.","md",[5206],{"label":20,"icon":23,"to":21,"color":3918,"variant":5207},"subtle",{},{"title":15,"icon":18},{"title":124,"description":5203},"RqM2pDm8bKGoXd4-5pOboe5AxWseb0JGuLXUb0gkesw",[5213,5215],{"title":10,"path":11,"stem":12,"description":5214,"icon":13,"children":-1},"A TypeScript logging library focused on wide events and structured error handling. Replace scattered logs with one comprehensive event per request.",{"title":20,"path":21,"stem":22,"description":5216,"icon":23,"children":-1},"Get up and running with evlog in minutes. Learn useLogger, createError, parseError, and the log API for wide events and structured errors.",1771086836708]