@miketako3/cloki 0.1.20 → 0.1.21
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 +70 -4
- package/dist/logger.d.ts +49 -13
- package/dist/logger.js +84 -19
- package/dist/logger.js.map +1 -1
- package/dist/logger.test.js +117 -50
- package/dist/logger.test.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -75,23 +75,89 @@ You can pass a string directly as a message. It will be converted to `{"message"
|
|
|
75
75
|
await logger.info("Hello World!");
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
#### 3. Cloudflare Workers `ctx.waitUntil`
|
|
78
|
+
#### 3. Cloudflare Workers `ctx.waitUntil` and `cf` properties
|
|
79
79
|
|
|
80
|
-
To prevent the log sending from being cancelled when the worker returns a response, you can pass the `ExecutionContext`.
|
|
80
|
+
To prevent the log sending from being cancelled when the worker returns a response, you can pass the `ExecutionContext` to `getLokiLogger` or to each log method. You can also automatically add labels from `request.cf`.
|
|
81
81
|
|
|
82
82
|
```typescript
|
|
83
83
|
export default {
|
|
84
84
|
async fetch(request, env, ctx) {
|
|
85
|
-
const logger = getLokiLogger({
|
|
85
|
+
const logger = getLokiLogger({
|
|
86
|
+
cf: request.cf, // Automatically add cf_colo, cf_country, etc.
|
|
87
|
+
ctx: ctx // Use ctx.waitUntil internally for all logs
|
|
88
|
+
});
|
|
86
89
|
|
|
87
90
|
// This will use ctx.waitUntil internally and won't block the response
|
|
88
|
-
logger.info("Request received", { path: new URL(request.url).pathname }
|
|
91
|
+
logger.info("Request received", { path: new URL(request.url).pathname });
|
|
89
92
|
|
|
90
93
|
return new Response("OK");
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
96
|
```
|
|
94
97
|
|
|
98
|
+
#### 4. Zero Configuration (Environment Variables)
|
|
99
|
+
|
|
100
|
+
If you set the following environment variables, you can initialize the logger without any arguments:
|
|
101
|
+
|
|
102
|
+
- `LOKI_HOST` (e.g., `logs-prod-us-central1.grafana.net`)
|
|
103
|
+
- `LOKI_USER`
|
|
104
|
+
- `LOKI_TOKEN`
|
|
105
|
+
|
|
106
|
+
Standard usage for Cloudflare Workers:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
export default {
|
|
110
|
+
async fetch(request, env, ctx) {
|
|
111
|
+
const logger = getLokiLogger({ cf: request.cf, ctx });
|
|
112
|
+
// ...
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### 5. Retries and Error Handling
|
|
118
|
+
|
|
119
|
+
You can configure retries and a callback for when sending fails.
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
const logger = getLokiLogger({
|
|
123
|
+
retries: 3,
|
|
124
|
+
onSendError: (err, msg) => {
|
|
125
|
+
console.error("Failed to send to Loki after retries", err);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### 6. Custom Formatter and Silent Mode
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
const logger = getLokiLogger({
|
|
134
|
+
silent: process.env.NODE_ENV === 'development',
|
|
135
|
+
format: (level, msg, labels) => {
|
|
136
|
+
// Return custom LokiMessage structure
|
|
137
|
+
return {
|
|
138
|
+
streams: [{
|
|
139
|
+
stream: { ...labels, level, custom: 'label' },
|
|
140
|
+
values: [[Date.now().toString() + "000000", JSON.stringify(msg)]]
|
|
141
|
+
}]
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
#### 7. TypeScript Type Safety for Labels
|
|
148
|
+
|
|
149
|
+
You can define the allowed label keys using Generics.
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
type MyLabels = 'env' | 'service' | 'version';
|
|
153
|
+
const logger = getLokiLogger<MyLabels>({
|
|
154
|
+
defaultLabels: { env: 'prod' } // Type checked
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
await logger.info("Hello", { service: 'api' }); // Type checked
|
|
158
|
+
// await logger.info("Hello", { unknown: 'label' }); // TypeScript Error
|
|
159
|
+
```
|
|
160
|
+
|
|
95
161
|
## Contributing
|
|
96
162
|
|
|
97
163
|
Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
|
package/dist/logger.d.ts
CHANGED
|
@@ -1,18 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Loki config
|
|
3
3
|
*/
|
|
4
|
-
export type LokiConfig = {
|
|
5
|
-
lokiHost
|
|
6
|
-
lokiToken
|
|
7
|
-
lokiUser
|
|
4
|
+
export type LokiConfig<T extends string = string> = {
|
|
5
|
+
lokiHost?: string;
|
|
6
|
+
lokiToken?: string;
|
|
7
|
+
lokiUser?: string;
|
|
8
8
|
/**
|
|
9
9
|
* Default labels added to all logs
|
|
10
10
|
*/
|
|
11
|
-
defaultLabels?: LokiLabels
|
|
11
|
+
defaultLabels?: LokiLabels<T>;
|
|
12
12
|
/**
|
|
13
13
|
* Minimum log level to send to Loki
|
|
14
14
|
*/
|
|
15
15
|
minLevel?: LogLevel;
|
|
16
|
+
/**
|
|
17
|
+
* Number of retries for fetch (default: 0)
|
|
18
|
+
*/
|
|
19
|
+
retries?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Callback when fetch fails
|
|
22
|
+
*/
|
|
23
|
+
onSendError?: (error: unknown, message: LokiMessage<T>) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Custom formatter for Loki message
|
|
26
|
+
*/
|
|
27
|
+
format?: (logLevel: LogLevel, message: object, labels: LokiLabels<T>) => LokiMessage<T>;
|
|
28
|
+
/**
|
|
29
|
+
* If true, don't send to Loki (just console.log)
|
|
30
|
+
*/
|
|
31
|
+
silent?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Automatically add labels from request.cf
|
|
34
|
+
*/
|
|
35
|
+
cf?: CfProperties;
|
|
36
|
+
/**
|
|
37
|
+
* Default ExecutionContext for ctx.waitUntil
|
|
38
|
+
*/
|
|
39
|
+
ctx?: ExecutionContext;
|
|
16
40
|
};
|
|
17
41
|
/**
|
|
18
42
|
* Log levels
|
|
@@ -21,20 +45,32 @@ export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
|
21
45
|
/**
|
|
22
46
|
* Loki labels
|
|
23
47
|
*/
|
|
24
|
-
export type LokiLabels = {
|
|
48
|
+
export type LokiLabels<T extends string = string> = {
|
|
49
|
+
[key in T]?: string;
|
|
50
|
+
} & {
|
|
25
51
|
[key: string]: string;
|
|
26
52
|
};
|
|
27
53
|
/**
|
|
28
54
|
* Loki message
|
|
29
55
|
*/
|
|
30
|
-
export type LokiMessage = {
|
|
56
|
+
export type LokiMessage<T extends string = string> = {
|
|
31
57
|
streams: [
|
|
32
58
|
{
|
|
33
|
-
stream: LokiLabels
|
|
59
|
+
stream: LokiLabels<T>;
|
|
34
60
|
values: [string[]];
|
|
35
61
|
}
|
|
36
62
|
];
|
|
37
63
|
};
|
|
64
|
+
/**
|
|
65
|
+
* Cloudflare Workers IncomingRequestCfProperties
|
|
66
|
+
*/
|
|
67
|
+
export type CfProperties = {
|
|
68
|
+
colo?: string;
|
|
69
|
+
country?: string;
|
|
70
|
+
city?: string;
|
|
71
|
+
asn?: number;
|
|
72
|
+
[key: string]: unknown;
|
|
73
|
+
};
|
|
38
74
|
/**
|
|
39
75
|
* Cloudflare Workers ExecutionContext
|
|
40
76
|
*/
|
|
@@ -51,9 +87,9 @@ export type LogMessage = string | object;
|
|
|
51
87
|
*
|
|
52
88
|
* @param config
|
|
53
89
|
*/
|
|
54
|
-
export declare const getLokiLogger: (config
|
|
55
|
-
info: (message: LogMessage, labels?: LokiLabels, ctx?: ExecutionContext) => Promise<void>;
|
|
56
|
-
warn: (message: LogMessage, labels?: LokiLabels, ctx?: ExecutionContext) => Promise<void>;
|
|
57
|
-
error: (message: LogMessage, labels?: LokiLabels, ctx?: ExecutionContext) => Promise<void>;
|
|
58
|
-
debug: (message: LogMessage, labels?: LokiLabels, ctx?: ExecutionContext) => Promise<void>;
|
|
90
|
+
export declare const getLokiLogger: <T extends string = string>(config?: LokiConfig<T>) => {
|
|
91
|
+
info: (message: LogMessage, labels?: LokiLabels<T> | undefined, ctx?: ExecutionContext) => Promise<void>;
|
|
92
|
+
warn: (message: LogMessage, labels?: LokiLabels<T> | undefined, ctx?: ExecutionContext) => Promise<void>;
|
|
93
|
+
error: (message: LogMessage, labels?: LokiLabels<T> | undefined, ctx?: ExecutionContext) => Promise<void>;
|
|
94
|
+
debug: (message: LogMessage, labels?: LokiLabels<T> | undefined, ctx?: ExecutionContext) => Promise<void>;
|
|
59
95
|
};
|
package/dist/logger.js
CHANGED
|
@@ -22,15 +22,37 @@ const LOG_LEVEL_PRIORITY = {
|
|
|
22
22
|
*
|
|
23
23
|
* @param config
|
|
24
24
|
*/
|
|
25
|
-
const getLokiLogger = (config) => {
|
|
25
|
+
const getLokiLogger = (config = {}) => {
|
|
26
|
+
var _a;
|
|
27
|
+
const mergedConfig = Object.assign(Object.assign({}, config), { lokiHost: config.lokiHost ||
|
|
28
|
+
getEnv("LOKI_HOST") ||
|
|
29
|
+
((_a = getEnv("LOKI_URL")) === null || _a === void 0 ? void 0 : _a.replace(/^https?:\/\//, "")), lokiToken: config.lokiToken || getEnv("LOKI_TOKEN"), lokiUser: config.lokiUser || getEnv("LOKI_USER") });
|
|
26
30
|
return {
|
|
27
|
-
info: lokiInfo(
|
|
28
|
-
warn: lokiWarn(
|
|
29
|
-
error: lokiError(
|
|
30
|
-
debug: lokiDebug(
|
|
31
|
+
info: lokiInfo(mergedConfig),
|
|
32
|
+
warn: lokiWarn(mergedConfig),
|
|
33
|
+
error: lokiError(mergedConfig),
|
|
34
|
+
debug: lokiDebug(mergedConfig),
|
|
31
35
|
};
|
|
32
36
|
};
|
|
33
37
|
exports.getLokiLogger = getLokiLogger;
|
|
38
|
+
/**
|
|
39
|
+
* Get environment variable from various sources
|
|
40
|
+
*/
|
|
41
|
+
function getEnv(name) {
|
|
42
|
+
try {
|
|
43
|
+
// Node.js
|
|
44
|
+
if (typeof process !== "undefined" && process.env) {
|
|
45
|
+
return process.env[name];
|
|
46
|
+
}
|
|
47
|
+
// Global
|
|
48
|
+
if (typeof globalThis !== "undefined") {
|
|
49
|
+
const global = globalThis;
|
|
50
|
+
return global[name];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (_e) { }
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
34
56
|
/**
|
|
35
57
|
* Log info to Loki curried
|
|
36
58
|
*
|
|
@@ -80,10 +102,16 @@ function log(config, logLevel, message, labels, ctx) {
|
|
|
80
102
|
}
|
|
81
103
|
const normalizedMessage = typeof message === "string" ? { message } : message;
|
|
82
104
|
console.log(JSON.stringify(normalizedMessage));
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
105
|
+
if (config.silent) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const lokiMessage = config.format
|
|
109
|
+
? config.format(logLevel, normalizedMessage, labels)
|
|
110
|
+
: generateLokiMessage(config, logLevel, normalizedMessage, labels);
|
|
111
|
+
const promise = sendWithRetry(config, lokiMessage);
|
|
112
|
+
const effectiveCtx = ctx || config.ctx;
|
|
113
|
+
if (effectiveCtx) {
|
|
114
|
+
effectiveCtx.waitUntil(promise);
|
|
87
115
|
}
|
|
88
116
|
else {
|
|
89
117
|
yield promise;
|
|
@@ -99,15 +127,54 @@ function log(config, logLevel, message, labels, ctx) {
|
|
|
99
127
|
* @param labels
|
|
100
128
|
*/
|
|
101
129
|
function generateLokiMessage(config, logLevel, message, labels) {
|
|
130
|
+
const cfLabels = {};
|
|
131
|
+
if (config.cf) {
|
|
132
|
+
if (config.cf.colo)
|
|
133
|
+
cfLabels.cf_colo = config.cf.colo;
|
|
134
|
+
if (config.cf.country)
|
|
135
|
+
cfLabels.cf_country = config.cf.country;
|
|
136
|
+
if (config.cf.city)
|
|
137
|
+
cfLabels.cf_city = config.cf.city;
|
|
138
|
+
if (config.cf.asn)
|
|
139
|
+
cfLabels.cf_asn = config.cf.asn.toString();
|
|
140
|
+
}
|
|
102
141
|
return {
|
|
103
142
|
streams: [
|
|
104
143
|
{
|
|
105
|
-
stream: Object.assign(Object.assign({ level: logLevel }, config.defaultLabels), labels),
|
|
144
|
+
stream: Object.assign(Object.assign(Object.assign({ level: logLevel }, config.defaultLabels), cfLabels), labels),
|
|
106
145
|
values: [[`${Date.now().toString()}000000`, JSON.stringify(message)]],
|
|
107
146
|
},
|
|
108
147
|
],
|
|
109
148
|
};
|
|
110
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Send with retry
|
|
152
|
+
*/
|
|
153
|
+
function sendWithRetry(config, lokiMessage) {
|
|
154
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
155
|
+
const retries = config.retries || 0;
|
|
156
|
+
let lastError;
|
|
157
|
+
for (let i = 0; i <= retries; i++) {
|
|
158
|
+
try {
|
|
159
|
+
yield sendToLoki(config, lokiMessage);
|
|
160
|
+
return; // Success
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
lastError = e;
|
|
164
|
+
if (i < retries) {
|
|
165
|
+
// Simple backoff: 100ms, 200ms, 400ms...
|
|
166
|
+
yield new Promise((resolve) => setTimeout(resolve, 100 * 2 ** i));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (config.onSendError) {
|
|
171
|
+
config.onSendError(lastError, lokiMessage);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
console.error("Loki logging failed after retries:", lastError);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
111
178
|
/**
|
|
112
179
|
* Send a message to Loki
|
|
113
180
|
*
|
|
@@ -116,22 +183,20 @@ function generateLokiMessage(config, logLevel, message, labels) {
|
|
|
116
183
|
*/
|
|
117
184
|
function sendToLoki(config, lokiMessage) {
|
|
118
185
|
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
-
|
|
186
|
+
if (!config.lokiHost || !config.lokiUser || !config.lokiToken) {
|
|
187
|
+
throw new Error("Loki configuration missing (host, user, or token)");
|
|
188
|
+
}
|
|
189
|
+
const response = yield fetch(`https://${config.lokiHost}/loki/api/v1/push`, {
|
|
120
190
|
method: "POST",
|
|
121
191
|
headers: {
|
|
122
192
|
"Content-Type": "application/json",
|
|
123
193
|
Authorization: `Basic ${btoa(`${config.lokiUser}:${config.lokiToken}`)}`,
|
|
124
194
|
},
|
|
125
195
|
body: JSON.stringify(lokiMessage),
|
|
126
|
-
})
|
|
127
|
-
.then((r) => {
|
|
128
|
-
if (!r.ok) {
|
|
129
|
-
throw new Error(r.statusText);
|
|
130
|
-
}
|
|
131
|
-
})
|
|
132
|
-
.catch((e) => {
|
|
133
|
-
console.error("Error:", e);
|
|
134
196
|
});
|
|
197
|
+
if (!response.ok) {
|
|
198
|
+
throw new Error(`Loki push failed: ${response.status} ${response.statusText}`);
|
|
199
|
+
}
|
|
135
200
|
});
|
|
136
201
|
}
|
|
137
202
|
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.test.js
CHANGED
|
@@ -76,62 +76,129 @@ Date.now = vitest_1.vi.fn(() => 1482363367071);
|
|
|
76
76
|
},
|
|
77
77
|
body: `{"streams":[{"stream":{"level":"${method}","hoge":"huga"},"values":[["1482363367071000000","{\\"test\\":\\"message\\"}"]]}]}`,
|
|
78
78
|
});
|
|
79
|
-
// Reset the spy
|
|
80
79
|
consoleSpy.mockRestore();
|
|
81
80
|
}));
|
|
82
81
|
});
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
82
|
+
});
|
|
83
|
+
(0, vitest_1.describe)("Advanced Features", () => {
|
|
84
|
+
const mockConfig = {
|
|
85
|
+
lokiHost: "testhost",
|
|
86
|
+
lokiToken: "token123",
|
|
87
|
+
lokiUser: "user",
|
|
88
|
+
};
|
|
89
|
+
(0, vitest_1.beforeEach)(() => {
|
|
90
|
+
vitest_1.vi.clearAllMocks();
|
|
91
|
+
});
|
|
92
|
+
(0, vitest_1.it)("should support zero config from env", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
93
|
+
// Mock environment variables
|
|
94
|
+
process.env.LOKI_HOST = "env-host";
|
|
95
|
+
process.env.LOKI_TOKEN = "env-token";
|
|
96
|
+
process.env.LOKI_USER = "env-user";
|
|
97
|
+
const logger = (0, logger_1.getLokiLogger)();
|
|
98
|
+
yield logger.info({ msg: "test" });
|
|
99
|
+
(0, vitest_1.expect)(fetch).toHaveBeenCalledWith(vitest_1.expect.stringContaining("env-host"), vitest_1.expect.objectContaining({
|
|
100
|
+
headers: vitest_1.expect.objectContaining({
|
|
101
|
+
Authorization: `Basic ${btoa("env-user:env-token")}`,
|
|
102
|
+
}),
|
|
94
103
|
}));
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
// Cleanup
|
|
105
|
+
delete process.env.LOKI_HOST;
|
|
106
|
+
delete process.env.LOKI_TOKEN;
|
|
107
|
+
delete process.env.LOKI_USER;
|
|
108
|
+
}));
|
|
109
|
+
(0, vitest_1.it)("should not send when silent: true", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
110
|
+
const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { silent: true }));
|
|
111
|
+
yield logger.info({ msg: "test" });
|
|
112
|
+
(0, vitest_1.expect)(fetch).not.toHaveBeenCalled();
|
|
113
|
+
}));
|
|
114
|
+
(0, vitest_1.it)("should retry on failure", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
115
|
+
let callCount = 0;
|
|
116
|
+
global.fetch = vitest_1.vi.fn(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
117
|
+
callCount++;
|
|
118
|
+
if (callCount < 3) {
|
|
119
|
+
return { ok: false, status: 500, statusText: "Error" };
|
|
120
|
+
}
|
|
121
|
+
return { ok: true };
|
|
108
122
|
}));
|
|
109
|
-
(0,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
consoleSpy.mockRestore();
|
|
123
|
+
const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { retries: 3 }));
|
|
124
|
+
yield logger.info({ msg: "test" });
|
|
125
|
+
(0, vitest_1.expect)(fetch).toHaveBeenCalledTimes(3);
|
|
126
|
+
}));
|
|
127
|
+
(0, vitest_1.it)("should call onSendError after retries fail", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
128
|
+
global.fetch = vitest_1.vi.fn(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
129
|
+
return ({
|
|
130
|
+
ok: false,
|
|
131
|
+
status: 500,
|
|
132
|
+
statusText: "Fatal",
|
|
133
|
+
});
|
|
121
134
|
}));
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
135
|
+
const onSendError = vitest_1.vi.fn();
|
|
136
|
+
const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { retries: 1, onSendError }));
|
|
137
|
+
yield logger.info({ msg: "test" });
|
|
138
|
+
(0, vitest_1.expect)(fetch).toHaveBeenCalledTimes(2);
|
|
139
|
+
(0, vitest_1.expect)(onSendError).toHaveBeenCalled();
|
|
140
|
+
}));
|
|
141
|
+
(0, vitest_1.it)("should support custom format", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
142
|
+
const format = vitest_1.vi.fn((_level, _msg, _labels) => ({
|
|
143
|
+
streams: [
|
|
144
|
+
{
|
|
145
|
+
stream: { custom: "label" },
|
|
146
|
+
values: [["123456", "custom-body"]],
|
|
147
|
+
},
|
|
148
|
+
],
|
|
134
149
|
}));
|
|
135
|
-
|
|
150
|
+
const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { format: format }));
|
|
151
|
+
yield logger.info({ msg: "test" });
|
|
152
|
+
const fetchMock = fetch;
|
|
153
|
+
const _body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
154
|
+
(0, vitest_1.expect)(format).toHaveBeenCalled();
|
|
155
|
+
(0, vitest_1.expect)(fetch).toHaveBeenCalledWith(vitest_1.expect.any(String), vitest_1.expect.objectContaining({
|
|
156
|
+
body: vitest_1.expect.stringContaining("custom-body"),
|
|
157
|
+
}));
|
|
158
|
+
}));
|
|
159
|
+
(0, vitest_1.it)("should add labels from cf properties", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
160
|
+
const cf = {
|
|
161
|
+
colo: "KIX",
|
|
162
|
+
country: "JP",
|
|
163
|
+
city: "Osaka",
|
|
164
|
+
asn: 12345,
|
|
165
|
+
};
|
|
166
|
+
const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { cf }));
|
|
167
|
+
yield logger.info({ msg: "test" });
|
|
168
|
+
const fetchMock = fetch;
|
|
169
|
+
const body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
170
|
+
const stream = body.streams[0].stream;
|
|
171
|
+
(0, vitest_1.expect)(stream.cf_colo).toBe("KIX");
|
|
172
|
+
(0, vitest_1.expect)(stream.cf_country).toBe("JP");
|
|
173
|
+
(0, vitest_1.expect)(stream.cf_city).toBe("Osaka");
|
|
174
|
+
(0, vitest_1.expect)(stream.cf_asn).toBe("12345");
|
|
175
|
+
}));
|
|
176
|
+
});
|
|
177
|
+
(0, vitest_1.describe)("Cloudflare Workers context", () => {
|
|
178
|
+
const mockConfig = {
|
|
179
|
+
lokiHost: "testhost",
|
|
180
|
+
lokiToken: "token123",
|
|
181
|
+
lokiUser: "user",
|
|
182
|
+
};
|
|
183
|
+
(0, vitest_1.it)("should use ctx from getLokiLogger", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
184
|
+
const ctx = {
|
|
185
|
+
waitUntil: vitest_1.vi.fn(),
|
|
186
|
+
};
|
|
187
|
+
const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { ctx }));
|
|
188
|
+
yield logger.info("test");
|
|
189
|
+
(0, vitest_1.expect)(ctx.waitUntil).toHaveBeenCalled();
|
|
190
|
+
}));
|
|
191
|
+
(0, vitest_1.it)("should use ctx from method call even if getLokiLogger has one", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
192
|
+
const ctx1 = {
|
|
193
|
+
waitUntil: vitest_1.vi.fn(),
|
|
194
|
+
};
|
|
195
|
+
const ctx2 = {
|
|
196
|
+
waitUntil: vitest_1.vi.fn(),
|
|
197
|
+
};
|
|
198
|
+
const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { ctx: ctx1 }));
|
|
199
|
+
yield logger.info("test", {}, ctx2);
|
|
200
|
+
(0, vitest_1.expect)(ctx2.waitUntil).toHaveBeenCalled();
|
|
201
|
+
(0, vitest_1.expect)(ctx1.waitUntil).not.toHaveBeenCalled();
|
|
202
|
+
}));
|
|
136
203
|
});
|
|
137
204
|
//# sourceMappingURL=logger.test.js.map
|
package/dist/logger.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../src/logger.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mCAA8D;AAC9D,
|
|
1
|
+
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../src/logger.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miketako3/cloki",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.21",
|
|
4
4
|
"description": "cloki is zero dependency and simple logger library for Loki and Cloudflare Workers.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"build": "tsc",
|
|
14
14
|
"format": "bunx @biomejs/biome check . --write",
|
|
15
15
|
"lint": "bunx @biomejs/biome check .",
|
|
16
|
-
"test": "vitest run"
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"typecheck": "tsc --noEmit"
|
|
17
18
|
},
|
|
18
19
|
"repository": {
|
|
19
20
|
"type": "git",
|