evlog 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -1
- package/dist/adapters/axiom.d.mts +62 -0
- package/dist/adapters/axiom.d.ts +62 -0
- package/dist/adapters/axiom.mjs +65 -0
- package/dist/adapters/otlp.d.mts +83 -0
- package/dist/adapters/otlp.d.ts +83 -0
- package/dist/adapters/otlp.mjs +202 -0
- package/dist/logger.mjs +7 -3
- package/dist/nitro/plugin.mjs +24 -8
- package/dist/nuxt/module.d.mts +65 -1
- package/dist/nuxt/module.d.ts +65 -1
- package/dist/runtime/server/useLogger.d.mts +10 -1
- package/dist/runtime/server/useLogger.d.ts +10 -1
- package/dist/runtime/server/useLogger.mjs +4 -1
- package/dist/types.d.mts +24 -2
- package/dist/types.d.ts +24 -2
- package/dist/utils.d.mts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.mjs +8 -4
- package/dist/workers.d.mts +45 -0
- package/dist/workers.d.ts +45 -0
- package/dist/workers.mjs +53 -0
- package/package.json +22 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { RequestLogger, LoggerConfig } from './types.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Options for createWorkersLogger
|
|
5
|
+
*/
|
|
6
|
+
interface WorkersLoggerOptions {
|
|
7
|
+
/** Override the request ID (default: cf-ray header) */
|
|
8
|
+
requestId?: string;
|
|
9
|
+
/** Headers to include in logs (default: none) */
|
|
10
|
+
headers?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Initialize evlog for Cloudflare Workers.
|
|
14
|
+
* Call once at module scope.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* initWorkersLogger({
|
|
19
|
+
* env: { service: 'my-api' },
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function initWorkersLogger(options?: LoggerConfig): void;
|
|
24
|
+
/**
|
|
25
|
+
* Create a request-scoped logger for Cloudflare Workers.
|
|
26
|
+
* Auto-extracts cf-ray, request.cf context, method, and path.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* export default {
|
|
31
|
+
* async fetch(request: Request) {
|
|
32
|
+
* const log = createWorkersLogger(request)
|
|
33
|
+
*
|
|
34
|
+
* log.set({ user: { id: '123' } })
|
|
35
|
+
* log.emit({ status: 200 })
|
|
36
|
+
*
|
|
37
|
+
* return new Response('ok')
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
declare function createWorkersLogger(request: Request, options?: WorkersLoggerOptions): RequestLogger;
|
|
43
|
+
|
|
44
|
+
export { createWorkersLogger, initWorkersLogger };
|
|
45
|
+
export type { WorkersLoggerOptions };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { RequestLogger, LoggerConfig } from './types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Options for createWorkersLogger
|
|
5
|
+
*/
|
|
6
|
+
interface WorkersLoggerOptions {
|
|
7
|
+
/** Override the request ID (default: cf-ray header) */
|
|
8
|
+
requestId?: string;
|
|
9
|
+
/** Headers to include in logs (default: none) */
|
|
10
|
+
headers?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Initialize evlog for Cloudflare Workers.
|
|
14
|
+
* Call once at module scope.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* initWorkersLogger({
|
|
19
|
+
* env: { service: 'my-api' },
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function initWorkersLogger(options?: LoggerConfig): void;
|
|
24
|
+
/**
|
|
25
|
+
* Create a request-scoped logger for Cloudflare Workers.
|
|
26
|
+
* Auto-extracts cf-ray, request.cf context, method, and path.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* export default {
|
|
31
|
+
* async fetch(request: Request) {
|
|
32
|
+
* const log = createWorkersLogger(request)
|
|
33
|
+
*
|
|
34
|
+
* log.set({ user: { id: '123' } })
|
|
35
|
+
* log.emit({ status: 200 })
|
|
36
|
+
*
|
|
37
|
+
* return new Response('ok')
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
declare function createWorkersLogger(request: Request, options?: WorkersLoggerOptions): RequestLogger;
|
|
43
|
+
|
|
44
|
+
export { createWorkersLogger, initWorkersLogger };
|
|
45
|
+
export type { WorkersLoggerOptions };
|
package/dist/workers.mjs
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createRequestLogger, initLogger } from './logger.mjs';
|
|
2
|
+
import 'defu';
|
|
3
|
+
import './utils.mjs';
|
|
4
|
+
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function collectHeaders(headers, include) {
|
|
9
|
+
if (!include || include.length === 0) return void 0;
|
|
10
|
+
const normalized = new Set(include.map((h) => h.toLowerCase()));
|
|
11
|
+
const result = {};
|
|
12
|
+
headers.forEach((value, key) => {
|
|
13
|
+
if (normalized.has(key.toLowerCase())) {
|
|
14
|
+
result[key] = value;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
18
|
+
}
|
|
19
|
+
function initWorkersLogger(options = {}) {
|
|
20
|
+
initLogger({
|
|
21
|
+
...options,
|
|
22
|
+
pretty: false,
|
|
23
|
+
stringify: false
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function pickCfContext(request) {
|
|
27
|
+
const cf = Reflect.get(request, "cf");
|
|
28
|
+
if (!isRecord(cf)) return {};
|
|
29
|
+
const out = {};
|
|
30
|
+
if (typeof cf.colo === "string") out.colo = cf.colo;
|
|
31
|
+
if (typeof cf.country === "string") out.country = cf.country;
|
|
32
|
+
if (typeof cf.asn === "number") out.asn = cf.asn;
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
function createWorkersLogger(request, options = {}) {
|
|
36
|
+
const url = new URL(request.url);
|
|
37
|
+
const cfRay = request.headers.get("cf-ray") ?? void 0;
|
|
38
|
+
const traceparent = request.headers.get("traceparent") ?? void 0;
|
|
39
|
+
const log = createRequestLogger({
|
|
40
|
+
method: request.method,
|
|
41
|
+
path: url.pathname,
|
|
42
|
+
requestId: options.requestId ?? cfRay
|
|
43
|
+
});
|
|
44
|
+
log.set({
|
|
45
|
+
cfRay,
|
|
46
|
+
traceparent,
|
|
47
|
+
...pickCfContext(request),
|
|
48
|
+
...options.headers ? { requestHeaders: collectHeaders(request.headers, options.headers) } : {}
|
|
49
|
+
});
|
|
50
|
+
return log;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { createWorkersLogger, initWorkersLogger };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evlog",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Wide event logging library with structured error handling. Inspired by LoggingSucks.",
|
|
5
5
|
"author": "HugoRCD <contact@hrcd.fr>",
|
|
6
6
|
"homepage": "https://evlog.dev",
|
|
@@ -34,6 +34,18 @@
|
|
|
34
34
|
"./nitro": {
|
|
35
35
|
"types": "./dist/nitro/plugin.d.mts",
|
|
36
36
|
"import": "./dist/nitro/plugin.mjs"
|
|
37
|
+
},
|
|
38
|
+
"./workers": {
|
|
39
|
+
"types": "./dist/workers.d.mts",
|
|
40
|
+
"import": "./dist/workers.mjs"
|
|
41
|
+
},
|
|
42
|
+
"./axiom": {
|
|
43
|
+
"types": "./dist/adapters/axiom.d.mts",
|
|
44
|
+
"import": "./dist/adapters/axiom.mjs"
|
|
45
|
+
},
|
|
46
|
+
"./otlp": {
|
|
47
|
+
"types": "./dist/adapters/otlp.d.mts",
|
|
48
|
+
"import": "./dist/adapters/otlp.mjs"
|
|
37
49
|
}
|
|
38
50
|
},
|
|
39
51
|
"main": "./dist/index.mjs",
|
|
@@ -48,6 +60,15 @@
|
|
|
48
60
|
],
|
|
49
61
|
"nitro": [
|
|
50
62
|
"./dist/nitro/plugin.d.mts"
|
|
63
|
+
],
|
|
64
|
+
"workers": [
|
|
65
|
+
"./dist/workers.d.mts"
|
|
66
|
+
],
|
|
67
|
+
"axiom": [
|
|
68
|
+
"./dist/adapters/axiom.d.mts"
|
|
69
|
+
],
|
|
70
|
+
"otlp": [
|
|
71
|
+
"./dist/adapters/otlp.d.mts"
|
|
51
72
|
]
|
|
52
73
|
}
|
|
53
74
|
},
|