[{"data":1,"prerenderedAt":3504},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-installation":75,"-getting-started-installation-surround":3499},[4,30,50],{"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],{"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,"children":54,"page":29},"Adapters","/adapters","3.adapters",[55,60,65,70],{"title":56,"path":57,"stem":58,"icon":59},"Overview","/adapters/overview","3.adapters/1.overview","i-custom-plug",{"title":61,"path":62,"stem":63,"icon":64},"Axiom","/adapters/axiom","3.adapters/2.axiom","i-custom-axiom",{"title":66,"path":67,"stem":68,"icon":69},"OTLP","/adapters/otlp","3.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":71,"path":72,"stem":73,"icon":74},"Custom Adapters","/adapters/custom","3.adapters/4.custom","i-lucide-code",{"id":76,"title":77,"body":78,"description":3491,"extension":3492,"links":3493,"meta":3495,"navigation":3496,"path":16,"seo":3497,"stem":17,"__hash__":3498},"docs/1.getting-started/2.installation.md","Install evlog",{"type":79,"value":80,"toc":3476},"minimark",[81,85,90,93,165,172,342,347,581,585,594,744,758,762,765,942,945,966,978,981,984,989,996,1137,1152,1156,1163,1321,1328,1332,1339,1524,1546,1550,1561,1754,1760,1790,1815,1819,1825,2123,2126,2140,2239,2243,2272,2286,2292,2438,2633,2640,2644,2646,2696,2703,2747,2751,2754,3073,3076,3094,3097,3120,3124,3126,3176,3179,3443,3450,3454,3457,3461,3465,3472],[82,83,84],"p",{},"evlog supports multiple environments: Nuxt, Nitro, Cloudflare Workers, and standalone TypeScript.",[86,87,89],"h2",{"id":88},"nuxt","Nuxt",[82,91,92],{},"Install evlog via your preferred package manager:",[94,95,96,122,137,151],"code-group",{},[97,98,104],"pre",{"className":99,"code":100,"filename":101,"language":102,"meta":103,"style":103},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog\n","pnpm","bash","",[105,106,107],"code",{"__ignoreMap":103},[108,109,112,115,119],"span",{"class":110,"line":111},"line",1,[108,113,101],{"class":114},"sBMFI",[108,116,118],{"class":117},"sfazB"," add",[108,120,121],{"class":117}," evlog\n",[97,123,126],{"className":99,"code":124,"filename":125,"language":102,"meta":103,"style":103},"npm install evlog\n","npm",[105,127,128],{"__ignoreMap":103},[108,129,130,132,135],{"class":110,"line":111},[108,131,125],{"class":114},[108,133,134],{"class":117}," install",[108,136,121],{"class":117},[97,138,141],{"className":99,"code":139,"filename":140,"language":102,"meta":103,"style":103},"yarn add evlog\n","yarn",[105,142,143],{"__ignoreMap":103},[108,144,145,147,149],{"class":110,"line":111},[108,146,140],{"class":114},[108,148,118],{"class":117},[108,150,121],{"class":117},[97,152,155],{"className":99,"code":153,"filename":154,"language":102,"meta":103,"style":103},"bun add evlog\n","bun",[105,156,157],{"__ignoreMap":103},[108,158,159,161,163],{"class":110,"line":111},[108,160,154],{"class":114},[108,162,118],{"class":117},[108,164,121],{"class":117},[82,166,167,168,171],{},"Then add it to your Nuxt config using the ",[105,169,170],{},"evlog/nuxt"," module:",[97,173,178],{"className":174,"code":175,"filename":176,"language":177,"meta":103,"style":103},"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",[105,179,180,201,227,238,248,266,272,279,300,306,327,333],{"__ignoreMap":103},[108,181,182,186,189,193,197],{"class":110,"line":111},[108,183,185],{"class":184},"s7zQu","export",[108,187,188],{"class":184}," default",[108,190,192],{"class":191},"s2Zo4"," defineNuxtConfig",[108,194,196],{"class":195},"sTEyZ","(",[108,198,200],{"class":199},"sMK4o","{\n",[108,202,204,208,211,214,217,219,221,224],{"class":110,"line":203},2,[108,205,207],{"class":206},"swJcz","  modules",[108,209,210],{"class":199},":",[108,212,213],{"class":195}," [",[108,215,216],{"class":199},"'",[108,218,170],{"class":117},[108,220,216],{"class":199},[108,222,223],{"class":195},"]",[108,225,226],{"class":199},",\n",[108,228,230,233,235],{"class":110,"line":229},3,[108,231,232],{"class":206},"  evlog",[108,234,210],{"class":199},[108,236,237],{"class":199}," {\n",[108,239,241,244,246],{"class":110,"line":240},4,[108,242,243],{"class":206},"    env",[108,245,210],{"class":199},[108,247,237],{"class":199},[108,249,251,254,256,259,262,264],{"class":110,"line":250},5,[108,252,253],{"class":206},"      service",[108,255,210],{"class":199},[108,257,258],{"class":199}," '",[108,260,261],{"class":117},"my-app",[108,263,216],{"class":199},[108,265,226],{"class":199},[108,267,269],{"class":110,"line":268},6,[108,270,271],{"class":199},"    },\n",[108,273,275],{"class":110,"line":274},7,[108,276,278],{"class":277},"sHwdD","    // Optional: only log specific routes (supports glob patterns)\n",[108,280,282,285,287,289,291,294,296,298],{"class":110,"line":281},8,[108,283,284],{"class":206},"    include",[108,286,210],{"class":199},[108,288,213],{"class":195},[108,290,216],{"class":199},[108,292,293],{"class":117},"/api/**",[108,295,216],{"class":199},[108,297,223],{"class":195},[108,299,226],{"class":199},[108,301,303],{"class":110,"line":302},9,[108,304,305],{"class":277},"    // Optional: exclude specific routes from logging\n",[108,307,309,312,314,316,318,321,323,325],{"class":110,"line":308},10,[108,310,311],{"class":206},"    exclude",[108,313,210],{"class":199},[108,315,213],{"class":195},[108,317,216],{"class":199},[108,319,320],{"class":117},"/api/_nuxt_icon/**",[108,322,216],{"class":199},[108,324,223],{"class":195},[108,326,226],{"class":199},[108,328,330],{"class":110,"line":329},11,[108,331,332],{"class":199},"  },\n",[108,334,336,339],{"class":110,"line":335},12,[108,337,338],{"class":199},"}",[108,340,341],{"class":195},")\n",[343,344,346],"h3",{"id":345},"configuration-options","Configuration Options",[348,349,350,369],"table",{},[351,352,353],"thead",{},[354,355,356,360,363,366],"tr",{},[357,358,359],"th",{},"Option",[357,361,362],{},"Type",[357,364,365],{},"Default",[357,367,368],{},"Description",[370,371,372,393,410,433,454,473,494,518,539,562],"tbody",{},[354,373,374,380,385,390],{},[375,376,377],"td",{},[105,378,379],{},"env.service",[375,381,382],{},[105,383,384],{},"string",[375,386,387],{},[105,388,389],{},"'app'",[375,391,392],{},"Service name shown in logs",[354,394,395,400,404,407],{},[375,396,397],{},[105,398,399],{},"env.environment",[375,401,402],{},[105,403,384],{},[375,405,406],{},"Auto-detected",[375,408,409],{},"Environment name",[354,411,412,417,422,427],{},[375,413,414],{},[105,415,416],{},"include",[375,418,419],{},[105,420,421],{},"string[]",[375,423,424],{},[105,425,426],{},"undefined",[375,428,429,430,432],{},"Route patterns to log. Supports glob (",[105,431,293],{},"). If not set, all routes are logged",[354,434,435,440,444,448],{},[375,436,437],{},[105,438,439],{},"exclude",[375,441,442],{},[105,443,421],{},[375,445,446],{},[105,447,426],{},[375,449,450,451,453],{},"Route patterns to exclude from logging. Supports glob (",[105,452,320],{},"). Exclusions take precedence over inclusions",[354,455,456,461,466,470],{},[375,457,458],{},[105,459,460],{},"routes",[375,462,463],{},[105,464,465],{},"Record\u003Cstring, RouteConfig>",[375,467,468],{},[105,469,426],{},[375,471,472],{},"Route-specific service configuration. Allows setting different service names for different routes using glob patterns",[354,474,475,480,485,491],{},[375,476,477],{},[105,478,479],{},"pretty",[375,481,482],{},[105,483,484],{},"boolean",[375,486,487,490],{},[105,488,489],{},"true"," in dev",[375,492,493],{},"Pretty print with tree formatting",[354,495,496,501,506,510],{},[375,497,498],{},[105,499,500],{},"sampling.rates",[375,502,503],{},[105,504,505],{},"object",[375,507,508],{},[105,509,426],{},[375,511,512,513],{},"Head sampling rates per log level (0-100%). See ",[514,515,517],"a",{"href":516},"#sampling","Sampling",[354,519,520,525,530,534],{},[375,521,522],{},[105,523,524],{},"sampling.keep",[375,526,527],{},[105,528,529],{},"array",[375,531,532],{},[105,533,426],{},[375,535,536,537],{},"Tail sampling conditions to force-keep logs. See ",[514,538,517],{"href":516},[354,540,541,546,550,555],{},[375,542,543],{},[105,544,545],{},"transport.enabled",[375,547,548],{},[105,549,484],{},[375,551,552],{},[105,553,554],{},"false",[375,556,557,558],{},"Enable sending client logs to the server. See ",[514,559,561],{"href":560},"#client-transport","Client Transport",[354,563,564,569,573,578],{},[375,565,566],{},[105,567,568],{},"transport.endpoint",[375,570,571],{},[105,572,384],{},[375,574,575],{},[105,576,577],{},"'/api/_evlog/ingest'",[375,579,580],{},"API endpoint for client log ingestion",[343,582,584],{"id":583},"route-filtering","Route Filtering",[82,586,587,588,590,591,593],{},"Use ",[105,589,416],{}," and ",[105,592,439],{}," to control which routes are logged. Both support glob patterns.",[97,595,597],{"className":174,"code":596,"filename":176,"language":177,"meta":103,"style":103},"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",[105,598,599,611,629,637,642,670,675,684,698,712,726,733,737],{"__ignoreMap":103},[108,600,601,603,605,607,609],{"class":110,"line":111},[108,602,185],{"class":184},[108,604,188],{"class":184},[108,606,192],{"class":191},[108,608,196],{"class":195},[108,610,200],{"class":199},[108,612,613,615,617,619,621,623,625,627],{"class":110,"line":203},[108,614,207],{"class":206},[108,616,210],{"class":199},[108,618,213],{"class":195},[108,620,216],{"class":199},[108,622,170],{"class":117},[108,624,216],{"class":199},[108,626,223],{"class":195},[108,628,226],{"class":199},[108,630,631,633,635],{"class":110,"line":229},[108,632,232],{"class":206},[108,634,210],{"class":199},[108,636,237],{"class":199},[108,638,639],{"class":110,"line":240},[108,640,641],{"class":277},"    // Log all API and auth routes...\n",[108,643,644,646,648,650,652,654,656,659,661,664,666,668],{"class":110,"line":250},[108,645,284],{"class":206},[108,647,210],{"class":199},[108,649,213],{"class":195},[108,651,216],{"class":199},[108,653,293],{"class":117},[108,655,216],{"class":199},[108,657,658],{"class":199},",",[108,660,258],{"class":199},[108,662,663],{"class":117},"/auth/**",[108,665,216],{"class":199},[108,667,223],{"class":195},[108,669,226],{"class":199},[108,671,672],{"class":110,"line":268},[108,673,674],{"class":277},"    // ...except internal/noisy routes\n",[108,676,677,679,681],{"class":110,"line":274},[108,678,311],{"class":206},[108,680,210],{"class":199},[108,682,683],{"class":195}," [\n",[108,685,686,689,691,693,695],{"class":110,"line":281},[108,687,688],{"class":199},"      '",[108,690,320],{"class":117},[108,692,216],{"class":199},[108,694,658],{"class":199},[108,696,697],{"class":277},"  // Nuxt Icon requests\n",[108,699,700,702,705,707,709],{"class":110,"line":302},[108,701,688],{"class":199},[108,703,704],{"class":117},"/api/_content/**",[108,706,216],{"class":199},[108,708,658],{"class":199},[108,710,711],{"class":277},"    // Nuxt Content queries\n",[108,713,714,716,719,721,723],{"class":110,"line":308},[108,715,688],{"class":199},[108,717,718],{"class":117},"/api/health",[108,720,216],{"class":199},[108,722,658],{"class":199},[108,724,725],{"class":277},"         // Health checks\n",[108,727,728,731],{"class":110,"line":329},[108,729,730],{"class":195},"    ]",[108,732,226],{"class":199},[108,734,735],{"class":110,"line":335},[108,736,332],{"class":199},[108,738,740,742],{"class":110,"line":739},13,[108,741,338],{"class":199},[108,743,341],{"class":195},[745,746,748,752,753,590,755,757],"callout",{"color":747,"icon":13},"info",[749,750,751],"strong",{},"Exclusions take precedence."," If a path matches both ",[105,754,416],{},[105,756,439],{},", it will be excluded.",[343,759,761],{"id":760},"route-based-service-configuration","Route-Based Service Configuration",[82,763,764],{},"In multi-service architectures, configure different service names for different routes:",[97,766,768],{"className":174,"code":767,"filename":176,"language":177,"meta":103,"style":103},"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",[105,769,770,782,800,808,816,834,838,847,876,902,928,932,936],{"__ignoreMap":103},[108,771,772,774,776,778,780],{"class":110,"line":111},[108,773,185],{"class":184},[108,775,188],{"class":184},[108,777,192],{"class":191},[108,779,196],{"class":195},[108,781,200],{"class":199},[108,783,784,786,788,790,792,794,796,798],{"class":110,"line":203},[108,785,207],{"class":206},[108,787,210],{"class":199},[108,789,213],{"class":195},[108,791,216],{"class":199},[108,793,170],{"class":117},[108,795,216],{"class":199},[108,797,223],{"class":195},[108,799,226],{"class":199},[108,801,802,804,806],{"class":110,"line":229},[108,803,232],{"class":206},[108,805,210],{"class":199},[108,807,237],{"class":199},[108,809,810,812,814],{"class":110,"line":240},[108,811,243],{"class":206},[108,813,210],{"class":199},[108,815,237],{"class":199},[108,817,818,820,822,824,827,829,831],{"class":110,"line":250},[108,819,253],{"class":206},[108,821,210],{"class":199},[108,823,258],{"class":199},[108,825,826],{"class":117},"default-service",[108,828,216],{"class":199},[108,830,658],{"class":199},[108,832,833],{"class":277}," // Fallback for unmatched routes\n",[108,835,836],{"class":110,"line":268},[108,837,271],{"class":199},[108,839,840,843,845],{"class":110,"line":274},[108,841,842],{"class":206},"    routes",[108,844,210],{"class":199},[108,846,237],{"class":199},[108,848,849,851,854,856,858,861,864,866,868,871,873],{"class":110,"line":281},[108,850,688],{"class":199},[108,852,853],{"class":206},"/api/auth/**",[108,855,216],{"class":199},[108,857,210],{"class":199},[108,859,860],{"class":199}," {",[108,862,863],{"class":206}," service",[108,865,210],{"class":199},[108,867,258],{"class":199},[108,869,870],{"class":117},"auth-service",[108,872,216],{"class":199},[108,874,875],{"class":199}," },\n",[108,877,878,880,883,885,887,889,891,893,895,898,900],{"class":110,"line":302},[108,879,688],{"class":199},[108,881,882],{"class":206},"/api/payment/**",[108,884,216],{"class":199},[108,886,210],{"class":199},[108,888,860],{"class":199},[108,890,863],{"class":206},[108,892,210],{"class":199},[108,894,258],{"class":199},[108,896,897],{"class":117},"payment-service",[108,899,216],{"class":199},[108,901,875],{"class":199},[108,903,904,906,909,911,913,915,917,919,921,924,926],{"class":110,"line":308},[108,905,688],{"class":199},[108,907,908],{"class":206},"/api/booking/**",[108,910,216],{"class":199},[108,912,210],{"class":199},[108,914,860],{"class":199},[108,916,863],{"class":206},[108,918,210],{"class":199},[108,920,258],{"class":199},[108,922,923],{"class":117},"booking-service",[108,925,216],{"class":199},[108,927,875],{"class":199},[108,929,930],{"class":110,"line":329},[108,931,271],{"class":199},[108,933,934],{"class":110,"line":335},[108,935,332],{"class":199},[108,937,938,940],{"class":110,"line":739},[108,939,338],{"class":199},[108,941,341],{"class":195},[82,943,944],{},"All logs from matching routes will automatically include the configured service name. This is especially useful when:",[946,947,948,952,955],"ul",{},[949,950,951],"li",{},"Running multiple microservices behind a single Nuxt server",[949,953,954],{},"Organizing logs by business domain (auth, payment, inventory)",[949,956,957,958,961,962,965],{},"Differentiating between API versions (",[105,959,960],{},"/api/v1/**",", ",[105,963,964],{},"/api/v2/**",")",[82,967,968,969,972,973,977],{},"You can also override the service name per handler using ",[105,970,971],{},"useLogger(event, 'service-name')",". See ",[514,974,976],{"href":975},"/getting-started/quick-start#service-identification","Quick Start - Service Identification"," for details.",[343,979,517],{"id":980},"sampling",[82,982,983],{},"At scale, logging everything can become expensive. evlog supports two sampling strategies:",[985,986,988],"h4",{"id":987},"head-sampling-rates","Head Sampling (rates)",[82,990,991,992,995],{},"Random sampling based on log level, decided ",[749,993,994],{},"before"," the request completes:",[97,997,999],{"className":174,"code":998,"filename":176,"language":177,"meta":103,"style":103},"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",[105,1000,1001,1013,1031,1039,1048,1057,1073,1088,1103,1118,1123,1127,1131],{"__ignoreMap":103},[108,1002,1003,1005,1007,1009,1011],{"class":110,"line":111},[108,1004,185],{"class":184},[108,1006,188],{"class":184},[108,1008,192],{"class":191},[108,1010,196],{"class":195},[108,1012,200],{"class":199},[108,1014,1015,1017,1019,1021,1023,1025,1027,1029],{"class":110,"line":203},[108,1016,207],{"class":206},[108,1018,210],{"class":199},[108,1020,213],{"class":195},[108,1022,216],{"class":199},[108,1024,170],{"class":117},[108,1026,216],{"class":199},[108,1028,223],{"class":195},[108,1030,226],{"class":199},[108,1032,1033,1035,1037],{"class":110,"line":229},[108,1034,232],{"class":206},[108,1036,210],{"class":199},[108,1038,237],{"class":199},[108,1040,1041,1044,1046],{"class":110,"line":240},[108,1042,1043],{"class":206},"    sampling",[108,1045,210],{"class":199},[108,1047,237],{"class":199},[108,1049,1050,1053,1055],{"class":110,"line":250},[108,1051,1052],{"class":206},"      rates",[108,1054,210],{"class":199},[108,1056,237],{"class":199},[108,1058,1059,1062,1064,1068,1070],{"class":110,"line":268},[108,1060,1061],{"class":206},"        info",[108,1063,210],{"class":199},[108,1065,1067],{"class":1066},"sbssI"," 10",[108,1069,658],{"class":199},[108,1071,1072],{"class":277},"    // Keep 10% of info logs\n",[108,1074,1075,1078,1080,1083,1085],{"class":110,"line":274},[108,1076,1077],{"class":206},"        warn",[108,1079,210],{"class":199},[108,1081,1082],{"class":1066}," 50",[108,1084,658],{"class":199},[108,1086,1087],{"class":277},"    // Keep 50% of warning logs\n",[108,1089,1090,1093,1095,1098,1100],{"class":110,"line":281},[108,1091,1092],{"class":206},"        debug",[108,1094,210],{"class":199},[108,1096,1097],{"class":1066}," 5",[108,1099,658],{"class":199},[108,1101,1102],{"class":277},"    // Keep 5% of debug logs\n",[108,1104,1105,1108,1110,1113,1115],{"class":110,"line":302},[108,1106,1107],{"class":206},"        error",[108,1109,210],{"class":199},[108,1111,1112],{"class":1066}," 100",[108,1114,658],{"class":199},[108,1116,1117],{"class":277},"  // Always keep errors (default)\n",[108,1119,1120],{"class":110,"line":308},[108,1121,1122],{"class":199},"      },\n",[108,1124,1125],{"class":110,"line":329},[108,1126,271],{"class":199},[108,1128,1129],{"class":110,"line":335},[108,1130,332],{"class":199},[108,1132,1133,1135],{"class":110,"line":739},[108,1134,338],{"class":199},[108,1136,341],{"class":195},[745,1138,1140,1143,1144,1147,1148,1151],{"color":1139,"icon":49},"success",[749,1141,1142],{},"Errors are always logged by default."," Even if you don't specify ",[105,1145,1146],{},"error: 100",", error logs are never sampled out unless you explicitly set ",[105,1149,1150],{},"error: 0",".",[985,1153,1155],{"id":1154},"tail-sampling-keep","Tail Sampling (keep)",[82,1157,1158,1159,1162],{},"Force-keep logs based on request outcome, evaluated ",[749,1160,1161],{},"after"," the request completes. Useful to always capture slow requests or critical paths even when head sampling would drop them:",[97,1164,1166],{"className":174,"code":1165,"filename":176,"language":177,"meta":103,"style":103},"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",[105,1167,1168,1180,1198,1206,1214,1235,1244,1262,1279,1300,1307,1311,1315],{"__ignoreMap":103},[108,1169,1170,1172,1174,1176,1178],{"class":110,"line":111},[108,1171,185],{"class":184},[108,1173,188],{"class":184},[108,1175,192],{"class":191},[108,1177,196],{"class":195},[108,1179,200],{"class":199},[108,1181,1182,1184,1186,1188,1190,1192,1194,1196],{"class":110,"line":203},[108,1183,207],{"class":206},[108,1185,210],{"class":199},[108,1187,213],{"class":195},[108,1189,216],{"class":199},[108,1191,170],{"class":117},[108,1193,216],{"class":199},[108,1195,223],{"class":195},[108,1197,226],{"class":199},[108,1199,1200,1202,1204],{"class":110,"line":229},[108,1201,232],{"class":206},[108,1203,210],{"class":199},[108,1205,237],{"class":199},[108,1207,1208,1210,1212],{"class":110,"line":240},[108,1209,1043],{"class":206},[108,1211,210],{"class":199},[108,1213,237],{"class":199},[108,1215,1216,1218,1220,1222,1225,1227,1229,1232],{"class":110,"line":250},[108,1217,1052],{"class":206},[108,1219,210],{"class":199},[108,1221,860],{"class":199},[108,1223,1224],{"class":206}," info",[108,1226,210],{"class":199},[108,1228,1067],{"class":1066},[108,1230,1231],{"class":199}," },",[108,1233,1234],{"class":277},"  // Only 10% of info logs\n",[108,1236,1237,1240,1242],{"class":110,"line":268},[108,1238,1239],{"class":206},"      keep",[108,1241,210],{"class":199},[108,1243,683],{"class":195},[108,1245,1246,1249,1252,1254,1257,1259],{"class":110,"line":274},[108,1247,1248],{"class":199},"        {",[108,1250,1251],{"class":206}," duration",[108,1253,210],{"class":199},[108,1255,1256],{"class":1066}," 1000",[108,1258,1231],{"class":199},[108,1260,1261],{"class":277},"           // Always keep if duration >= 1000ms\n",[108,1263,1264,1266,1269,1271,1274,1276],{"class":110,"line":281},[108,1265,1248],{"class":199},[108,1267,1268],{"class":206}," status",[108,1270,210],{"class":199},[108,1272,1273],{"class":1066}," 400",[108,1275,1231],{"class":199},[108,1277,1278],{"class":277},"              // Always keep if status >= 400\n",[108,1280,1281,1283,1286,1288,1290,1293,1295,1297],{"class":110,"line":302},[108,1282,1248],{"class":199},[108,1284,1285],{"class":206}," path",[108,1287,210],{"class":199},[108,1289,258],{"class":199},[108,1291,1292],{"class":117},"/api/critical/**",[108,1294,216],{"class":199},[108,1296,1231],{"class":199},[108,1298,1299],{"class":277}," // Always keep critical paths\n",[108,1301,1302,1305],{"class":110,"line":308},[108,1303,1304],{"class":195},"      ]",[108,1306,226],{"class":199},[108,1308,1309],{"class":110,"line":329},[108,1310,271],{"class":199},[108,1312,1313],{"class":110,"line":335},[108,1314,332],{"class":199},[108,1316,1317,1319],{"class":110,"line":739},[108,1318,338],{"class":199},[108,1320,341],{"class":195},[82,1322,1323,1324,1327],{},"Conditions use ",[105,1325,1326],{},">="," comparison and follow OR logic (any match = keep).",[985,1329,1331],{"id":1330},"custom-tail-sampling-hook","Custom Tail Sampling Hook",[82,1333,1334,1335,1338],{},"For business-specific conditions (premium users, feature flags, etc.), use the ",[105,1336,1337],{},"evlog:emit:keep"," Nitro hook:",[97,1340,1343],{"className":174,"code":1341,"filename":1342,"language":177,"meta":103,"style":103},"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",[105,1344,1345,1370,1407,1412,1459,1465,1470,1490,1506,1511,1518],{"__ignoreMap":103},[108,1346,1347,1349,1351,1354,1356,1358,1362,1364,1368],{"class":110,"line":111},[108,1348,185],{"class":184},[108,1350,188],{"class":184},[108,1352,1353],{"class":191}," defineNitroPlugin",[108,1355,196],{"class":195},[108,1357,196],{"class":199},[108,1359,1361],{"class":1360},"sHdIc","nitroApp",[108,1363,965],{"class":199},[108,1365,1367],{"class":1366},"spNyl"," =>",[108,1369,237],{"class":199},[108,1371,1372,1375,1377,1380,1382,1385,1387,1389,1391,1393,1395,1398,1401,1403,1405],{"class":110,"line":203},[108,1373,1374],{"class":195},"  nitroApp",[108,1376,1151],{"class":199},[108,1378,1379],{"class":195},"hooks",[108,1381,1151],{"class":199},[108,1383,1384],{"class":191},"hook",[108,1386,196],{"class":206},[108,1388,216],{"class":199},[108,1390,1337],{"class":117},[108,1392,216],{"class":199},[108,1394,658],{"class":199},[108,1396,1397],{"class":199}," (",[108,1399,1400],{"class":1360},"ctx",[108,1402,965],{"class":199},[108,1404,1367],{"class":1366},[108,1406,237],{"class":199},[108,1408,1409],{"class":110,"line":229},[108,1410,1411],{"class":277},"    // Access user from accumulated context\n",[108,1413,1414,1417,1420,1423,1426,1428,1431,1433,1436,1439,1441,1444,1447,1450,1453,1456],{"class":110,"line":240},[108,1415,1416],{"class":1366},"    const",[108,1418,1419],{"class":195}," user",[108,1421,1422],{"class":199}," =",[108,1424,1425],{"class":195}," ctx",[108,1427,1151],{"class":199},[108,1429,1430],{"class":195},"context",[108,1432,1151],{"class":199},[108,1434,1435],{"class":195},"user",[108,1437,1438],{"class":184}," as",[108,1440,860],{"class":199},[108,1442,1443],{"class":206}," premium",[108,1445,1446],{"class":199},"?:",[108,1448,1449],{"class":114}," boolean",[108,1451,1452],{"class":199}," }",[108,1454,1455],{"class":199}," |",[108,1457,1458],{"class":114}," undefined\n",[108,1460,1461],{"class":110,"line":250},[108,1462,1464],{"emptyLinePlaceholder":1463},true,"\n",[108,1466,1467],{"class":110,"line":268},[108,1468,1469],{"class":277},"    // Force-keep logs for premium users regardless of sampling rate\n",[108,1471,1472,1475,1477,1479,1482,1485,1488],{"class":110,"line":274},[108,1473,1474],{"class":184},"    if",[108,1476,1397],{"class":206},[108,1478,1435],{"class":195},[108,1480,1481],{"class":199},"?.",[108,1483,1484],{"class":195},"premium",[108,1486,1487],{"class":206},") ",[108,1489,200],{"class":199},[108,1491,1492,1495,1497,1500,1502],{"class":110,"line":281},[108,1493,1494],{"class":195},"      ctx",[108,1496,1151],{"class":199},[108,1498,1499],{"class":195},"shouldKeep",[108,1501,1422],{"class":199},[108,1503,1505],{"class":1504},"sfNiH"," true\n",[108,1507,1508],{"class":110,"line":302},[108,1509,1510],{"class":199},"    }\n",[108,1512,1513,1516],{"class":110,"line":308},[108,1514,1515],{"class":199},"  }",[108,1517,341],{"class":206},[108,1519,1520,1522],{"class":110,"line":329},[108,1521,338],{"class":199},[108,1523,341],{"class":195},[82,1525,1526,1527,1530,1531,961,1534,961,1537,961,1540,1543,1544,1151],{},"The hook receives a ",[105,1528,1529],{},"TailSamplingContext"," with ",[105,1532,1533],{},"status",[105,1535,1536],{},"duration",[105,1538,1539],{},"path",[105,1541,1542],{},"method",", and the full accumulated ",[105,1545,1430],{},[343,1547,1549],{"id":1548},"log-draining","Log Draining",[82,1551,1552,1553,1556,1557,1560],{},"Send logs to external services like Axiom, Loki, or custom endpoints using the ",[105,1554,1555],{},"evlog:drain"," hook. The hook is called in ",[749,1558,1559],{},"fire-and-forget"," mode, meaning it never blocks the HTTP response.",[97,1562,1565],{"className":174,"code":1563,"filename":1564,"language":177,"meta":103,"style":103},"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",[105,1566,1567,1587,1622,1627,1648,1664,1705,1735,1742,1748],{"__ignoreMap":103},[108,1568,1569,1571,1573,1575,1577,1579,1581,1583,1585],{"class":110,"line":111},[108,1570,185],{"class":184},[108,1572,188],{"class":184},[108,1574,1353],{"class":191},[108,1576,196],{"class":195},[108,1578,196],{"class":199},[108,1580,1361],{"class":1360},[108,1582,965],{"class":199},[108,1584,1367],{"class":1366},[108,1586,237],{"class":199},[108,1588,1589,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1612,1614,1616,1618,1620],{"class":110,"line":203},[108,1590,1374],{"class":195},[108,1592,1151],{"class":199},[108,1594,1379],{"class":195},[108,1596,1151],{"class":199},[108,1598,1384],{"class":191},[108,1600,196],{"class":206},[108,1602,216],{"class":199},[108,1604,1555],{"class":117},[108,1606,216],{"class":199},[108,1608,658],{"class":199},[108,1610,1611],{"class":1366}," async",[108,1613,1397],{"class":199},[108,1615,1400],{"class":1360},[108,1617,965],{"class":199},[108,1619,1367],{"class":1366},[108,1621,237],{"class":199},[108,1623,1624],{"class":110,"line":229},[108,1625,1626],{"class":277},"    // Send wide event to Axiom (fire-and-forget, never blocks response)\n",[108,1628,1629,1632,1635,1637,1639,1642,1644,1646],{"class":110,"line":240},[108,1630,1631],{"class":184},"    await",[108,1633,1634],{"class":191}," fetch",[108,1636,196],{"class":206},[108,1638,216],{"class":199},[108,1640,1641],{"class":117},"https://api.axiom.co/v1/datasets/logs/ingest",[108,1643,216],{"class":199},[108,1645,658],{"class":199},[108,1647,237],{"class":199},[108,1649,1650,1653,1655,1657,1660,1662],{"class":110,"line":250},[108,1651,1652],{"class":206},"      method",[108,1654,210],{"class":199},[108,1656,258],{"class":199},[108,1658,1659],{"class":117},"POST",[108,1661,216],{"class":199},[108,1663,226],{"class":199},[108,1665,1666,1669,1671,1673,1676,1678,1681,1684,1687,1690,1692,1695,1697,1700,1703],{"class":110,"line":268},[108,1667,1668],{"class":206},"      headers",[108,1670,210],{"class":199},[108,1672,860],{"class":199},[108,1674,1675],{"class":206}," Authorization",[108,1677,210],{"class":199},[108,1679,1680],{"class":199}," `",[108,1682,1683],{"class":117},"Bearer ",[108,1685,1686],{"class":199},"${",[108,1688,1689],{"class":195},"process",[108,1691,1151],{"class":199},[108,1693,1694],{"class":195},"env",[108,1696,1151],{"class":199},[108,1698,1699],{"class":195},"AXIOM_TOKEN",[108,1701,1702],{"class":199},"}`",[108,1704,875],{"class":199},[108,1706,1707,1710,1712,1715,1717,1720,1723,1725,1727,1730,1733],{"class":110,"line":274},[108,1708,1709],{"class":206},"      body",[108,1711,210],{"class":199},[108,1713,1714],{"class":195}," JSON",[108,1716,1151],{"class":199},[108,1718,1719],{"class":191},"stringify",[108,1721,1722],{"class":206},"([",[108,1724,1400],{"class":195},[108,1726,1151],{"class":199},[108,1728,1729],{"class":195},"event",[108,1731,1732],{"class":206},"])",[108,1734,226],{"class":199},[108,1736,1737,1740],{"class":110,"line":281},[108,1738,1739],{"class":199},"    }",[108,1741,341],{"class":206},[108,1743,1744,1746],{"class":110,"line":302},[108,1745,1515],{"class":199},[108,1747,341],{"class":206},[108,1749,1750,1752],{"class":110,"line":308},[108,1751,338],{"class":199},[108,1753,341],{"class":195},[82,1755,1526,1756,1759],{},[105,1757,1758],{},"DrainContext"," with:",[946,1761,1762,1771,1784],{},[949,1763,1764,1766,1767,1770],{},[105,1765,1729],{},": The complete ",[105,1768,1769],{},"WideEvent"," (timestamp, level, service, and all accumulated context)",[949,1772,1773,1776,1777,961,1779,961,1781,965],{},[105,1774,1775],{},"request",": Optional request metadata (",[105,1778,1542],{},[105,1780,1539],{},[105,1782,1783],{},"requestId",[949,1785,1786,1789],{},[105,1787,1788],{},"headers",": HTTP headers from the original request (useful for correlation with external services)",[745,1791,1792,1795,1796,961,1799,961,1802,961,1805,961,1808,961,1811,1814],{"color":1139,"icon":49},[749,1793,1794],{},"Security:"," Sensitive headers (",[105,1797,1798],{},"authorization",[105,1800,1801],{},"cookie",[105,1803,1804],{},"set-cookie",[105,1806,1807],{},"x-api-key",[105,1809,1810],{},"x-auth-token",[105,1812,1813],{},"proxy-authorization",") are automatically filtered out and never passed to the drain hook.",[985,1816,1818],{"id":1817},"using-headers-for-external-service-correlation","Using Headers for External Service Correlation",[82,1820,1821,1822,1824],{},"The ",[105,1823,1788],{}," field allows you to correlate logs with external services like PostHog, Sentry, or custom analytics:",[97,1826,1829],{"className":174,"code":1827,"filename":1828,"language":177,"meta":103,"style":103},"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",[105,1830,1831,1851,1867,1871,1903,1920,1924,1929,1934,1964,1992,1996,2011,2015,2021,2036,2044,2061,2071,2085,2097,2102,2109,2116],{"__ignoreMap":103},[108,1832,1833,1835,1837,1839,1841,1843,1845,1847,1849],{"class":110,"line":111},[108,1834,185],{"class":184},[108,1836,188],{"class":184},[108,1838,1353],{"class":191},[108,1840,196],{"class":195},[108,1842,196],{"class":199},[108,1844,1361],{"class":1360},[108,1846,965],{"class":199},[108,1848,1367],{"class":1366},[108,1850,237],{"class":199},[108,1852,1853,1856,1859,1861,1864],{"class":110,"line":203},[108,1854,1855],{"class":1366},"  const",[108,1857,1858],{"class":195}," posthog",[108,1860,1422],{"class":199},[108,1862,1863],{"class":191}," usePostHog",[108,1865,1866],{"class":206},"()\n",[108,1868,1869],{"class":110,"line":229},[108,1870,1464],{"emptyLinePlaceholder":1463},[108,1872,1873,1875,1877,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1901],{"class":110,"line":240},[108,1874,1374],{"class":195},[108,1876,1151],{"class":199},[108,1878,1379],{"class":195},[108,1880,1151],{"class":199},[108,1882,1384],{"class":191},[108,1884,196],{"class":206},[108,1886,216],{"class":199},[108,1888,1555],{"class":117},[108,1890,216],{"class":199},[108,1892,658],{"class":199},[108,1894,1397],{"class":199},[108,1896,1400],{"class":1360},[108,1898,965],{"class":199},[108,1900,1367],{"class":1366},[108,1902,237],{"class":199},[108,1904,1905,1907,1909,1912,1915,1917],{"class":110,"line":250},[108,1906,1474],{"class":184},[108,1908,1397],{"class":206},[108,1910,1911],{"class":199},"!",[108,1913,1914],{"class":195},"posthog",[108,1916,1487],{"class":206},[108,1918,1919],{"class":184},"return\n",[108,1921,1922],{"class":110,"line":268},[108,1923,1464],{"emptyLinePlaceholder":1463},[108,1925,1926],{"class":110,"line":274},[108,1927,1928],{"class":277},"    // Extract correlation headers sent from the client\n",[108,1930,1931],{"class":110,"line":281},[108,1932,1933],{"class":277},"    // These headers are safe (sensitive headers like Authorization are filtered)\n",[108,1935,1936,1938,1941,1943,1945,1947,1949,1951,1954,1956,1959,1961],{"class":110,"line":302},[108,1937,1416],{"class":1366},[108,1939,1940],{"class":195}," sessionId",[108,1942,1422],{"class":199},[108,1944,1425],{"class":195},[108,1946,1151],{"class":199},[108,1948,1788],{"class":195},[108,1950,1481],{"class":199},[108,1952,1953],{"class":206},"[",[108,1955,216],{"class":199},[108,1957,1958],{"class":117},"x-posthog-session-id",[108,1960,216],{"class":199},[108,1962,1963],{"class":206},"]\n",[108,1965,1966,1968,1971,1973,1975,1977,1979,1981,1983,1985,1988,1990],{"class":110,"line":308},[108,1967,1416],{"class":1366},[108,1969,1970],{"class":195}," distinctId",[108,1972,1422],{"class":199},[108,1974,1425],{"class":195},[108,1976,1151],{"class":199},[108,1978,1788],{"class":195},[108,1980,1481],{"class":199},[108,1982,1953],{"class":206},[108,1984,216],{"class":199},[108,1986,1987],{"class":117},"x-posthog-distinct-id",[108,1989,216],{"class":199},[108,1991,1963],{"class":206},[108,1993,1994],{"class":110,"line":329},[108,1995,1464],{"emptyLinePlaceholder":1463},[108,1997,1998,2000,2002,2004,2007,2009],{"class":110,"line":335},[108,1999,1474],{"class":184},[108,2001,1397],{"class":206},[108,2003,1911],{"class":199},[108,2005,2006],{"class":195},"distinctId",[108,2008,1487],{"class":206},[108,2010,1919],{"class":184},[108,2012,2013],{"class":110,"line":739},[108,2014,1464],{"emptyLinePlaceholder":1463},[108,2016,2018],{"class":110,"line":2017},14,[108,2019,2020],{"class":277},"    // Correlate server logs with client sessions in PostHog\n",[108,2022,2024,2027,2029,2032,2034],{"class":110,"line":2023},15,[108,2025,2026],{"class":195},"    posthog",[108,2028,1151],{"class":199},[108,2030,2031],{"class":191},"capture",[108,2033,196],{"class":206},[108,2035,200],{"class":199},[108,2037,2039,2042],{"class":110,"line":2038},16,[108,2040,2041],{"class":195},"      distinctId",[108,2043,226],{"class":199},[108,2045,2047,2050,2052,2054,2057,2059],{"class":110,"line":2046},17,[108,2048,2049],{"class":206},"      event",[108,2051,210],{"class":199},[108,2053,258],{"class":199},[108,2055,2056],{"class":117},"server_log",[108,2058,216],{"class":199},[108,2060,226],{"class":199},[108,2062,2064,2067,2069],{"class":110,"line":2063},18,[108,2065,2066],{"class":206},"      properties",[108,2068,210],{"class":199},[108,2070,237],{"class":199},[108,2072,2074,2077,2079,2081,2083],{"class":110,"line":2073},19,[108,2075,2076],{"class":199},"        ...",[108,2078,1400],{"class":195},[108,2080,1151],{"class":199},[108,2082,1729],{"class":195},[108,2084,226],{"class":199},[108,2086,2088,2091,2093,2095],{"class":110,"line":2087},20,[108,2089,2090],{"class":206},"        $session_id",[108,2092,210],{"class":199},[108,2094,1940],{"class":195},[108,2096,226],{"class":199},[108,2098,2100],{"class":110,"line":2099},21,[108,2101,1122],{"class":199},[108,2103,2105,2107],{"class":110,"line":2104},22,[108,2106,1739],{"class":199},[108,2108,341],{"class":206},[108,2110,2112,2114],{"class":110,"line":2111},23,[108,2113,1515],{"class":199},[108,2115,341],{"class":206},[108,2117,2119,2121],{"class":110,"line":2118},24,[108,2120,338],{"class":199},[108,2122,341],{"class":195},[343,2124,561],{"id":2125},"client-transport",[82,2127,2128,2129,961,2132,2135,2136,2139],{},"Send browser logs to your server for centralized logging. When enabled, client-side ",[105,2130,2131],{},"log.info()",[105,2133,2134],{},"log.error()",", etc. calls are automatically sent to the server via the ",[105,2137,2138],{},"/api/_evlog/ingest"," endpoint.",[97,2141,2143],{"className":174,"code":2142,"filename":176,"language":177,"meta":103,"style":103},"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",[105,2144,2145,2157,2175,2183,2192,2207,2225,2229,2233],{"__ignoreMap":103},[108,2146,2147,2149,2151,2153,2155],{"class":110,"line":111},[108,2148,185],{"class":184},[108,2150,188],{"class":184},[108,2152,192],{"class":191},[108,2154,196],{"class":195},[108,2156,200],{"class":199},[108,2158,2159,2161,2163,2165,2167,2169,2171,2173],{"class":110,"line":203},[108,2160,207],{"class":206},[108,2162,210],{"class":199},[108,2164,213],{"class":195},[108,2166,216],{"class":199},[108,2168,170],{"class":117},[108,2170,216],{"class":199},[108,2172,223],{"class":195},[108,2174,226],{"class":199},[108,2176,2177,2179,2181],{"class":110,"line":229},[108,2178,232],{"class":206},[108,2180,210],{"class":199},[108,2182,237],{"class":199},[108,2184,2185,2188,2190],{"class":110,"line":240},[108,2186,2187],{"class":206},"    transport",[108,2189,210],{"class":199},[108,2191,237],{"class":199},[108,2193,2194,2197,2199,2202,2204],{"class":110,"line":250},[108,2195,2196],{"class":206},"      enabled",[108,2198,210],{"class":199},[108,2200,2201],{"class":1504}," true",[108,2203,658],{"class":199},[108,2205,2206],{"class":277},"  // Enable client log transport\n",[108,2208,2209,2212,2214,2216,2218,2220,2222],{"class":110,"line":268},[108,2210,2211],{"class":206},"      endpoint",[108,2213,210],{"class":199},[108,2215,258],{"class":199},[108,2217,2138],{"class":117},[108,2219,216],{"class":199},[108,2221,658],{"class":199},[108,2223,2224],{"class":277},"  // default\n",[108,2226,2227],{"class":110,"line":274},[108,2228,271],{"class":199},[108,2230,2231],{"class":110,"line":281},[108,2232,332],{"class":199},[108,2234,2235,2237],{"class":110,"line":302},[108,2236,338],{"class":199},[108,2238,341],{"class":195},[985,2240,2242],{"id":2241},"how-it-works","How it works",[2244,2245,2246,2252,2258,2261,2269],"ol",{},[949,2247,2248,2249],{},"Client calls ",[105,2250,2251],{},"log.info({ action: 'click', button: 'submit' })",[949,2253,2254,2255,2257],{},"Log is sent to ",[105,2256,2138],{}," via POST",[949,2259,2260],{},"Server enriches with environment context (service, version, region, etc.)",[949,2262,2263,2265,2266],{},[105,2264,1555],{}," hook is called with ",[105,2267,2268],{},"source: 'client'",[949,2270,2271],{},"External services receive the log (Axiom, Loki, etc.)",[745,2273,2274,2275,961,2278,2281,2282,2285],{"color":747,"icon":13},"Client logs are automatically enriched with the server's environment context. You don't need to send ",[105,2276,2277],{},"service",[105,2279,2280],{},"environment",", or ",[105,2283,2284],{},"version"," from the client.",[82,2287,2288,2289,2291],{},"In your drain hook, you can identify client logs by the ",[105,2290,2268],{}," field:",[97,2293,2296],{"className":174,"code":2294,"filename":2295,"language":177,"meta":103,"style":103},"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",[105,2297,2298,2318,2352,2383,2388,2417,2421,2426,2432],{"__ignoreMap":103},[108,2299,2300,2302,2304,2306,2308,2310,2312,2314,2316],{"class":110,"line":111},[108,2301,185],{"class":184},[108,2303,188],{"class":184},[108,2305,1353],{"class":191},[108,2307,196],{"class":195},[108,2309,196],{"class":199},[108,2311,1361],{"class":1360},[108,2313,965],{"class":199},[108,2315,1367],{"class":1366},[108,2317,237],{"class":199},[108,2319,2320,2322,2324,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350],{"class":110,"line":203},[108,2321,1374],{"class":195},[108,2323,1151],{"class":199},[108,2325,1379],{"class":195},[108,2327,1151],{"class":199},[108,2329,1384],{"class":191},[108,2331,196],{"class":206},[108,2333,216],{"class":199},[108,2335,1555],{"class":117},[108,2337,216],{"class":199},[108,2339,658],{"class":199},[108,2341,1611],{"class":1366},[108,2343,1397],{"class":199},[108,2345,1400],{"class":1360},[108,2347,965],{"class":199},[108,2349,1367],{"class":1366},[108,2351,237],{"class":199},[108,2353,2354,2356,2358,2360,2362,2364,2366,2369,2372,2374,2377,2379,2381],{"class":110,"line":229},[108,2355,1474],{"class":184},[108,2357,1397],{"class":206},[108,2359,1400],{"class":195},[108,2361,1151],{"class":199},[108,2363,1729],{"class":195},[108,2365,1151],{"class":199},[108,2367,2368],{"class":195},"source",[108,2370,2371],{"class":199}," ===",[108,2373,258],{"class":199},[108,2375,2376],{"class":117},"client",[108,2378,216],{"class":199},[108,2380,1487],{"class":206},[108,2382,200],{"class":199},[108,2384,2385],{"class":110,"line":240},[108,2386,2387],{"class":277},"      // Handle client logs specifically\n",[108,2389,2390,2393,2395,2398,2400,2402,2405,2407,2409,2411,2413,2415],{"class":110,"line":250},[108,2391,2392],{"class":195},"      console",[108,2394,1151],{"class":199},[108,2396,2397],{"class":191},"log",[108,2399,196],{"class":206},[108,2401,216],{"class":199},[108,2403,2404],{"class":117},"[CLIENT]",[108,2406,216],{"class":199},[108,2408,658],{"class":199},[108,2410,1425],{"class":195},[108,2412,1151],{"class":199},[108,2414,1729],{"class":195},[108,2416,341],{"class":206},[108,2418,2419],{"class":110,"line":268},[108,2420,1510],{"class":199},[108,2422,2423],{"class":110,"line":274},[108,2424,2425],{"class":277},"    // Send to external service...\n",[108,2427,2428,2430],{"class":110,"line":281},[108,2429,1515],{"class":199},[108,2431,341],{"class":206},[108,2433,2434,2436],{"class":110,"line":302},[108,2435,338],{"class":199},[108,2437,341],{"class":195},[745,2439,2441,2451],{"color":747,"icon":2440},"i-lucide-lightbulb",[82,2442,2443,2446,2447,2450],{},[749,2444,2445],{},"Tip:"," Use Nuxt's ",[105,2448,2449],{},"$production"," override to sample only in production while keeping full visibility in development:",[97,2452,2454],{"className":174,"code":2453,"filename":176,"language":177,"meta":103,"style":103},"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",[105,2455,2456,2468,2486,2494,2514,2518,2527,2536,2545,2581,2615,2619,2623,2627],{"__ignoreMap":103},[108,2457,2458,2460,2462,2464,2466],{"class":110,"line":111},[108,2459,185],{"class":184},[108,2461,188],{"class":184},[108,2463,192],{"class":191},[108,2465,196],{"class":195},[108,2467,200],{"class":199},[108,2469,2470,2472,2474,2476,2478,2480,2482,2484],{"class":110,"line":203},[108,2471,207],{"class":206},[108,2473,210],{"class":199},[108,2475,213],{"class":195},[108,2477,216],{"class":199},[108,2479,170],{"class":117},[108,2481,216],{"class":199},[108,2483,223],{"class":195},[108,2485,226],{"class":199},[108,2487,2488,2490,2492],{"class":110,"line":229},[108,2489,232],{"class":206},[108,2491,210],{"class":199},[108,2493,237],{"class":199},[108,2495,2496,2498,2500,2502,2504,2506,2508,2510,2512],{"class":110,"line":240},[108,2497,243],{"class":206},[108,2499,210],{"class":199},[108,2501,860],{"class":199},[108,2503,863],{"class":206},[108,2505,210],{"class":199},[108,2507,258],{"class":199},[108,2509,261],{"class":117},[108,2511,216],{"class":199},[108,2513,875],{"class":199},[108,2515,2516],{"class":110,"line":250},[108,2517,332],{"class":199},[108,2519,2520,2523,2525],{"class":110,"line":268},[108,2521,2522],{"class":206},"  $production",[108,2524,210],{"class":199},[108,2526,237],{"class":199},[108,2528,2529,2532,2534],{"class":110,"line":274},[108,2530,2531],{"class":206},"    evlog",[108,2533,210],{"class":199},[108,2535,237],{"class":199},[108,2537,2538,2541,2543],{"class":110,"line":281},[108,2539,2540],{"class":206},"      sampling",[108,2542,210],{"class":199},[108,2544,237],{"class":199},[108,2546,2547,2550,2552,2554,2556,2558,2560,2562,2565,2567,2569,2571,2574,2576,2579],{"class":110,"line":302},[108,2548,2549],{"class":206},"        rates",[108,2551,210],{"class":199},[108,2553,860],{"class":199},[108,2555,1224],{"class":206},[108,2557,210],{"class":199},[108,2559,1067],{"class":1066},[108,2561,658],{"class":199},[108,2563,2564],{"class":206}," warn",[108,2566,210],{"class":199},[108,2568,1082],{"class":1066},[108,2570,658],{"class":199},[108,2572,2573],{"class":206}," debug",[108,2575,210],{"class":199},[108,2577,2578],{"class":1066}," 0",[108,2580,875],{"class":199},[108,2582,2583,2586,2588,2590,2593,2595,2597,2599,2601,2603,2605,2607,2609,2611,2613],{"class":110,"line":308},[108,2584,2585],{"class":206},"        keep",[108,2587,210],{"class":199},[108,2589,213],{"class":195},[108,2591,2592],{"class":199},"{",[108,2594,1251],{"class":206},[108,2596,210],{"class":199},[108,2598,1256],{"class":1066},[108,2600,1231],{"class":199},[108,2602,860],{"class":199},[108,2604,1268],{"class":206},[108,2606,210],{"class":199},[108,2608,1273],{"class":1066},[108,2610,1452],{"class":199},[108,2612,223],{"class":195},[108,2614,226],{"class":199},[108,2616,2617],{"class":110,"line":329},[108,2618,1122],{"class":199},[108,2620,2621],{"class":110,"line":335},[108,2622,271],{"class":199},[108,2624,2625],{"class":110,"line":739},[108,2626,332],{"class":199},[108,2628,2629,2631],{"class":110,"line":2017},[108,2630,338],{"class":199},[108,2632,341],{"class":195},[82,2634,2635,2636,2639],{},"That's it! You can now use ",[105,2637,2638],{},"useLogger(event)"," in any API route.",[86,2641,2643],{"id":2642},"nitro","Nitro",[82,2645,92],{},[94,2647,2648,2660,2672,2684],{},[97,2649,2650],{"className":99,"code":100,"filename":101,"language":102,"meta":103,"style":103},[105,2651,2652],{"__ignoreMap":103},[108,2653,2654,2656,2658],{"class":110,"line":111},[108,2655,101],{"class":114},[108,2657,118],{"class":117},[108,2659,121],{"class":117},[97,2661,2662],{"className":99,"code":124,"filename":125,"language":102,"meta":103,"style":103},[105,2663,2664],{"__ignoreMap":103},[108,2665,2666,2668,2670],{"class":110,"line":111},[108,2667,125],{"class":114},[108,2669,134],{"class":117},[108,2671,121],{"class":117},[97,2673,2674],{"className":99,"code":139,"filename":140,"language":102,"meta":103,"style":103},[105,2675,2676],{"__ignoreMap":103},[108,2677,2678,2680,2682],{"class":110,"line":111},[108,2679,140],{"class":114},[108,2681,118],{"class":117},[108,2683,121],{"class":117},[97,2685,2686],{"className":99,"code":153,"filename":154,"language":102,"meta":103,"style":103},[105,2687,2688],{"__ignoreMap":103},[108,2689,2690,2692,2694],{"class":110,"line":111},[108,2691,154],{"class":114},[108,2693,118],{"class":117},[108,2695,121],{"class":117},[82,2697,2698,2699,2702],{},"Then, add evlog as a Nitro plugin (without Nuxt) using the ",[105,2700,2701],{},"evlog/nitro"," plugin:",[97,2704,2707],{"className":174,"code":2705,"filename":2706,"language":177,"meta":103,"style":103},"export default defineNitroConfig({\n  plugins: ['evlog/nitro'],\n})\n","nitro.config.ts",[105,2708,2709,2722,2741],{"__ignoreMap":103},[108,2710,2711,2713,2715,2718,2720],{"class":110,"line":111},[108,2712,185],{"class":184},[108,2714,188],{"class":184},[108,2716,2717],{"class":191}," defineNitroConfig",[108,2719,196],{"class":195},[108,2721,200],{"class":199},[108,2723,2724,2727,2729,2731,2733,2735,2737,2739],{"class":110,"line":203},[108,2725,2726],{"class":206},"  plugins",[108,2728,210],{"class":199},[108,2730,213],{"class":195},[108,2732,216],{"class":199},[108,2734,2701],{"class":117},[108,2736,216],{"class":199},[108,2738,223],{"class":195},[108,2740,226],{"class":199},[108,2742,2743,2745],{"class":110,"line":229},[108,2744,338],{"class":199},[108,2746,341],{"class":195},[86,2748,2750],{"id":2749},"cloudflare-workers","Cloudflare Workers",[82,2752,2753],{},"Use the Workers adapter for structured logs and correct platform severity.",[97,2755,2758],{"className":174,"code":2756,"filename":2757,"language":177,"meta":103,"style":103},"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",[105,2759,2760,2788,2792,2801,2823,2829,2833,2841,2861,2878,2882,2889,2919,2959,2986,2994,3010,3029,3052,3060,3064,3068],{"__ignoreMap":103},[108,2761,2762,2765,2767,2770,2772,2775,2777,2780,2782,2785],{"class":110,"line":111},[108,2763,2764],{"class":184},"import",[108,2766,860],{"class":199},[108,2768,2769],{"class":195}," initWorkersLogger",[108,2771,658],{"class":199},[108,2773,2774],{"class":195}," createWorkersLogger",[108,2776,1452],{"class":199},[108,2778,2779],{"class":184}," from",[108,2781,258],{"class":199},[108,2783,2784],{"class":117},"evlog/workers",[108,2786,2787],{"class":199},"'\n",[108,2789,2790],{"class":110,"line":203},[108,2791,1464],{"emptyLinePlaceholder":1463},[108,2793,2794,2797,2799],{"class":110,"line":229},[108,2795,2796],{"class":191},"initWorkersLogger",[108,2798,196],{"class":195},[108,2800,200],{"class":199},[108,2802,2803,2806,2808,2810,2812,2814,2816,2819,2821],{"class":110,"line":240},[108,2804,2805],{"class":206},"  env",[108,2807,210],{"class":199},[108,2809,860],{"class":199},[108,2811,863],{"class":206},[108,2813,210],{"class":199},[108,2815,258],{"class":199},[108,2817,2818],{"class":117},"edge-api",[108,2820,216],{"class":199},[108,2822,875],{"class":199},[108,2824,2825,2827],{"class":110,"line":250},[108,2826,338],{"class":199},[108,2828,341],{"class":195},[108,2830,2831],{"class":110,"line":268},[108,2832,1464],{"emptyLinePlaceholder":1463},[108,2834,2835,2837,2839],{"class":110,"line":274},[108,2836,185],{"class":184},[108,2838,188],{"class":184},[108,2840,237],{"class":199},[108,2842,2843,2846,2848,2850,2852,2854,2857,2859],{"class":110,"line":281},[108,2844,2845],{"class":1366},"  async",[108,2847,1634],{"class":206},[108,2849,196],{"class":199},[108,2851,1775],{"class":1360},[108,2853,210],{"class":199},[108,2855,2856],{"class":114}," Request",[108,2858,965],{"class":199},[108,2860,237],{"class":199},[108,2862,2863,2865,2868,2870,2872,2874,2876],{"class":110,"line":302},[108,2864,1416],{"class":1366},[108,2866,2867],{"class":195}," log",[108,2869,1422],{"class":199},[108,2871,2774],{"class":191},[108,2873,196],{"class":206},[108,2875,1775],{"class":195},[108,2877,341],{"class":206},[108,2879,2880],{"class":110,"line":308},[108,2881,1464],{"emptyLinePlaceholder":1463},[108,2883,2884,2887],{"class":110,"line":329},[108,2885,2886],{"class":184},"    try",[108,2888,237],{"class":199},[108,2890,2891,2894,2896,2899,2901,2903,2906,2908,2910,2913,2915,2917],{"class":110,"line":335},[108,2892,2893],{"class":195},"      log",[108,2895,1151],{"class":199},[108,2897,2898],{"class":191},"set",[108,2900,196],{"class":206},[108,2902,2592],{"class":199},[108,2904,2905],{"class":206}," route",[108,2907,210],{"class":199},[108,2909,258],{"class":199},[108,2911,2912],{"class":117},"health",[108,2914,216],{"class":199},[108,2916,1452],{"class":199},[108,2918,341],{"class":206},[108,2920,2921,2924,2927,2929,2932,2935,2937,2939,2942,2944,2946,2948,2950,2952,2955,2957],{"class":110,"line":739},[108,2922,2923],{"class":1366},"      const",[108,2925,2926],{"class":195}," response",[108,2928,1422],{"class":199},[108,2930,2931],{"class":199}," new",[108,2933,2934],{"class":191}," Response",[108,2936,196],{"class":206},[108,2938,216],{"class":199},[108,2940,2941],{"class":117},"ok",[108,2943,216],{"class":199},[108,2945,658],{"class":199},[108,2947,860],{"class":199},[108,2949,1268],{"class":206},[108,2951,210],{"class":199},[108,2953,2954],{"class":1066}," 200",[108,2956,1452],{"class":199},[108,2958,341],{"class":206},[108,2960,2961,2963,2965,2968,2970,2972,2974,2976,2978,2980,2982,2984],{"class":110,"line":2017},[108,2962,2893],{"class":195},[108,2964,1151],{"class":199},[108,2966,2967],{"class":191},"emit",[108,2969,196],{"class":206},[108,2971,2592],{"class":199},[108,2973,1268],{"class":206},[108,2975,210],{"class":199},[108,2977,2926],{"class":195},[108,2979,1151],{"class":199},[108,2981,1533],{"class":195},[108,2983,1452],{"class":199},[108,2985,341],{"class":206},[108,2987,2988,2991],{"class":110,"line":2023},[108,2989,2990],{"class":184},"      return",[108,2992,2993],{"class":195}," response\n",[108,2995,2996,2998,3001,3003,3006,3008],{"class":110,"line":2038},[108,2997,1739],{"class":199},[108,2999,3000],{"class":184}," catch",[108,3002,1397],{"class":206},[108,3004,3005],{"class":195},"error",[108,3007,1487],{"class":206},[108,3009,200],{"class":199},[108,3011,3012,3014,3016,3018,3020,3022,3024,3027],{"class":110,"line":2046},[108,3013,2893],{"class":195},[108,3015,1151],{"class":199},[108,3017,3005],{"class":191},[108,3019,196],{"class":206},[108,3021,3005],{"class":195},[108,3023,1438],{"class":184},[108,3025,3026],{"class":114}," Error",[108,3028,341],{"class":206},[108,3030,3031,3033,3035,3037,3039,3041,3043,3045,3048,3050],{"class":110,"line":2063},[108,3032,2893],{"class":195},[108,3034,1151],{"class":199},[108,3036,2967],{"class":191},[108,3038,196],{"class":206},[108,3040,2592],{"class":199},[108,3042,1268],{"class":206},[108,3044,210],{"class":199},[108,3046,3047],{"class":1066}," 500",[108,3049,1452],{"class":199},[108,3051,341],{"class":206},[108,3053,3054,3057],{"class":110,"line":2073},[108,3055,3056],{"class":184},"      throw",[108,3058,3059],{"class":195}," error\n",[108,3061,3062],{"class":110,"line":2087},[108,3063,1510],{"class":199},[108,3065,3066],{"class":110,"line":2099},[108,3067,332],{"class":199},[108,3069,3070],{"class":110,"line":2104},[108,3071,3072],{"class":199},"}\n",[82,3074,3075],{},"Disable invocation logs to avoid duplicate request logs:",[97,3077,3082],{"className":3078,"code":3079,"filename":3080,"language":3081,"meta":103,"style":103},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[observability.logs]\ninvocation_logs = false\n","wrangler.toml","toml",[105,3083,3084,3089],{"__ignoreMap":103},[108,3085,3086],{"class":110,"line":111},[108,3087,3088],{},"[observability.logs]\n",[108,3090,3091],{"class":110,"line":203},[108,3092,3093],{},"invocation_logs = false\n",[82,3095,3096],{},"Notes:",[946,3098,3099,3108,3114],{},[949,3100,3101,3103,3104,3107],{},[105,3102,1783],{}," defaults to ",[105,3105,3106],{},"cf-ray"," when available",[949,3109,3110,3113],{},[105,3111,3112],{},"request.cf"," is included (colo, country, asn) unless disabled",[949,3115,587,3116,3119],{},[105,3117,3118],{},"headerAllowlist"," to avoid logging sensitive headers",[86,3121,3123],{"id":3122},"standalone-typescript","Standalone TypeScript",[82,3125,92],{},[94,3127,3128,3140,3152,3164],{},[97,3129,3130],{"className":99,"code":100,"filename":101,"language":102,"meta":103,"style":103},[105,3131,3132],{"__ignoreMap":103},[108,3133,3134,3136,3138],{"class":110,"line":111},[108,3135,101],{"class":114},[108,3137,118],{"class":117},[108,3139,121],{"class":117},[97,3141,3142],{"className":99,"code":124,"filename":125,"language":102,"meta":103,"style":103},[105,3143,3144],{"__ignoreMap":103},[108,3145,3146,3148,3150],{"class":110,"line":111},[108,3147,125],{"class":114},[108,3149,134],{"class":117},[108,3151,121],{"class":117},[97,3153,3154],{"className":99,"code":139,"filename":140,"language":102,"meta":103,"style":103},[105,3155,3156],{"__ignoreMap":103},[108,3157,3158,3160,3162],{"class":110,"line":111},[108,3159,140],{"class":114},[108,3161,118],{"class":117},[108,3163,121],{"class":117},[97,3165,3166],{"className":99,"code":153,"filename":154,"language":102,"meta":103,"style":103},[105,3167,3168],{"__ignoreMap":103},[108,3169,3170,3172,3174],{"class":110,"line":111},[108,3171,154],{"class":114},[108,3173,118],{"class":117},[108,3175,121],{"class":117},[82,3177,3178],{},"Then, use it as any other TypeScript library within your scripts, CLI tools, workers, or apps:",[97,3180,3183],{"className":174,"code":3181,"filename":3182,"language":177,"meta":103,"style":103},"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",[105,3184,3185,3210,3214,3219,3228,3236,3252,3268,3272,3277,3286,3311,3315,3321,3325,3330,3364,3405,3429],{"__ignoreMap":103},[108,3186,3187,3189,3191,3194,3196,3199,3201,3203,3205,3208],{"class":110,"line":111},[108,3188,2764],{"class":184},[108,3190,860],{"class":199},[108,3192,3193],{"class":195}," initLogger",[108,3195,658],{"class":199},[108,3197,3198],{"class":195}," createRequestLogger",[108,3200,1452],{"class":199},[108,3202,2779],{"class":184},[108,3204,258],{"class":199},[108,3206,3207],{"class":117},"evlog",[108,3209,2787],{"class":199},[108,3211,3212],{"class":110,"line":203},[108,3213,1464],{"emptyLinePlaceholder":1463},[108,3215,3216],{"class":110,"line":229},[108,3217,3218],{"class":277},"// Initialize once at startup\n",[108,3220,3221,3224,3226],{"class":110,"line":240},[108,3222,3223],{"class":191},"initLogger",[108,3225,196],{"class":195},[108,3227,200],{"class":199},[108,3229,3230,3232,3234],{"class":110,"line":250},[108,3231,2805],{"class":206},[108,3233,210],{"class":199},[108,3235,237],{"class":199},[108,3237,3238,3241,3243,3245,3248,3250],{"class":110,"line":268},[108,3239,3240],{"class":206},"    service",[108,3242,210],{"class":199},[108,3244,258],{"class":199},[108,3246,3247],{"class":117},"my-worker",[108,3249,216],{"class":199},[108,3251,226],{"class":199},[108,3253,3254,3257,3259,3261,3264,3266],{"class":110,"line":274},[108,3255,3256],{"class":206},"    environment",[108,3258,210],{"class":199},[108,3260,258],{"class":199},[108,3262,3263],{"class":117},"production",[108,3265,216],{"class":199},[108,3267,226],{"class":199},[108,3269,3270],{"class":110,"line":281},[108,3271,332],{"class":199},[108,3273,3274],{"class":110,"line":302},[108,3275,3276],{"class":277},"  // Optional: sample logs\n",[108,3278,3279,3282,3284],{"class":110,"line":308},[108,3280,3281],{"class":206},"  sampling",[108,3283,210],{"class":199},[108,3285,237],{"class":199},[108,3287,3288,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309],{"class":110,"line":329},[108,3289,3290],{"class":206},"    rates",[108,3292,210],{"class":199},[108,3294,860],{"class":199},[108,3296,1224],{"class":206},[108,3298,210],{"class":199},[108,3300,1067],{"class":1066},[108,3302,658],{"class":199},[108,3304,2573],{"class":206},[108,3306,210],{"class":199},[108,3308,1097],{"class":1066},[108,3310,875],{"class":199},[108,3312,3313],{"class":110,"line":335},[108,3314,332],{"class":199},[108,3316,3317,3319],{"class":110,"line":739},[108,3318,338],{"class":199},[108,3320,341],{"class":195},[108,3322,3323],{"class":110,"line":2017},[108,3324,1464],{"emptyLinePlaceholder":1463},[108,3326,3327],{"class":110,"line":2023},[108,3328,3329],{"class":277},"// Create a logger for each operation\n",[108,3331,3332,3335,3338,3341,3343,3345,3347,3350,3352,3355,3357,3360,3362],{"class":110,"line":2038},[108,3333,3334],{"class":1366},"const",[108,3336,3337],{"class":195}," log ",[108,3339,3340],{"class":199},"=",[108,3342,3198],{"class":191},[108,3344,196],{"class":195},[108,3346,2592],{"class":199},[108,3348,3349],{"class":206}," jobId",[108,3351,210],{"class":199},[108,3353,3354],{"class":195}," job",[108,3356,1151],{"class":199},[108,3358,3359],{"class":195},"id ",[108,3361,338],{"class":199},[108,3363,341],{"class":195},[108,3365,3366,3368,3370,3372,3374,3376,3379,3381,3383,3385,3387,3389,3392,3394,3396,3398,3401,3403],{"class":110,"line":2046},[108,3367,2397],{"class":195},[108,3369,1151],{"class":199},[108,3371,2898],{"class":191},[108,3373,196],{"class":195},[108,3375,2592],{"class":199},[108,3377,3378],{"class":206}," source",[108,3380,210],{"class":199},[108,3382,3354],{"class":195},[108,3384,1151],{"class":199},[108,3386,2368],{"class":195},[108,3388,658],{"class":199},[108,3390,3391],{"class":206}," target",[108,3393,210],{"class":199},[108,3395,3354],{"class":195},[108,3397,1151],{"class":199},[108,3399,3400],{"class":195},"target ",[108,3402,338],{"class":199},[108,3404,341],{"class":195},[108,3406,3407,3409,3411,3413,3415,3417,3420,3422,3425,3427],{"class":110,"line":2063},[108,3408,2397],{"class":195},[108,3410,1151],{"class":199},[108,3412,2898],{"class":191},[108,3414,196],{"class":195},[108,3416,2592],{"class":199},[108,3418,3419],{"class":206}," recordsSynced",[108,3421,210],{"class":199},[108,3423,3424],{"class":1066}," 150",[108,3426,1452],{"class":199},[108,3428,341],{"class":195},[108,3430,3431,3433,3435,3437,3440],{"class":110,"line":2073},[108,3432,2397],{"class":195},[108,3434,1151],{"class":199},[108,3436,2967],{"class":191},[108,3438,3439],{"class":195},"() ",[108,3441,3442],{"class":277},"// Manual emit required in standalone mode\n",[745,3444,3445,3446,3449],{"color":747,"icon":13},"In standalone mode, you must call ",[105,3447,3448],{},"log.emit()"," manually. In Nuxt/Nitro, this happens automatically at request end.",[86,3451,3453],{"id":3452},"typescript-configuration","TypeScript Configuration",[82,3455,3456],{},"evlog ships with full TypeScript type definitions. No additional configuration is required.",[745,3458,3460],{"color":1139,"icon":3459},"i-lucide-check","evlog requires TypeScript 5.0 or higher for optimal type inference.",[86,3462,3464],{"id":3463},"next-steps","Next Steps",[946,3466,3467],{},[949,3468,3469,3471],{},[514,3470,20],{"href":21}," - Learn the core concepts and start using evlog",[3473,3474,3475],"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":103,"searchDepth":203,"depth":203,"links":3477},[3478,3486,3487,3488,3489,3490],{"id":88,"depth":203,"text":89,"children":3479},[3480,3481,3482,3483,3484,3485],{"id":345,"depth":229,"text":346},{"id":583,"depth":229,"text":584},{"id":760,"depth":229,"text":761},{"id":980,"depth":229,"text":517},{"id":1548,"depth":229,"text":1549},{"id":2125,"depth":229,"text":561},{"id":2642,"depth":203,"text":2643},{"id":2749,"depth":203,"text":2750},{"id":3122,"depth":203,"text":3123},{"id":3452,"depth":203,"text":3453},{"id":3463,"depth":203,"text":3464},"Install evlog in your Nuxt, Nitro, Cloudflare Workers, or standalone TypeScript project. Configure sampling, log draining, and client transport.","md",[3494],{"label":20,"icon":23,"to":21},{},{"title":15,"icon":18},{"title":77,"description":3491},"DDVewJBvunROA97fftJtZmW1PbfeTx2bSimo6RPXRtg",[3500,3502],{"title":10,"path":11,"stem":12,"description":3501,"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":3503,"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.",1770243616085]