@miketako3/cloki 0.1.19 → 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/LICENSE +1 -1
- package/README.md +107 -0
- package/dist/logger.d.ts +70 -12
- package/dist/logger.js +112 -28
- package/dist/logger.js.map +1 -1
- package/dist/logger.test.js +121 -1
- package/dist/logger.test.js.map +1 -1
- package/package.json +3 -2
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -51,6 +51,113 @@ await logger.error({message: "Hello World!", error: error});
|
|
|
51
51
|
await logger.info({message: "Hello World!"}, {foo: "bar"});
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
### Advanced Usage
|
|
55
|
+
|
|
56
|
+
#### 1. Default Labels and Minimum Log Level
|
|
57
|
+
|
|
58
|
+
You can set default labels that will be added to every log, and specify a minimum log level.
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
const logger = getLokiLogger({
|
|
62
|
+
lokiHost: "...",
|
|
63
|
+
lokiUser: "...",
|
|
64
|
+
lokiToken: "...",
|
|
65
|
+
defaultLabels: { env: "production", app: "my-service" },
|
|
66
|
+
minLevel: "info" // 'debug' | 'info' | 'warn' | 'error'
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### 2. String Messages
|
|
71
|
+
|
|
72
|
+
You can pass a string directly as a message. It will be converted to `{"message": "your string"}`.
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
await logger.info("Hello World!");
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
#### 3. Cloudflare Workers `ctx.waitUntil` and `cf` properties
|
|
79
|
+
|
|
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
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
export default {
|
|
84
|
+
async fetch(request, env, ctx) {
|
|
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
|
+
});
|
|
89
|
+
|
|
90
|
+
// This will use ctx.waitUntil internally and won't block the response
|
|
91
|
+
logger.info("Request received", { path: new URL(request.url).pathname });
|
|
92
|
+
|
|
93
|
+
return new Response("OK");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
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
|
+
|
|
54
161
|
## Contributing
|
|
55
162
|
|
|
56
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,37 +1,95 @@
|
|
|
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
|
+
/**
|
|
9
|
+
* Default labels added to all logs
|
|
10
|
+
*/
|
|
11
|
+
defaultLabels?: LokiLabels<T>;
|
|
12
|
+
/**
|
|
13
|
+
* Minimum log level to send to Loki
|
|
14
|
+
*/
|
|
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;
|
|
8
40
|
};
|
|
41
|
+
/**
|
|
42
|
+
* Log levels
|
|
43
|
+
*/
|
|
44
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
9
45
|
/**
|
|
10
46
|
* Loki labels
|
|
11
47
|
*/
|
|
12
|
-
export type LokiLabels = {
|
|
48
|
+
export type LokiLabels<T extends string = string> = {
|
|
49
|
+
[key in T]?: string;
|
|
50
|
+
} & {
|
|
13
51
|
[key: string]: string;
|
|
14
52
|
};
|
|
15
53
|
/**
|
|
16
54
|
* Loki message
|
|
17
55
|
*/
|
|
18
|
-
export type LokiMessage = {
|
|
56
|
+
export type LokiMessage<T extends string = string> = {
|
|
19
57
|
streams: [
|
|
20
58
|
{
|
|
21
|
-
stream: LokiLabels
|
|
59
|
+
stream: LokiLabels<T>;
|
|
22
60
|
values: [string[]];
|
|
23
61
|
}
|
|
24
62
|
];
|
|
25
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
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Cloudflare Workers ExecutionContext
|
|
76
|
+
*/
|
|
77
|
+
export type ExecutionContext = {
|
|
78
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Log message type
|
|
82
|
+
*/
|
|
83
|
+
export type LogMessage = string | object;
|
|
26
84
|
/**
|
|
27
85
|
* Create a Loki logger
|
|
28
86
|
* logger has some async logging methods like info, error, warn, etc.
|
|
29
87
|
*
|
|
30
88
|
* @param config
|
|
31
89
|
*/
|
|
32
|
-
export declare const getLokiLogger: (config
|
|
33
|
-
info: (message:
|
|
34
|
-
warn: (message:
|
|
35
|
-
error: (message:
|
|
36
|
-
debug: (message:
|
|
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>;
|
|
37
95
|
};
|
package/dist/logger.js
CHANGED
|
@@ -10,52 +10,80 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.getLokiLogger = void 0;
|
|
13
|
+
const LOG_LEVEL_PRIORITY = {
|
|
14
|
+
debug: 0,
|
|
15
|
+
info: 1,
|
|
16
|
+
warn: 2,
|
|
17
|
+
error: 3,
|
|
18
|
+
};
|
|
13
19
|
/**
|
|
14
20
|
* Create a Loki logger
|
|
15
21
|
* logger has some async logging methods like info, error, warn, etc.
|
|
16
22
|
*
|
|
17
23
|
* @param config
|
|
18
24
|
*/
|
|
19
|
-
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") });
|
|
20
30
|
return {
|
|
21
|
-
info: lokiInfo(
|
|
22
|
-
warn: lokiWarn(
|
|
23
|
-
error: lokiError(
|
|
24
|
-
debug: lokiDebug(
|
|
31
|
+
info: lokiInfo(mergedConfig),
|
|
32
|
+
warn: lokiWarn(mergedConfig),
|
|
33
|
+
error: lokiError(mergedConfig),
|
|
34
|
+
debug: lokiDebug(mergedConfig),
|
|
25
35
|
};
|
|
26
36
|
};
|
|
27
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
|
+
}
|
|
28
56
|
/**
|
|
29
57
|
* Log info to Loki curried
|
|
30
58
|
*
|
|
31
59
|
* @param config
|
|
32
60
|
*/
|
|
33
|
-
const lokiInfo = (config) => (message, labels = {}) => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
-
yield log(config, "info", message, labels);
|
|
61
|
+
const lokiInfo = (config) => (message, labels = {}, ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
62
|
+
yield log(config, "info", message, labels, ctx);
|
|
35
63
|
});
|
|
36
64
|
/**
|
|
37
65
|
* Log warn to Loki curried
|
|
38
66
|
*
|
|
39
67
|
* @param config
|
|
40
68
|
*/
|
|
41
|
-
const lokiWarn = (config) => (message, labels = {}) => __awaiter(void 0, void 0, void 0, function* () {
|
|
42
|
-
yield log(config, "warn", message, labels);
|
|
69
|
+
const lokiWarn = (config) => (message, labels = {}, ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
70
|
+
yield log(config, "warn", message, labels, ctx);
|
|
43
71
|
});
|
|
44
72
|
/**
|
|
45
73
|
* Log error to Loki curried
|
|
46
74
|
*
|
|
47
75
|
* @param config
|
|
48
76
|
*/
|
|
49
|
-
const lokiError = (config) => (message, labels = {}) => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
-
yield log(config, "error", message, labels);
|
|
77
|
+
const lokiError = (config) => (message, labels = {}, ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
78
|
+
yield log(config, "error", message, labels, ctx);
|
|
51
79
|
});
|
|
52
80
|
/**
|
|
53
81
|
* Log debug to Loki curried
|
|
54
82
|
*
|
|
55
83
|
* @param config
|
|
56
84
|
*/
|
|
57
|
-
const lokiDebug = (config) => (message, labels = {}) => __awaiter(void 0, void 0, void 0, function* () {
|
|
58
|
-
yield log(config, "debug", message, labels);
|
|
85
|
+
const lokiDebug = (config) => (message, labels = {}, ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
86
|
+
yield log(config, "debug", message, labels, ctx);
|
|
59
87
|
});
|
|
60
88
|
/**
|
|
61
89
|
* Log to Loki
|
|
@@ -64,31 +92,89 @@ const lokiDebug = (config) => (message, labels = {}) => __awaiter(void 0, void 0
|
|
|
64
92
|
* @param logLevel
|
|
65
93
|
* @param message
|
|
66
94
|
* @param labels
|
|
95
|
+
* @param ctx
|
|
67
96
|
*/
|
|
68
|
-
function log(config, logLevel, message, labels) {
|
|
97
|
+
function log(config, logLevel, message, labels, ctx) {
|
|
69
98
|
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
99
|
+
const minLevel = config.minLevel || "debug";
|
|
100
|
+
if (LOG_LEVEL_PRIORITY[logLevel] < LOG_LEVEL_PRIORITY[minLevel]) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const normalizedMessage = typeof message === "string" ? { message } : message;
|
|
104
|
+
console.log(JSON.stringify(normalizedMessage));
|
|
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);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
yield promise;
|
|
118
|
+
}
|
|
73
119
|
});
|
|
74
120
|
}
|
|
75
121
|
/**
|
|
76
122
|
* Generate a Loki message object
|
|
77
123
|
*
|
|
124
|
+
* @param config
|
|
78
125
|
* @param logLevel
|
|
79
126
|
* @param message
|
|
80
127
|
* @param labels
|
|
81
128
|
*/
|
|
82
|
-
function generateLokiMessage(logLevel, message, labels) {
|
|
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
|
+
}
|
|
83
141
|
return {
|
|
84
142
|
streams: [
|
|
85
143
|
{
|
|
86
|
-
stream: Object.assign({ level: logLevel }, labels),
|
|
144
|
+
stream: Object.assign(Object.assign(Object.assign({ level: logLevel }, config.defaultLabels), cfLabels), labels),
|
|
87
145
|
values: [[`${Date.now().toString()}000000`, JSON.stringify(message)]],
|
|
88
146
|
},
|
|
89
147
|
],
|
|
90
148
|
};
|
|
91
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
|
+
}
|
|
92
178
|
/**
|
|
93
179
|
* Send a message to Loki
|
|
94
180
|
*
|
|
@@ -97,22 +183,20 @@ function generateLokiMessage(logLevel, message, labels) {
|
|
|
97
183
|
*/
|
|
98
184
|
function sendToLoki(config, lokiMessage) {
|
|
99
185
|
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
|
|
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`, {
|
|
101
190
|
method: "POST",
|
|
102
191
|
headers: {
|
|
103
192
|
"Content-Type": "application/json",
|
|
104
193
|
Authorization: `Basic ${btoa(`${config.lokiUser}:${config.lokiToken}`)}`,
|
|
105
194
|
},
|
|
106
195
|
body: JSON.stringify(lokiMessage),
|
|
107
|
-
})
|
|
108
|
-
.then((r) => {
|
|
109
|
-
if (!r.ok) {
|
|
110
|
-
throw new Error(r.statusText);
|
|
111
|
-
}
|
|
112
|
-
})
|
|
113
|
-
.catch((e) => {
|
|
114
|
-
console.error("Error:", e);
|
|
115
196
|
});
|
|
197
|
+
if (!response.ok) {
|
|
198
|
+
throw new Error(`Loki push failed: ${response.status} ${response.statusText}`);
|
|
199
|
+
}
|
|
116
200
|
});
|
|
117
201
|
}
|
|
118
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,9 +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
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
|
+
}),
|
|
103
|
+
}));
|
|
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 };
|
|
122
|
+
}));
|
|
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
|
+
});
|
|
134
|
+
}));
|
|
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
|
+
],
|
|
149
|
+
}));
|
|
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
|
+
}));
|
|
203
|
+
});
|
|
84
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",
|