@loglayer/transport-axiom 1.0.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/LICENSE +21 -0
- package/README.md +45 -0
- package/dist/index.cjs +193 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +120 -0
- package/dist/index.d.ts +120 -0
- package/dist/index.js +193 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Theo Gravity
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Axiom Transport for LogLayer
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@loglayer/transport-axiom)
|
|
4
|
+
[](https://www.npmjs.com/package/@loglayer/transport-axiom)
|
|
5
|
+
[](http://www.typescriptlang.org/)
|
|
6
|
+
|
|
7
|
+
A transport for sending logs to [Axiom.co](https://axiom.co) with the [LogLayer](https://loglayer.dev) logging library.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @loglayer/transport-axiom @axiomhq/js serialize-error
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { LogLayer } from 'loglayer';
|
|
19
|
+
import { serializeError } from 'serialize-error';
|
|
20
|
+
import { AxiomTransport } from '@loglayer/transport-axiom';
|
|
21
|
+
import { Axiom } from '@axiomhq/js';
|
|
22
|
+
|
|
23
|
+
// Create the Axiom client
|
|
24
|
+
const axiom = new Axiom({
|
|
25
|
+
token: process.env.AXIOM_TOKEN,
|
|
26
|
+
// Optional: other Axiom client options
|
|
27
|
+
// orgId: 'your-org-id',
|
|
28
|
+
// url: 'https://cloud.axiom.co',
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Create the LogLayer instance with AxiomTransport
|
|
32
|
+
const logger = new LogLayer({
|
|
33
|
+
errorSerializer: serializeError,
|
|
34
|
+
transport: new AxiomTransport({
|
|
35
|
+
logger: axiom,
|
|
36
|
+
dataset: 'your-dataset',
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
logger.info('Hello world');
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Documentation
|
|
44
|
+
|
|
45
|
+
For configuration options and examples, visit [https://loglayer.dev/transports/axiom](https://loglayer.dev/transports/axiom)
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;// src/AxiomTransport.ts
|
|
2
|
+
var _transport = require('@loglayer/transport');
|
|
3
|
+
|
|
4
|
+
var AxiomTransport = (_class = class extends _transport.BaseTransport {
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
__init() {this.exitHandlers = []}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
constructor(config) {
|
|
15
|
+
super(config);_class.prototype.__init.call(this);;
|
|
16
|
+
this.dataset = config.dataset;
|
|
17
|
+
this.fieldNames = {
|
|
18
|
+
level: _nullishCoalesce(_optionalChain([config, 'access', _ => _.fieldNames, 'optionalAccess', _2 => _2.level]), () => ( "level")),
|
|
19
|
+
message: _nullishCoalesce(_optionalChain([config, 'access', _3 => _3.fieldNames, 'optionalAccess', _4 => _4.message]), () => ( "message")),
|
|
20
|
+
timestamp: _nullishCoalesce(_optionalChain([config, 'access', _5 => _5.fieldNames, 'optionalAccess', _6 => _6.timestamp]), () => ( "timestamp"))
|
|
21
|
+
};
|
|
22
|
+
this.timestampFn = config.timestampFn;
|
|
23
|
+
this.onError = config.onError;
|
|
24
|
+
this.isDisposing = false;
|
|
25
|
+
this.isFlushing = false;
|
|
26
|
+
this.levelMap = config.levelMap;
|
|
27
|
+
this.level = config.level;
|
|
28
|
+
this.setupExitHandlers();
|
|
29
|
+
}
|
|
30
|
+
setupExitHandlers() {
|
|
31
|
+
const beforeExitHandler = async () => {
|
|
32
|
+
if (!this.isDisposing && !this.isFlushing) {
|
|
33
|
+
try {
|
|
34
|
+
await this.flush();
|
|
35
|
+
} catch (error) {
|
|
36
|
+
if (this.onError) {
|
|
37
|
+
this.onError(error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
process.on("beforeExit", beforeExitHandler);
|
|
43
|
+
this.exitHandlers.push(() => process.off("beforeExit", beforeExitHandler));
|
|
44
|
+
const sigintHandler = () => {
|
|
45
|
+
if (!this.isDisposing && !this.isFlushing) {
|
|
46
|
+
try {
|
|
47
|
+
this.flushSync();
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (this.onError) {
|
|
50
|
+
this.onError(error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
process.exit(130);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
process.on("SIGINT", sigintHandler);
|
|
57
|
+
this.exitHandlers.push(() => process.off("SIGINT", sigintHandler));
|
|
58
|
+
const sigtermHandler = () => {
|
|
59
|
+
if (!this.isDisposing && !this.isFlushing) {
|
|
60
|
+
try {
|
|
61
|
+
this.flushSync();
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (this.onError) {
|
|
64
|
+
this.onError(error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
process.exit(143);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
process.on("SIGTERM", sigtermHandler);
|
|
71
|
+
this.exitHandlers.push(() => process.off("SIGTERM", sigtermHandler));
|
|
72
|
+
const exitHandler = () => {
|
|
73
|
+
if (!this.isDisposing && !this.isFlushing) {
|
|
74
|
+
this.isFlushing = true;
|
|
75
|
+
try {
|
|
76
|
+
this.flushSync();
|
|
77
|
+
} catch (error) {
|
|
78
|
+
if (this.onError) {
|
|
79
|
+
this.onError(error);
|
|
80
|
+
}
|
|
81
|
+
} finally {
|
|
82
|
+
this.isFlushing = false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
process.on("exit", exitHandler);
|
|
87
|
+
this.exitHandlers.push(() => process.off("exit", exitHandler));
|
|
88
|
+
}
|
|
89
|
+
shipToLogger({ logLevel, messages, data, hasData }) {
|
|
90
|
+
if (this.isDisposing) {
|
|
91
|
+
return messages;
|
|
92
|
+
}
|
|
93
|
+
if (this.level && _transport.LogLevelPriority[logLevel] < _transport.LogLevelPriority[this.level]) {
|
|
94
|
+
return messages;
|
|
95
|
+
}
|
|
96
|
+
const message = messages.join(" ");
|
|
97
|
+
const mappedLevel = _nullishCoalesce(_optionalChain([this, 'access', _7 => _7.levelMap, 'optionalAccess', _8 => _8[logLevel]]), () => ( logLevel));
|
|
98
|
+
const logEntry = {
|
|
99
|
+
[this.fieldNames.message]: message,
|
|
100
|
+
[this.fieldNames.level]: mappedLevel,
|
|
101
|
+
[this.fieldNames.timestamp]: this.timestampFn ? this.timestampFn() : (/* @__PURE__ */ new Date()).toISOString()
|
|
102
|
+
};
|
|
103
|
+
if (data && hasData) {
|
|
104
|
+
Object.assign(logEntry, data);
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
this.logger.ingest(this.dataset, [logEntry]);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
if (this.onError) {
|
|
110
|
+
this.onError(error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return messages;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Manually flush logs to Axiom.
|
|
117
|
+
* This is automatically called on process exit.
|
|
118
|
+
*/
|
|
119
|
+
async flush() {
|
|
120
|
+
if (this.isFlushing || this.isDisposing) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.isFlushing = true;
|
|
124
|
+
try {
|
|
125
|
+
await this.logger.flush();
|
|
126
|
+
} catch (error) {
|
|
127
|
+
if (this.onError) {
|
|
128
|
+
this.onError(error);
|
|
129
|
+
}
|
|
130
|
+
} finally {
|
|
131
|
+
this.isFlushing = false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Synchronously flush logs to Axiom.
|
|
136
|
+
* This is used during process termination (SIGINT/SIGTERM) to ensure logs are written
|
|
137
|
+
* before the process exits.
|
|
138
|
+
* @private
|
|
139
|
+
*/
|
|
140
|
+
flushSync() {
|
|
141
|
+
if (this.isFlushing || this.isDisposing) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
this.isFlushing = true;
|
|
145
|
+
try {
|
|
146
|
+
Promise.resolve(this.logger.flush()).catch((error) => {
|
|
147
|
+
if (this.onError) {
|
|
148
|
+
this.onError(error);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
} catch (error) {
|
|
152
|
+
if (this.onError) {
|
|
153
|
+
this.onError(error);
|
|
154
|
+
}
|
|
155
|
+
} finally {
|
|
156
|
+
this.isFlushing = false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Clean up resources and remove event listeners.
|
|
161
|
+
* This method:
|
|
162
|
+
* 1. Prevents new operations from starting
|
|
163
|
+
* 2. Flushes any pending logs
|
|
164
|
+
* 3. Removes event handlers
|
|
165
|
+
* 4. Waits for any in-progress operations to complete
|
|
166
|
+
*/
|
|
167
|
+
[Symbol.dispose]() {
|
|
168
|
+
if (this.isDisposing) {
|
|
169
|
+
return Promise.resolve();
|
|
170
|
+
}
|
|
171
|
+
this.isDisposing = true;
|
|
172
|
+
for (const cleanup of this.exitHandlers) {
|
|
173
|
+
cleanup();
|
|
174
|
+
}
|
|
175
|
+
this.exitHandlers = [];
|
|
176
|
+
const checkAndFinish = async () => {
|
|
177
|
+
if (!this.isFlushing) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
181
|
+
return checkAndFinish();
|
|
182
|
+
};
|
|
183
|
+
return this.flush().then(() => checkAndFinish()).catch((error) => {
|
|
184
|
+
if (this.onError) {
|
|
185
|
+
this.onError(error);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}, _class);
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
exports.AxiomTransport = AxiomTransport;
|
|
193
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/loglayer/loglayer/packages/transports/axiom/dist/index.cjs","../src/AxiomTransport.ts"],"names":[],"mappings":"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","file":"/home/runner/work/loglayer/loglayer/packages/transports/axiom/dist/index.cjs","sourcesContent":[null,"import type { Axiom } from \"@axiomhq/js\";\nimport type { LogLayerTransportParams, LogLevel } from \"@loglayer/transport\";\nimport { BaseTransport } from \"@loglayer/transport\";\nimport type { LogLayerTransportConfig } from \"@loglayer/transport\";\nimport { LogLevelPriority } from \"@loglayer/transport\";\n\nexport interface AxiomFieldNames {\n /**\n * Field name for the log level\n * @default \"level\"\n */\n level?: string;\n /**\n * Field name for the log message\n * @default \"message\"\n */\n message?: string;\n /**\n * Field name for the timestamp\n * @default \"timestamp\"\n */\n timestamp?: string;\n}\n\nexport interface AxiomLevelMap {\n /**\n * Mapping for the 'fatal' log level\n * @example 60 or \"FATAL\"\n */\n fatal?: string | number;\n /**\n * Mapping for the 'error' log level\n * @example 50 or \"ERROR\"\n */\n error?: string | number;\n /**\n * Mapping for the 'warn' log level\n * @example 40 or \"WARN\"\n */\n warn?: string | number;\n /**\n * Mapping for the 'info' log level\n * @example 30 or \"INFO\"\n */\n info?: string | number;\n /**\n * Mapping for the 'debug' log level\n * @example 20 or \"DEBUG\"\n */\n debug?: string | number;\n /**\n * Mapping for the 'trace' log level\n * @example 10 or \"TRACE\"\n */\n trace?: string | number;\n}\n\nexport interface AxiomTransportConfig extends LogLayerTransportConfig<Axiom> {\n /**\n * The Axiom dataset name to send logs to\n */\n dataset: string;\n\n /**\n * Custom field names for the log entry JSON\n * Default: { level: \"level\", message: \"message\", timestamp: \"timestamp\" }\n */\n fieldNames?: AxiomFieldNames;\n\n /**\n * Optional function to generate timestamps.\n * If not provided, defaults to ISO string from new Date()\n */\n timestampFn?: () => string | number;\n\n /**\n * Optional callback for error handling\n */\n onError?: (error: Error) => void;\n\n /**\n * Custom mapping for log levels.\n * Each log level can be mapped to either a string or number.\n * Example: { error: 50, warn: 40, info: 30, debug: 20, trace: 10, fatal: 60 }\n * Example: { error: \"ERROR\", warn: \"WARN\", info: \"INFO\", debug: \"DEBUG\", trace: \"TRACE\", fatal: \"FATAL\" }\n */\n levelMap?: AxiomLevelMap;\n\n /**\n * Minimum log level to process. Defaults to \"trace\".\n */\n level?: LogLevel | \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n}\n\nexport class AxiomTransport extends BaseTransport<Axiom> implements Disposable {\n private dataset: string;\n private fieldNames: Required<AxiomFieldNames>;\n private timestampFn?: () => string | number;\n private onError?: (error: Error) => void;\n private exitHandlers: Array<() => void> = [];\n private isDisposing: boolean;\n private isFlushing: boolean;\n private levelMap?: AxiomLevelMap;\n private level?: LogLevel | \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\n constructor(config: AxiomTransportConfig) {\n super(config);\n this.dataset = config.dataset;\n this.fieldNames = {\n level: config.fieldNames?.level ?? \"level\",\n message: config.fieldNames?.message ?? \"message\",\n timestamp: config.fieldNames?.timestamp ?? \"timestamp\",\n };\n this.timestampFn = config.timestampFn;\n this.onError = config.onError;\n this.isDisposing = false;\n this.isFlushing = false;\n this.levelMap = config.levelMap;\n this.level = config.level;\n\n this.setupExitHandlers();\n }\n\n private setupExitHandlers() {\n // Handle graceful shutdowns (allows async operations)\n const beforeExitHandler = async () => {\n if (!this.isDisposing && !this.isFlushing) {\n try {\n await this.flush();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n }\n }\n };\n process.on(\"beforeExit\", beforeExitHandler);\n this.exitHandlers.push(() => process.off(\"beforeExit\", beforeExitHandler));\n\n // Handle SIGINT (Ctrl+C)\n const sigintHandler = () => {\n if (!this.isDisposing && !this.isFlushing) {\n // Synchronously flush logs to ensure they're written before exit\n try {\n this.flushSync();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n }\n process.exit(130); // 128 + SIGINT(2)\n }\n };\n process.on(\"SIGINT\", sigintHandler);\n this.exitHandlers.push(() => process.off(\"SIGINT\", sigintHandler));\n\n // Handle SIGTERM\n const sigtermHandler = () => {\n if (!this.isDisposing && !this.isFlushing) {\n // Synchronously flush logs to ensure they're written before exit\n try {\n this.flushSync();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n }\n process.exit(143); // 128 + SIGTERM(15)\n }\n };\n process.on(\"SIGTERM\", sigtermHandler);\n this.exitHandlers.push(() => process.off(\"SIGTERM\", sigtermHandler));\n\n // Handle exit (must be synchronous)\n const exitHandler = () => {\n if (!this.isDisposing && !this.isFlushing) {\n this.isFlushing = true;\n try {\n // Call flush synchronously since we're in the exit handler\n this.flushSync();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n };\n process.on(\"exit\", exitHandler);\n this.exitHandlers.push(() => process.off(\"exit\", exitHandler));\n }\n\n shipToLogger({ logLevel, messages, data, hasData }: LogLayerTransportParams): any[] {\n // Don't accept new logs if we're disposing\n if (this.isDisposing) {\n return messages;\n }\n\n // Skip if log level is lower priority than configured minimum\n if (this.level && LogLevelPriority[logLevel] < LogLevelPriority[this.level]) {\n return messages;\n }\n\n // Combine all messages into a single string\n const message = messages.join(\" \");\n\n // Map the log level if a mapping exists\n const mappedLevel = this.levelMap?.[logLevel] ?? logLevel;\n\n // Create the log entry\n const logEntry: Record<string, any> = {\n [this.fieldNames.message]: message,\n [this.fieldNames.level]: mappedLevel,\n [this.fieldNames.timestamp]: this.timestampFn ? this.timestampFn() : new Date().toISOString(),\n };\n\n // Add any additional data\n if (data && hasData) {\n Object.assign(logEntry, data);\n }\n\n // Send to Axiom\n try {\n this.logger.ingest(this.dataset, [logEntry]);\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n }\n\n return messages;\n }\n\n /**\n * Manually flush logs to Axiom.\n * This is automatically called on process exit.\n */\n private async flush(): Promise<void> {\n if (this.isFlushing || this.isDisposing) {\n return;\n }\n\n this.isFlushing = true;\n\n try {\n await this.logger.flush();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Synchronously flush logs to Axiom.\n * This is used during process termination (SIGINT/SIGTERM) to ensure logs are written\n * before the process exits.\n * @private\n */\n private flushSync(): void {\n if (this.isFlushing || this.isDisposing) {\n return;\n }\n\n this.isFlushing = true;\n try {\n // Call flush synchronously and handle the promise immediately\n Promise.resolve(this.logger.flush()).catch((error) => {\n if (this.onError) {\n this.onError(error as Error);\n }\n });\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Clean up resources and remove event listeners.\n * This method:\n * 1. Prevents new operations from starting\n * 2. Flushes any pending logs\n * 3. Removes event handlers\n * 4. Waits for any in-progress operations to complete\n */\n [Symbol.dispose](): Promise<void> {\n if (this.isDisposing) {\n return Promise.resolve();\n }\n\n this.isDisposing = true;\n\n // Remove all event listeners\n for (const cleanup of this.exitHandlers) {\n cleanup();\n }\n this.exitHandlers = [];\n\n const checkAndFinish = async () => {\n if (!this.isFlushing) {\n return;\n }\n // Wait a bit and check again if still flushing\n await new Promise((resolve) => setTimeout(resolve, 100));\n return checkAndFinish();\n };\n\n // Flush any remaining logs and wait for completion\n return this.flush()\n .then(() => checkAndFinish())\n .catch((error) => {\n if (this.onError) {\n this.onError(error as Error);\n }\n });\n }\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Axiom } from '@axiomhq/js';
|
|
2
|
+
import { LogLayerTransportConfig, LogLevel, BaseTransport, LogLayerTransportParams } from '@loglayer/transport';
|
|
3
|
+
|
|
4
|
+
interface AxiomFieldNames {
|
|
5
|
+
/**
|
|
6
|
+
* Field name for the log level
|
|
7
|
+
* @default "level"
|
|
8
|
+
*/
|
|
9
|
+
level?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Field name for the log message
|
|
12
|
+
* @default "message"
|
|
13
|
+
*/
|
|
14
|
+
message?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Field name for the timestamp
|
|
17
|
+
* @default "timestamp"
|
|
18
|
+
*/
|
|
19
|
+
timestamp?: string;
|
|
20
|
+
}
|
|
21
|
+
interface AxiomLevelMap {
|
|
22
|
+
/**
|
|
23
|
+
* Mapping for the 'fatal' log level
|
|
24
|
+
* @example 60 or "FATAL"
|
|
25
|
+
*/
|
|
26
|
+
fatal?: string | number;
|
|
27
|
+
/**
|
|
28
|
+
* Mapping for the 'error' log level
|
|
29
|
+
* @example 50 or "ERROR"
|
|
30
|
+
*/
|
|
31
|
+
error?: string | number;
|
|
32
|
+
/**
|
|
33
|
+
* Mapping for the 'warn' log level
|
|
34
|
+
* @example 40 or "WARN"
|
|
35
|
+
*/
|
|
36
|
+
warn?: string | number;
|
|
37
|
+
/**
|
|
38
|
+
* Mapping for the 'info' log level
|
|
39
|
+
* @example 30 or "INFO"
|
|
40
|
+
*/
|
|
41
|
+
info?: string | number;
|
|
42
|
+
/**
|
|
43
|
+
* Mapping for the 'debug' log level
|
|
44
|
+
* @example 20 or "DEBUG"
|
|
45
|
+
*/
|
|
46
|
+
debug?: string | number;
|
|
47
|
+
/**
|
|
48
|
+
* Mapping for the 'trace' log level
|
|
49
|
+
* @example 10 or "TRACE"
|
|
50
|
+
*/
|
|
51
|
+
trace?: string | number;
|
|
52
|
+
}
|
|
53
|
+
interface AxiomTransportConfig extends LogLayerTransportConfig<Axiom> {
|
|
54
|
+
/**
|
|
55
|
+
* The Axiom dataset name to send logs to
|
|
56
|
+
*/
|
|
57
|
+
dataset: string;
|
|
58
|
+
/**
|
|
59
|
+
* Custom field names for the log entry JSON
|
|
60
|
+
* Default: { level: "level", message: "message", timestamp: "timestamp" }
|
|
61
|
+
*/
|
|
62
|
+
fieldNames?: AxiomFieldNames;
|
|
63
|
+
/**
|
|
64
|
+
* Optional function to generate timestamps.
|
|
65
|
+
* If not provided, defaults to ISO string from new Date()
|
|
66
|
+
*/
|
|
67
|
+
timestampFn?: () => string | number;
|
|
68
|
+
/**
|
|
69
|
+
* Optional callback for error handling
|
|
70
|
+
*/
|
|
71
|
+
onError?: (error: Error) => void;
|
|
72
|
+
/**
|
|
73
|
+
* Custom mapping for log levels.
|
|
74
|
+
* Each log level can be mapped to either a string or number.
|
|
75
|
+
* Example: { error: 50, warn: 40, info: 30, debug: 20, trace: 10, fatal: 60 }
|
|
76
|
+
* Example: { error: "ERROR", warn: "WARN", info: "INFO", debug: "DEBUG", trace: "TRACE", fatal: "FATAL" }
|
|
77
|
+
*/
|
|
78
|
+
levelMap?: AxiomLevelMap;
|
|
79
|
+
/**
|
|
80
|
+
* Minimum log level to process. Defaults to "trace".
|
|
81
|
+
*/
|
|
82
|
+
level?: LogLevel | "trace" | "debug" | "info" | "warn" | "error" | "fatal";
|
|
83
|
+
}
|
|
84
|
+
declare class AxiomTransport extends BaseTransport<Axiom> implements Disposable {
|
|
85
|
+
private dataset;
|
|
86
|
+
private fieldNames;
|
|
87
|
+
private timestampFn?;
|
|
88
|
+
private onError?;
|
|
89
|
+
private exitHandlers;
|
|
90
|
+
private isDisposing;
|
|
91
|
+
private isFlushing;
|
|
92
|
+
private levelMap?;
|
|
93
|
+
private level?;
|
|
94
|
+
constructor(config: AxiomTransportConfig);
|
|
95
|
+
private setupExitHandlers;
|
|
96
|
+
shipToLogger({ logLevel, messages, data, hasData }: LogLayerTransportParams): any[];
|
|
97
|
+
/**
|
|
98
|
+
* Manually flush logs to Axiom.
|
|
99
|
+
* This is automatically called on process exit.
|
|
100
|
+
*/
|
|
101
|
+
private flush;
|
|
102
|
+
/**
|
|
103
|
+
* Synchronously flush logs to Axiom.
|
|
104
|
+
* This is used during process termination (SIGINT/SIGTERM) to ensure logs are written
|
|
105
|
+
* before the process exits.
|
|
106
|
+
* @private
|
|
107
|
+
*/
|
|
108
|
+
private flushSync;
|
|
109
|
+
/**
|
|
110
|
+
* Clean up resources and remove event listeners.
|
|
111
|
+
* This method:
|
|
112
|
+
* 1. Prevents new operations from starting
|
|
113
|
+
* 2. Flushes any pending logs
|
|
114
|
+
* 3. Removes event handlers
|
|
115
|
+
* 4. Waits for any in-progress operations to complete
|
|
116
|
+
*/
|
|
117
|
+
[Symbol.dispose](): Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { AxiomTransport, type AxiomTransportConfig };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Axiom } from '@axiomhq/js';
|
|
2
|
+
import { LogLayerTransportConfig, LogLevel, BaseTransport, LogLayerTransportParams } from '@loglayer/transport';
|
|
3
|
+
|
|
4
|
+
interface AxiomFieldNames {
|
|
5
|
+
/**
|
|
6
|
+
* Field name for the log level
|
|
7
|
+
* @default "level"
|
|
8
|
+
*/
|
|
9
|
+
level?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Field name for the log message
|
|
12
|
+
* @default "message"
|
|
13
|
+
*/
|
|
14
|
+
message?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Field name for the timestamp
|
|
17
|
+
* @default "timestamp"
|
|
18
|
+
*/
|
|
19
|
+
timestamp?: string;
|
|
20
|
+
}
|
|
21
|
+
interface AxiomLevelMap {
|
|
22
|
+
/**
|
|
23
|
+
* Mapping for the 'fatal' log level
|
|
24
|
+
* @example 60 or "FATAL"
|
|
25
|
+
*/
|
|
26
|
+
fatal?: string | number;
|
|
27
|
+
/**
|
|
28
|
+
* Mapping for the 'error' log level
|
|
29
|
+
* @example 50 or "ERROR"
|
|
30
|
+
*/
|
|
31
|
+
error?: string | number;
|
|
32
|
+
/**
|
|
33
|
+
* Mapping for the 'warn' log level
|
|
34
|
+
* @example 40 or "WARN"
|
|
35
|
+
*/
|
|
36
|
+
warn?: string | number;
|
|
37
|
+
/**
|
|
38
|
+
* Mapping for the 'info' log level
|
|
39
|
+
* @example 30 or "INFO"
|
|
40
|
+
*/
|
|
41
|
+
info?: string | number;
|
|
42
|
+
/**
|
|
43
|
+
* Mapping for the 'debug' log level
|
|
44
|
+
* @example 20 or "DEBUG"
|
|
45
|
+
*/
|
|
46
|
+
debug?: string | number;
|
|
47
|
+
/**
|
|
48
|
+
* Mapping for the 'trace' log level
|
|
49
|
+
* @example 10 or "TRACE"
|
|
50
|
+
*/
|
|
51
|
+
trace?: string | number;
|
|
52
|
+
}
|
|
53
|
+
interface AxiomTransportConfig extends LogLayerTransportConfig<Axiom> {
|
|
54
|
+
/**
|
|
55
|
+
* The Axiom dataset name to send logs to
|
|
56
|
+
*/
|
|
57
|
+
dataset: string;
|
|
58
|
+
/**
|
|
59
|
+
* Custom field names for the log entry JSON
|
|
60
|
+
* Default: { level: "level", message: "message", timestamp: "timestamp" }
|
|
61
|
+
*/
|
|
62
|
+
fieldNames?: AxiomFieldNames;
|
|
63
|
+
/**
|
|
64
|
+
* Optional function to generate timestamps.
|
|
65
|
+
* If not provided, defaults to ISO string from new Date()
|
|
66
|
+
*/
|
|
67
|
+
timestampFn?: () => string | number;
|
|
68
|
+
/**
|
|
69
|
+
* Optional callback for error handling
|
|
70
|
+
*/
|
|
71
|
+
onError?: (error: Error) => void;
|
|
72
|
+
/**
|
|
73
|
+
* Custom mapping for log levels.
|
|
74
|
+
* Each log level can be mapped to either a string or number.
|
|
75
|
+
* Example: { error: 50, warn: 40, info: 30, debug: 20, trace: 10, fatal: 60 }
|
|
76
|
+
* Example: { error: "ERROR", warn: "WARN", info: "INFO", debug: "DEBUG", trace: "TRACE", fatal: "FATAL" }
|
|
77
|
+
*/
|
|
78
|
+
levelMap?: AxiomLevelMap;
|
|
79
|
+
/**
|
|
80
|
+
* Minimum log level to process. Defaults to "trace".
|
|
81
|
+
*/
|
|
82
|
+
level?: LogLevel | "trace" | "debug" | "info" | "warn" | "error" | "fatal";
|
|
83
|
+
}
|
|
84
|
+
declare class AxiomTransport extends BaseTransport<Axiom> implements Disposable {
|
|
85
|
+
private dataset;
|
|
86
|
+
private fieldNames;
|
|
87
|
+
private timestampFn?;
|
|
88
|
+
private onError?;
|
|
89
|
+
private exitHandlers;
|
|
90
|
+
private isDisposing;
|
|
91
|
+
private isFlushing;
|
|
92
|
+
private levelMap?;
|
|
93
|
+
private level?;
|
|
94
|
+
constructor(config: AxiomTransportConfig);
|
|
95
|
+
private setupExitHandlers;
|
|
96
|
+
shipToLogger({ logLevel, messages, data, hasData }: LogLayerTransportParams): any[];
|
|
97
|
+
/**
|
|
98
|
+
* Manually flush logs to Axiom.
|
|
99
|
+
* This is automatically called on process exit.
|
|
100
|
+
*/
|
|
101
|
+
private flush;
|
|
102
|
+
/**
|
|
103
|
+
* Synchronously flush logs to Axiom.
|
|
104
|
+
* This is used during process termination (SIGINT/SIGTERM) to ensure logs are written
|
|
105
|
+
* before the process exits.
|
|
106
|
+
* @private
|
|
107
|
+
*/
|
|
108
|
+
private flushSync;
|
|
109
|
+
/**
|
|
110
|
+
* Clean up resources and remove event listeners.
|
|
111
|
+
* This method:
|
|
112
|
+
* 1. Prevents new operations from starting
|
|
113
|
+
* 2. Flushes any pending logs
|
|
114
|
+
* 3. Removes event handlers
|
|
115
|
+
* 4. Waits for any in-progress operations to complete
|
|
116
|
+
*/
|
|
117
|
+
[Symbol.dispose](): Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { AxiomTransport, type AxiomTransportConfig };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// src/AxiomTransport.ts
|
|
2
|
+
import { BaseTransport } from "@loglayer/transport";
|
|
3
|
+
import { LogLevelPriority } from "@loglayer/transport";
|
|
4
|
+
var AxiomTransport = class extends BaseTransport {
|
|
5
|
+
dataset;
|
|
6
|
+
fieldNames;
|
|
7
|
+
timestampFn;
|
|
8
|
+
onError;
|
|
9
|
+
exitHandlers = [];
|
|
10
|
+
isDisposing;
|
|
11
|
+
isFlushing;
|
|
12
|
+
levelMap;
|
|
13
|
+
level;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
super(config);
|
|
16
|
+
this.dataset = config.dataset;
|
|
17
|
+
this.fieldNames = {
|
|
18
|
+
level: config.fieldNames?.level ?? "level",
|
|
19
|
+
message: config.fieldNames?.message ?? "message",
|
|
20
|
+
timestamp: config.fieldNames?.timestamp ?? "timestamp"
|
|
21
|
+
};
|
|
22
|
+
this.timestampFn = config.timestampFn;
|
|
23
|
+
this.onError = config.onError;
|
|
24
|
+
this.isDisposing = false;
|
|
25
|
+
this.isFlushing = false;
|
|
26
|
+
this.levelMap = config.levelMap;
|
|
27
|
+
this.level = config.level;
|
|
28
|
+
this.setupExitHandlers();
|
|
29
|
+
}
|
|
30
|
+
setupExitHandlers() {
|
|
31
|
+
const beforeExitHandler = async () => {
|
|
32
|
+
if (!this.isDisposing && !this.isFlushing) {
|
|
33
|
+
try {
|
|
34
|
+
await this.flush();
|
|
35
|
+
} catch (error) {
|
|
36
|
+
if (this.onError) {
|
|
37
|
+
this.onError(error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
process.on("beforeExit", beforeExitHandler);
|
|
43
|
+
this.exitHandlers.push(() => process.off("beforeExit", beforeExitHandler));
|
|
44
|
+
const sigintHandler = () => {
|
|
45
|
+
if (!this.isDisposing && !this.isFlushing) {
|
|
46
|
+
try {
|
|
47
|
+
this.flushSync();
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (this.onError) {
|
|
50
|
+
this.onError(error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
process.exit(130);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
process.on("SIGINT", sigintHandler);
|
|
57
|
+
this.exitHandlers.push(() => process.off("SIGINT", sigintHandler));
|
|
58
|
+
const sigtermHandler = () => {
|
|
59
|
+
if (!this.isDisposing && !this.isFlushing) {
|
|
60
|
+
try {
|
|
61
|
+
this.flushSync();
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (this.onError) {
|
|
64
|
+
this.onError(error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
process.exit(143);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
process.on("SIGTERM", sigtermHandler);
|
|
71
|
+
this.exitHandlers.push(() => process.off("SIGTERM", sigtermHandler));
|
|
72
|
+
const exitHandler = () => {
|
|
73
|
+
if (!this.isDisposing && !this.isFlushing) {
|
|
74
|
+
this.isFlushing = true;
|
|
75
|
+
try {
|
|
76
|
+
this.flushSync();
|
|
77
|
+
} catch (error) {
|
|
78
|
+
if (this.onError) {
|
|
79
|
+
this.onError(error);
|
|
80
|
+
}
|
|
81
|
+
} finally {
|
|
82
|
+
this.isFlushing = false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
process.on("exit", exitHandler);
|
|
87
|
+
this.exitHandlers.push(() => process.off("exit", exitHandler));
|
|
88
|
+
}
|
|
89
|
+
shipToLogger({ logLevel, messages, data, hasData }) {
|
|
90
|
+
if (this.isDisposing) {
|
|
91
|
+
return messages;
|
|
92
|
+
}
|
|
93
|
+
if (this.level && LogLevelPriority[logLevel] < LogLevelPriority[this.level]) {
|
|
94
|
+
return messages;
|
|
95
|
+
}
|
|
96
|
+
const message = messages.join(" ");
|
|
97
|
+
const mappedLevel = this.levelMap?.[logLevel] ?? logLevel;
|
|
98
|
+
const logEntry = {
|
|
99
|
+
[this.fieldNames.message]: message,
|
|
100
|
+
[this.fieldNames.level]: mappedLevel,
|
|
101
|
+
[this.fieldNames.timestamp]: this.timestampFn ? this.timestampFn() : (/* @__PURE__ */ new Date()).toISOString()
|
|
102
|
+
};
|
|
103
|
+
if (data && hasData) {
|
|
104
|
+
Object.assign(logEntry, data);
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
this.logger.ingest(this.dataset, [logEntry]);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
if (this.onError) {
|
|
110
|
+
this.onError(error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return messages;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Manually flush logs to Axiom.
|
|
117
|
+
* This is automatically called on process exit.
|
|
118
|
+
*/
|
|
119
|
+
async flush() {
|
|
120
|
+
if (this.isFlushing || this.isDisposing) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.isFlushing = true;
|
|
124
|
+
try {
|
|
125
|
+
await this.logger.flush();
|
|
126
|
+
} catch (error) {
|
|
127
|
+
if (this.onError) {
|
|
128
|
+
this.onError(error);
|
|
129
|
+
}
|
|
130
|
+
} finally {
|
|
131
|
+
this.isFlushing = false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Synchronously flush logs to Axiom.
|
|
136
|
+
* This is used during process termination (SIGINT/SIGTERM) to ensure logs are written
|
|
137
|
+
* before the process exits.
|
|
138
|
+
* @private
|
|
139
|
+
*/
|
|
140
|
+
flushSync() {
|
|
141
|
+
if (this.isFlushing || this.isDisposing) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
this.isFlushing = true;
|
|
145
|
+
try {
|
|
146
|
+
Promise.resolve(this.logger.flush()).catch((error) => {
|
|
147
|
+
if (this.onError) {
|
|
148
|
+
this.onError(error);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
} catch (error) {
|
|
152
|
+
if (this.onError) {
|
|
153
|
+
this.onError(error);
|
|
154
|
+
}
|
|
155
|
+
} finally {
|
|
156
|
+
this.isFlushing = false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Clean up resources and remove event listeners.
|
|
161
|
+
* This method:
|
|
162
|
+
* 1. Prevents new operations from starting
|
|
163
|
+
* 2. Flushes any pending logs
|
|
164
|
+
* 3. Removes event handlers
|
|
165
|
+
* 4. Waits for any in-progress operations to complete
|
|
166
|
+
*/
|
|
167
|
+
[Symbol.dispose]() {
|
|
168
|
+
if (this.isDisposing) {
|
|
169
|
+
return Promise.resolve();
|
|
170
|
+
}
|
|
171
|
+
this.isDisposing = true;
|
|
172
|
+
for (const cleanup of this.exitHandlers) {
|
|
173
|
+
cleanup();
|
|
174
|
+
}
|
|
175
|
+
this.exitHandlers = [];
|
|
176
|
+
const checkAndFinish = async () => {
|
|
177
|
+
if (!this.isFlushing) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
181
|
+
return checkAndFinish();
|
|
182
|
+
};
|
|
183
|
+
return this.flush().then(() => checkAndFinish()).catch((error) => {
|
|
184
|
+
if (this.onError) {
|
|
185
|
+
this.onError(error);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
export {
|
|
191
|
+
AxiomTransport
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/AxiomTransport.ts"],"sourcesContent":["import type { Axiom } from \"@axiomhq/js\";\nimport type { LogLayerTransportParams, LogLevel } from \"@loglayer/transport\";\nimport { BaseTransport } from \"@loglayer/transport\";\nimport type { LogLayerTransportConfig } from \"@loglayer/transport\";\nimport { LogLevelPriority } from \"@loglayer/transport\";\n\nexport interface AxiomFieldNames {\n /**\n * Field name for the log level\n * @default \"level\"\n */\n level?: string;\n /**\n * Field name for the log message\n * @default \"message\"\n */\n message?: string;\n /**\n * Field name for the timestamp\n * @default \"timestamp\"\n */\n timestamp?: string;\n}\n\nexport interface AxiomLevelMap {\n /**\n * Mapping for the 'fatal' log level\n * @example 60 or \"FATAL\"\n */\n fatal?: string | number;\n /**\n * Mapping for the 'error' log level\n * @example 50 or \"ERROR\"\n */\n error?: string | number;\n /**\n * Mapping for the 'warn' log level\n * @example 40 or \"WARN\"\n */\n warn?: string | number;\n /**\n * Mapping for the 'info' log level\n * @example 30 or \"INFO\"\n */\n info?: string | number;\n /**\n * Mapping for the 'debug' log level\n * @example 20 or \"DEBUG\"\n */\n debug?: string | number;\n /**\n * Mapping for the 'trace' log level\n * @example 10 or \"TRACE\"\n */\n trace?: string | number;\n}\n\nexport interface AxiomTransportConfig extends LogLayerTransportConfig<Axiom> {\n /**\n * The Axiom dataset name to send logs to\n */\n dataset: string;\n\n /**\n * Custom field names for the log entry JSON\n * Default: { level: \"level\", message: \"message\", timestamp: \"timestamp\" }\n */\n fieldNames?: AxiomFieldNames;\n\n /**\n * Optional function to generate timestamps.\n * If not provided, defaults to ISO string from new Date()\n */\n timestampFn?: () => string | number;\n\n /**\n * Optional callback for error handling\n */\n onError?: (error: Error) => void;\n\n /**\n * Custom mapping for log levels.\n * Each log level can be mapped to either a string or number.\n * Example: { error: 50, warn: 40, info: 30, debug: 20, trace: 10, fatal: 60 }\n * Example: { error: \"ERROR\", warn: \"WARN\", info: \"INFO\", debug: \"DEBUG\", trace: \"TRACE\", fatal: \"FATAL\" }\n */\n levelMap?: AxiomLevelMap;\n\n /**\n * Minimum log level to process. Defaults to \"trace\".\n */\n level?: LogLevel | \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n}\n\nexport class AxiomTransport extends BaseTransport<Axiom> implements Disposable {\n private dataset: string;\n private fieldNames: Required<AxiomFieldNames>;\n private timestampFn?: () => string | number;\n private onError?: (error: Error) => void;\n private exitHandlers: Array<() => void> = [];\n private isDisposing: boolean;\n private isFlushing: boolean;\n private levelMap?: AxiomLevelMap;\n private level?: LogLevel | \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\n constructor(config: AxiomTransportConfig) {\n super(config);\n this.dataset = config.dataset;\n this.fieldNames = {\n level: config.fieldNames?.level ?? \"level\",\n message: config.fieldNames?.message ?? \"message\",\n timestamp: config.fieldNames?.timestamp ?? \"timestamp\",\n };\n this.timestampFn = config.timestampFn;\n this.onError = config.onError;\n this.isDisposing = false;\n this.isFlushing = false;\n this.levelMap = config.levelMap;\n this.level = config.level;\n\n this.setupExitHandlers();\n }\n\n private setupExitHandlers() {\n // Handle graceful shutdowns (allows async operations)\n const beforeExitHandler = async () => {\n if (!this.isDisposing && !this.isFlushing) {\n try {\n await this.flush();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n }\n }\n };\n process.on(\"beforeExit\", beforeExitHandler);\n this.exitHandlers.push(() => process.off(\"beforeExit\", beforeExitHandler));\n\n // Handle SIGINT (Ctrl+C)\n const sigintHandler = () => {\n if (!this.isDisposing && !this.isFlushing) {\n // Synchronously flush logs to ensure they're written before exit\n try {\n this.flushSync();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n }\n process.exit(130); // 128 + SIGINT(2)\n }\n };\n process.on(\"SIGINT\", sigintHandler);\n this.exitHandlers.push(() => process.off(\"SIGINT\", sigintHandler));\n\n // Handle SIGTERM\n const sigtermHandler = () => {\n if (!this.isDisposing && !this.isFlushing) {\n // Synchronously flush logs to ensure they're written before exit\n try {\n this.flushSync();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n }\n process.exit(143); // 128 + SIGTERM(15)\n }\n };\n process.on(\"SIGTERM\", sigtermHandler);\n this.exitHandlers.push(() => process.off(\"SIGTERM\", sigtermHandler));\n\n // Handle exit (must be synchronous)\n const exitHandler = () => {\n if (!this.isDisposing && !this.isFlushing) {\n this.isFlushing = true;\n try {\n // Call flush synchronously since we're in the exit handler\n this.flushSync();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n };\n process.on(\"exit\", exitHandler);\n this.exitHandlers.push(() => process.off(\"exit\", exitHandler));\n }\n\n shipToLogger({ logLevel, messages, data, hasData }: LogLayerTransportParams): any[] {\n // Don't accept new logs if we're disposing\n if (this.isDisposing) {\n return messages;\n }\n\n // Skip if log level is lower priority than configured minimum\n if (this.level && LogLevelPriority[logLevel] < LogLevelPriority[this.level]) {\n return messages;\n }\n\n // Combine all messages into a single string\n const message = messages.join(\" \");\n\n // Map the log level if a mapping exists\n const mappedLevel = this.levelMap?.[logLevel] ?? logLevel;\n\n // Create the log entry\n const logEntry: Record<string, any> = {\n [this.fieldNames.message]: message,\n [this.fieldNames.level]: mappedLevel,\n [this.fieldNames.timestamp]: this.timestampFn ? this.timestampFn() : new Date().toISOString(),\n };\n\n // Add any additional data\n if (data && hasData) {\n Object.assign(logEntry, data);\n }\n\n // Send to Axiom\n try {\n this.logger.ingest(this.dataset, [logEntry]);\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n }\n\n return messages;\n }\n\n /**\n * Manually flush logs to Axiom.\n * This is automatically called on process exit.\n */\n private async flush(): Promise<void> {\n if (this.isFlushing || this.isDisposing) {\n return;\n }\n\n this.isFlushing = true;\n\n try {\n await this.logger.flush();\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Synchronously flush logs to Axiom.\n * This is used during process termination (SIGINT/SIGTERM) to ensure logs are written\n * before the process exits.\n * @private\n */\n private flushSync(): void {\n if (this.isFlushing || this.isDisposing) {\n return;\n }\n\n this.isFlushing = true;\n try {\n // Call flush synchronously and handle the promise immediately\n Promise.resolve(this.logger.flush()).catch((error) => {\n if (this.onError) {\n this.onError(error as Error);\n }\n });\n } catch (error) {\n if (this.onError) {\n this.onError(error as Error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Clean up resources and remove event listeners.\n * This method:\n * 1. Prevents new operations from starting\n * 2. Flushes any pending logs\n * 3. Removes event handlers\n * 4. Waits for any in-progress operations to complete\n */\n [Symbol.dispose](): Promise<void> {\n if (this.isDisposing) {\n return Promise.resolve();\n }\n\n this.isDisposing = true;\n\n // Remove all event listeners\n for (const cleanup of this.exitHandlers) {\n cleanup();\n }\n this.exitHandlers = [];\n\n const checkAndFinish = async () => {\n if (!this.isFlushing) {\n return;\n }\n // Wait a bit and check again if still flushing\n await new Promise((resolve) => setTimeout(resolve, 100));\n return checkAndFinish();\n };\n\n // Flush any remaining logs and wait for completion\n return this.flush()\n .then(() => checkAndFinish())\n .catch((error) => {\n if (this.onError) {\n this.onError(error as Error);\n }\n });\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@loglayer/transport-axiom",
|
|
3
|
+
"description": "Axiom.co transport for the loglayer logging library.",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
"import": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"require": {
|
|
14
|
+
"types": "./dist/index.d.cts",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": "loglayer/loglayer.git",
|
|
21
|
+
"author": "Theo Gravity <theo@suteki.nu>",
|
|
22
|
+
"keywords": [
|
|
23
|
+
"logging",
|
|
24
|
+
"log",
|
|
25
|
+
"loglayer",
|
|
26
|
+
"axiom",
|
|
27
|
+
"axiom.co",
|
|
28
|
+
"transport"
|
|
29
|
+
],
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@loglayer/transport": "1.2.2"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"hash-runner": "2.0.1",
|
|
35
|
+
"@types/node": "22.10.7",
|
|
36
|
+
"tsup": "8.3.5",
|
|
37
|
+
"typescript": "5.7.3",
|
|
38
|
+
"vitest": "3.0.2",
|
|
39
|
+
"tsx": "4.19.2",
|
|
40
|
+
"loglayer": "5.4.0",
|
|
41
|
+
"@internal/tsconfig": "1.0.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@axiomhq/js": "*"
|
|
45
|
+
},
|
|
46
|
+
"bugs": "https://github.com/loglayer/loglayer/issues",
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=18"
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"dist"
|
|
52
|
+
],
|
|
53
|
+
"homepage": "https://loglayer.dev",
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "tsup src/index.ts",
|
|
56
|
+
"test": "vitest --run",
|
|
57
|
+
"build:dev": "hash-runner",
|
|
58
|
+
"clean": "rm -rf .turbo node_modules dist",
|
|
59
|
+
"lint": "biome check --write --unsafe src && biome format src --write && biome lint src --fix",
|
|
60
|
+
"verify-types": "tsc --noEmit",
|
|
61
|
+
"livetest": "tsx src/__tests__/livetest.ts"
|
|
62
|
+
}
|
|
63
|
+
}
|