@eventuras/logger 0.8.0 → 0.8.1
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/dist/Logger-n-HsscG5.js +314 -0
- package/dist/Logger-n-HsscG5.js.map +1 -0
- package/dist/index.js +33 -12
- package/dist/index.js.map +1 -0
- package/dist/node.js +125 -59
- package/dist/node.js.map +1 -0
- package/dist/opentelemetry.js +138 -28
- package/dist/opentelemetry.js.map +1 -0
- package/package.json +5 -5
- package/dist/Logger-CcNEmm6u.js +0 -208
- package/dist/chunk-NnHqS4_Y.js +0 -20
- package/dist/esm-CIhYjsQQ.js +0 -528
- package/dist/esm-Dido2CZe.js +0 -1580
- package/dist/src-15l0SmY8.js +0 -407
package/dist/node.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
import { r as
|
|
2
|
-
import { Writable
|
|
1
|
+
import { r as PinoTransport, t as Logger } from "./Logger-n-HsscG5.js";
|
|
2
|
+
import { Writable } from "node:stream";
|
|
3
3
|
//#region src/transports/pretty.ts
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Lightweight pretty-print formatter for development.
|
|
6
|
+
* Zero external dependencies — uses ANSI colors and simple formatting.
|
|
7
|
+
*
|
|
8
|
+
* Produces output like:
|
|
9
|
+
* 12:34:56 INFO (web:auth) → User logged in
|
|
10
|
+
* 12:34:56 ERROR (web:auth) → Failed to authenticate { error: "invalid token" }
|
|
11
|
+
*/
|
|
12
|
+
var ANSI = {
|
|
5
13
|
reset: "\x1B[0m",
|
|
6
14
|
dim: "\x1B[2m",
|
|
7
15
|
bold: "\x1B[1m",
|
|
@@ -11,57 +19,61 @@ var r = {
|
|
|
11
19
|
cyan: "\x1B[36m",
|
|
12
20
|
magenta: "\x1B[35m",
|
|
13
21
|
gray: "\x1B[90m"
|
|
14
|
-
}
|
|
22
|
+
};
|
|
23
|
+
var LEVEL_BY_NUMBER = {
|
|
15
24
|
10: {
|
|
16
25
|
label: "TRACE",
|
|
17
|
-
color:
|
|
26
|
+
color: ANSI.gray
|
|
18
27
|
},
|
|
19
28
|
20: {
|
|
20
29
|
label: "DEBUG",
|
|
21
|
-
color:
|
|
30
|
+
color: ANSI.cyan
|
|
22
31
|
},
|
|
23
32
|
30: {
|
|
24
33
|
label: "INFO ",
|
|
25
|
-
color:
|
|
34
|
+
color: ANSI.green
|
|
26
35
|
},
|
|
27
36
|
40: {
|
|
28
37
|
label: "WARN ",
|
|
29
|
-
color:
|
|
38
|
+
color: ANSI.yellow
|
|
30
39
|
},
|
|
31
40
|
50: {
|
|
32
41
|
label: "ERROR",
|
|
33
|
-
color:
|
|
42
|
+
color: ANSI.red
|
|
34
43
|
},
|
|
35
44
|
60: {
|
|
36
45
|
label: "FATAL",
|
|
37
|
-
color: `${
|
|
46
|
+
color: `${ANSI.bold}${ANSI.red}`
|
|
38
47
|
}
|
|
39
|
-
}
|
|
48
|
+
};
|
|
49
|
+
var LEVEL_BY_NAME = {
|
|
40
50
|
trace: {
|
|
41
51
|
label: "TRACE",
|
|
42
|
-
color:
|
|
52
|
+
color: ANSI.gray
|
|
43
53
|
},
|
|
44
54
|
debug: {
|
|
45
55
|
label: "DEBUG",
|
|
46
|
-
color:
|
|
56
|
+
color: ANSI.cyan
|
|
47
57
|
},
|
|
48
58
|
info: {
|
|
49
59
|
label: "INFO ",
|
|
50
|
-
color:
|
|
60
|
+
color: ANSI.green
|
|
51
61
|
},
|
|
52
62
|
warn: {
|
|
53
63
|
label: "WARN ",
|
|
54
|
-
color:
|
|
64
|
+
color: ANSI.yellow
|
|
55
65
|
},
|
|
56
66
|
error: {
|
|
57
67
|
label: "ERROR",
|
|
58
|
-
color:
|
|
68
|
+
color: ANSI.red
|
|
59
69
|
},
|
|
60
70
|
fatal: {
|
|
61
71
|
label: "FATAL",
|
|
62
|
-
color: `${
|
|
72
|
+
color: `${ANSI.bold}${ANSI.red}`
|
|
63
73
|
}
|
|
64
|
-
}
|
|
74
|
+
};
|
|
75
|
+
/** Keys excluded from the "extra data" output. */
|
|
76
|
+
var INTERNAL_KEYS = new Set([
|
|
65
77
|
"level",
|
|
66
78
|
"time",
|
|
67
79
|
"pid",
|
|
@@ -71,60 +83,114 @@ var r = {
|
|
|
71
83
|
"ns",
|
|
72
84
|
"namespace"
|
|
73
85
|
]);
|
|
74
|
-
function
|
|
75
|
-
if (typeof
|
|
76
|
-
|
|
77
|
-
return Number.isNaN(
|
|
86
|
+
function formatTime(time) {
|
|
87
|
+
if (typeof time === "string") {
|
|
88
|
+
const d = new Date(time);
|
|
89
|
+
return Number.isNaN(d.getTime()) ? "" : d.toLocaleTimeString("en-GB", { hour12: false });
|
|
78
90
|
}
|
|
79
|
-
|
|
91
|
+
if (typeof time === "number") return new Date(time).toLocaleTimeString("en-GB", { hour12: false });
|
|
92
|
+
return (/* @__PURE__ */ new Date()).toLocaleTimeString("en-GB", { hour12: false });
|
|
80
93
|
}
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
94
|
+
function formatData(obj) {
|
|
95
|
+
const filtered = {};
|
|
96
|
+
let hasKeys = false;
|
|
97
|
+
for (const [key, value] of Object.entries(obj)) if (!INTERNAL_KEYS.has(key)) {
|
|
98
|
+
filtered[key] = value;
|
|
99
|
+
hasKeys = true;
|
|
100
|
+
}
|
|
101
|
+
if (!hasKeys) return "";
|
|
102
|
+
return ` ${ANSI.dim}${JSON.stringify(filtered)}${ANSI.reset}`;
|
|
85
103
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
104
|
+
/**
|
|
105
|
+
* Format a Pino JSON log line into a human-readable string.
|
|
106
|
+
* @param line Raw JSON string from Pino
|
|
107
|
+
* @returns Formatted string, or the original line if parsing fails
|
|
108
|
+
*/
|
|
109
|
+
function formatLogLine(line) {
|
|
110
|
+
const trimmed = line.trim();
|
|
111
|
+
if (!trimmed) return "";
|
|
112
|
+
let obj;
|
|
90
113
|
try {
|
|
91
|
-
|
|
114
|
+
obj = JSON.parse(trimmed);
|
|
92
115
|
} catch {
|
|
93
|
-
return
|
|
116
|
+
return trimmed;
|
|
94
117
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
118
|
+
const level = obj.level;
|
|
119
|
+
const config = typeof level === "string" ? LEVEL_BY_NAME[level] ?? {
|
|
120
|
+
label: level.toUpperCase().padEnd(5),
|
|
121
|
+
color: ANSI.gray
|
|
122
|
+
} : LEVEL_BY_NUMBER[level] ?? {
|
|
123
|
+
label: `L${level}`,
|
|
124
|
+
color: ANSI.gray
|
|
125
|
+
};
|
|
126
|
+
const time = formatTime(obj.time);
|
|
127
|
+
const msg = obj.msg ?? "";
|
|
128
|
+
const ns = obj.namespace || obj.ns || obj.name || "";
|
|
129
|
+
const nsTag = ns ? ` ${ANSI.magenta}(${ns})${ANSI.reset}` : "";
|
|
130
|
+
const arrow = `${ANSI.dim}→${ANSI.reset}`;
|
|
131
|
+
const data = formatData(obj);
|
|
132
|
+
return `${ANSI.dim}${time}${ANSI.reset} ${config.color}${config.label}${ANSI.reset}${nsTag} ${arrow} ${msg}${data}`;
|
|
103
133
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
134
|
+
/**
|
|
135
|
+
* Creates a Node.js writable stream that formats Pino JSON output.
|
|
136
|
+
* Used as the destination for PinoTransport when prettyPrint is enabled.
|
|
137
|
+
*/
|
|
138
|
+
function createPrettyStream() {
|
|
139
|
+
return new Writable({ write(chunk, _encoding, callback) {
|
|
140
|
+
const lines = chunk.toString().split("\n");
|
|
141
|
+
for (const line of lines) {
|
|
142
|
+
const formatted = formatLogLine(line);
|
|
143
|
+
if (formatted) process.stdout.write(formatted + "\n");
|
|
110
144
|
}
|
|
111
|
-
|
|
145
|
+
callback();
|
|
112
146
|
} });
|
|
113
147
|
}
|
|
114
148
|
//#endregion
|
|
115
149
|
//#region src/node.ts
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
150
|
+
/**
|
|
151
|
+
* Node.js-only exports for @eventuras/logger.
|
|
152
|
+
*
|
|
153
|
+
* These utilities depend on `node:stream` and must not be imported in browser
|
|
154
|
+
* or edge runtime environments. Import from the root entry point
|
|
155
|
+
* (`@eventuras/logger`) for the browser-safe API.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* // Pretty dev output
|
|
159
|
+
* import { configureNodeLogger } from '@eventuras/logger/node';
|
|
160
|
+
* configureNodeLogger({ prettyPrint: process.env.NODE_ENV === 'development' });
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* // Lower-level: just the pretty helpers
|
|
164
|
+
* import { createPrettyStream, formatLogLine } from '@eventuras/logger/node';
|
|
165
|
+
*/
|
|
166
|
+
/**
|
|
167
|
+
* Configure the global Logger with a Node-side PinoTransport, optionally
|
|
168
|
+
* wired to a pretty-print stream for development. Keeps the browser/edge
|
|
169
|
+
* main entry free of `node:stream` imports — call this from a Node-only
|
|
170
|
+
* bootstrap (e.g. `instrumentation.ts`, `server.ts`).
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* // In your server entry point
|
|
174
|
+
* import { configureNodeLogger } from '@eventuras/logger/node';
|
|
175
|
+
* configureNodeLogger({
|
|
176
|
+
* level: 'debug',
|
|
177
|
+
* prettyPrint: process.env.NODE_ENV === 'development',
|
|
178
|
+
* });
|
|
179
|
+
*/
|
|
180
|
+
function configureNodeLogger(options = {}) {
|
|
181
|
+
const { prettyPrint, pinoOptions, ...rest } = options;
|
|
182
|
+
Logger.configure({
|
|
183
|
+
...rest,
|
|
184
|
+
transport: new PinoTransport({
|
|
185
|
+
level: rest.level,
|
|
186
|
+
redact: rest.redact,
|
|
187
|
+
destination: rest.destination,
|
|
188
|
+
destinationStream: prettyPrint ? createPrettyStream() : void 0,
|
|
189
|
+
pinoOptions
|
|
126
190
|
})
|
|
127
191
|
});
|
|
128
192
|
}
|
|
129
193
|
//#endregion
|
|
130
|
-
export {
|
|
194
|
+
export { configureNodeLogger, createPrettyStream, formatLogLine };
|
|
195
|
+
|
|
196
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","names":[],"sources":["../src/transports/pretty.ts","../src/node.ts"],"sourcesContent":["/**\n * Lightweight pretty-print formatter for development.\n * Zero external dependencies — uses ANSI colors and simple formatting.\n *\n * Produces output like:\n * 12:34:56 INFO (web:auth) → User logged in\n * 12:34:56 ERROR (web:auth) → Failed to authenticate { error: \"invalid token\" }\n */\n\nimport { Writable } from 'node:stream';\n\nconst ANSI = {\n reset: '\\x1b[0m',\n dim: '\\x1b[2m',\n bold: '\\x1b[1m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n magenta: '\\x1b[35m',\n gray: '\\x1b[90m',\n} as const;\n\nconst LEVEL_BY_NUMBER: Record<number, { label: string; color: string; }> = {\n 10: { label: 'TRACE', color: ANSI.gray },\n 20: { label: 'DEBUG', color: ANSI.cyan },\n 30: { label: 'INFO ', color: ANSI.green },\n 40: { label: 'WARN ', color: ANSI.yellow },\n 50: { label: 'ERROR', color: ANSI.red },\n 60: { label: 'FATAL', color: `${ANSI.bold}${ANSI.red}` },\n};\n\nconst LEVEL_BY_NAME: Record<string, { label: string; color: string; }> = {\n trace: { label: 'TRACE', color: ANSI.gray },\n debug: { label: 'DEBUG', color: ANSI.cyan },\n info: { label: 'INFO ', color: ANSI.green },\n warn: { label: 'WARN ', color: ANSI.yellow },\n error: { label: 'ERROR', color: ANSI.red },\n fatal: { label: 'FATAL', color: `${ANSI.bold}${ANSI.red}` },\n};\n\n/** Keys excluded from the \"extra data\" output. */\nconst INTERNAL_KEYS = new Set([\n 'level', 'time', 'pid', 'hostname', 'msg', 'name', 'ns', 'namespace',\n]);\n\nfunction formatTime(time: unknown): string {\n if (typeof time === 'string') {\n // ISO string — extract time portion\n const d = new Date(time);\n return Number.isNaN(d.getTime()) ? '' : d.toLocaleTimeString('en-GB', { hour12: false });\n }\n if (typeof time === 'number') {\n return new Date(time).toLocaleTimeString('en-GB', { hour12: false });\n }\n return new Date().toLocaleTimeString('en-GB', { hour12: false });\n}\n\nfunction formatData(obj: Record<string, unknown>): string {\n const filtered: Record<string, unknown> = {};\n let hasKeys = false;\n\n for (const [key, value] of Object.entries(obj)) {\n if (!INTERNAL_KEYS.has(key)) {\n filtered[key] = value;\n hasKeys = true;\n }\n }\n\n if (!hasKeys) return '';\n return ` ${ANSI.dim}${JSON.stringify(filtered)}${ANSI.reset}`;\n}\n\n/**\n * Format a Pino JSON log line into a human-readable string.\n * @param line Raw JSON string from Pino\n * @returns Formatted string, or the original line if parsing fails\n */\nexport function formatLogLine(line: string): string {\n const trimmed = line.trim();\n if (!trimmed) return '';\n\n let obj: Record<string, unknown>;\n try {\n obj = JSON.parse(trimmed);\n } catch {\n return trimmed;\n }\n\n const level = obj.level;\n const config = typeof level === 'string'\n ? LEVEL_BY_NAME[level] ?? { label: level.toUpperCase().padEnd(5), color: ANSI.gray }\n : LEVEL_BY_NUMBER[level as number] ?? { label: `L${level}`, color: ANSI.gray };\n const time = formatTime(obj.time);\n const msg = (obj.msg as string) ?? '';\n const ns = (obj.namespace as string) || (obj.ns as string) || (obj.name as string) || '';\n\n const nsTag = ns ? ` ${ANSI.magenta}(${ns})${ANSI.reset}` : '';\n const arrow = `${ANSI.dim}→${ANSI.reset}`;\n const data = formatData(obj);\n\n return `${ANSI.dim}${time}${ANSI.reset} ${config.color}${config.label}${ANSI.reset}${nsTag} ${arrow} ${msg}${data}`;\n}\n\n/**\n * Creates a Node.js writable stream that formats Pino JSON output.\n * Used as the destination for PinoTransport when prettyPrint is enabled.\n */\nexport function createPrettyStream(): NodeJS.WritableStream {\n return new Writable({\n write(chunk: Buffer, _encoding: string, callback: () => void) {\n const lines = chunk.toString().split('\\n');\n for (const line of lines) {\n const formatted = formatLogLine(line);\n if (formatted) {\n process.stdout.write(formatted + '\\n');\n }\n }\n callback();\n },\n });\n}\n","/**\n * Node.js-only exports for @eventuras/logger.\n *\n * These utilities depend on `node:stream` and must not be imported in browser\n * or edge runtime environments. Import from the root entry point\n * (`@eventuras/logger`) for the browser-safe API.\n *\n * @example\n * // Pretty dev output\n * import { configureNodeLogger } from '@eventuras/logger/node';\n * configureNodeLogger({ prettyPrint: process.env.NODE_ENV === 'development' });\n *\n * @example\n * // Lower-level: just the pretty helpers\n * import { createPrettyStream, formatLogLine } from '@eventuras/logger/node';\n */\nimport { Logger } from './Logger';\nimport { PinoTransport, type PinoTransportOptions } from './transports/pino';\nimport { createPrettyStream } from './transports/pretty';\nimport type { LoggerConfig } from './types';\n\nexport { formatLogLine, createPrettyStream } from './transports/pretty';\n\n/** Options for `configureNodeLogger`. */\nexport type NodeLoggerOptions = Omit<LoggerConfig, 'transport'> & {\n /** Enable human-readable, ANSI-colored output. Off by default. */\n prettyPrint?: boolean;\n /** Raw PinoTransport options for advanced tuning. */\n pinoOptions?: PinoTransportOptions['pinoOptions'];\n};\n\n/**\n * Configure the global Logger with a Node-side PinoTransport, optionally\n * wired to a pretty-print stream for development. Keeps the browser/edge\n * main entry free of `node:stream` imports — call this from a Node-only\n * bootstrap (e.g. `instrumentation.ts`, `server.ts`).\n *\n * @example\n * // In your server entry point\n * import { configureNodeLogger } from '@eventuras/logger/node';\n * configureNodeLogger({\n * level: 'debug',\n * prettyPrint: process.env.NODE_ENV === 'development',\n * });\n */\nexport function configureNodeLogger(options: NodeLoggerOptions = {}): void {\n const { prettyPrint, pinoOptions, ...rest } = options;\n Logger.configure({\n ...rest,\n transport: new PinoTransport({\n level: rest.level,\n redact: rest.redact,\n destination: rest.destination,\n destinationStream: prettyPrint ? createPrettyStream() : undefined,\n pinoOptions,\n }),\n });\n}\n"],"mappings":"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"}
|
package/dist/opentelemetry.js
CHANGED
|
@@ -1,48 +1,158 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t } from "./Logger-CcNEmm6u.js";
|
|
1
|
+
import { t as Logger } from "./Logger-n-HsscG5.js";
|
|
3
2
|
//#region src/opentelemetry.ts
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* OpenTelemetry integration for @eventuras/logger
|
|
5
|
+
*
|
|
6
|
+
* This module provides integration between Pino and OpenTelemetry Logs API.
|
|
7
|
+
* It allows sending logs to any OpenTelemetry-compatible backend (Sentry, Grafana, Jaeger, etc.)
|
|
8
|
+
* without vendor lock-in.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This module requires OpenTelemetry packages to be installed as peer dependencies.
|
|
11
|
+
* If they are not available, the integration will gracefully disable itself.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // In your app's instrumentation.ts or main entry point
|
|
15
|
+
* import { setupOpenTelemetryLogger } from '@eventuras/logger/opentelemetry';
|
|
16
|
+
* import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
|
|
17
|
+
* import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';
|
|
18
|
+
*
|
|
19
|
+
* setupOpenTelemetryLogger({
|
|
20
|
+
* logRecordProcessor: new BatchLogRecordProcessor(
|
|
21
|
+
* new OTLPLogExporter({
|
|
22
|
+
* url: 'https://[org].ingest.sentry.io/api/[project]/integration/otlp/v1/logs',
|
|
23
|
+
* headers: { 'x-sentry-auth': 'sentry sentry_key=...' }
|
|
24
|
+
* })
|
|
25
|
+
* )
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // Then use logger as normal
|
|
30
|
+
* import { Logger } from '@eventuras/logger';
|
|
31
|
+
*
|
|
32
|
+
* const logger = Logger.create({ namespace: 'MyService' });
|
|
33
|
+
* logger.error({ error: err }, 'Something failed'); // Sent to OpenTelemetry backend
|
|
34
|
+
*/
|
|
35
|
+
async function loadOpenTelemetry() {
|
|
5
36
|
try {
|
|
6
|
-
|
|
37
|
+
const [pinoModule, logsModule] = await Promise.all([import("@opentelemetry/instrumentation-pino"), import("@opentelemetry/sdk-logs")]);
|
|
7
38
|
return {
|
|
8
|
-
PinoInstrumentation:
|
|
9
|
-
LoggerProvider:
|
|
39
|
+
PinoInstrumentation: pinoModule.PinoInstrumentation,
|
|
40
|
+
LoggerProvider: logsModule.LoggerProvider
|
|
10
41
|
};
|
|
11
42
|
} catch {
|
|
12
43
|
return null;
|
|
13
44
|
}
|
|
14
45
|
}
|
|
15
|
-
var
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
46
|
+
var pinoInstrumentation = null;
|
|
47
|
+
var loggerProvider = null;
|
|
48
|
+
/**
|
|
49
|
+
* Set up OpenTelemetry integration for Pino logger.
|
|
50
|
+
*
|
|
51
|
+
* This function:
|
|
52
|
+
* 1. Creates or uses provided LoggerProvider
|
|
53
|
+
* 2. Registers the log record processor (for exporting logs)
|
|
54
|
+
* 3. Enables Pino instrumentation to bridge Pino logs to OTel
|
|
55
|
+
*
|
|
56
|
+
* Call this function once at application startup, before creating any loggers.
|
|
57
|
+
*
|
|
58
|
+
* @param options - Configuration options
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // Send to Sentry via OTLP
|
|
62
|
+
* import { setupOpenTelemetryLogger } from '@eventuras/logger';
|
|
63
|
+
* import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
|
|
64
|
+
* import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';
|
|
65
|
+
*
|
|
66
|
+
* setupOpenTelemetryLogger({
|
|
67
|
+
* logRecordProcessor: new BatchLogRecordProcessor(
|
|
68
|
+
* new OTLPLogExporter({
|
|
69
|
+
* url: process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT,
|
|
70
|
+
* headers: {
|
|
71
|
+
* 'x-sentry-auth': `sentry sentry_key=${process.env.SENTRY_KEY}`
|
|
72
|
+
* }
|
|
73
|
+
* })
|
|
74
|
+
* )
|
|
75
|
+
* });
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* // Use environment variables (recommended)
|
|
79
|
+
* // Set these in your environment:
|
|
80
|
+
* // OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://[org].ingest.sentry.io/api/[project]/integration/otlp/v1/logs
|
|
81
|
+
* // OTEL_EXPORTER_OTLP_LOGS_HEADERS=x-sentry-auth=sentry sentry_key=...
|
|
82
|
+
*
|
|
83
|
+
* import { setupOpenTelemetryLogger } from '@eventuras/logger';
|
|
84
|
+
* import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
|
|
85
|
+
* import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';
|
|
86
|
+
*
|
|
87
|
+
* await setupOpenTelemetryLogger({
|
|
88
|
+
* logRecordProcessor: new BatchLogRecordProcessor(
|
|
89
|
+
* new OTLPLogExporter() // Reads from env vars
|
|
90
|
+
* )
|
|
91
|
+
* });
|
|
92
|
+
*/
|
|
93
|
+
async function setupOpenTelemetryLogger(options = {}) {
|
|
94
|
+
if (typeof window !== "undefined") {
|
|
95
|
+
Logger.warn({ namespace: "logger:otel" }, "OpenTelemetry integration is server-side only, skipping");
|
|
19
96
|
return;
|
|
20
97
|
}
|
|
21
|
-
|
|
22
|
-
if (!
|
|
23
|
-
|
|
98
|
+
const { logRecordProcessor, loggerProvider: providedLoggerProvider, serviceName, enabled = true } = options;
|
|
99
|
+
if (!enabled) {
|
|
100
|
+
Logger.debug({ namespace: "logger:otel" }, "OpenTelemetry integration disabled");
|
|
24
101
|
return;
|
|
25
102
|
}
|
|
26
|
-
|
|
27
|
-
if (!
|
|
28
|
-
|
|
103
|
+
const otel = await loadOpenTelemetry();
|
|
104
|
+
if (!otel) {
|
|
105
|
+
Logger.warn({ namespace: "logger:otel" }, "OpenTelemetry packages not available — integration disabled. Install @opentelemetry/api, @opentelemetry/api-logs, @opentelemetry/instrumentation-pino, and @opentelemetry/sdk-logs to enable.");
|
|
29
106
|
return;
|
|
30
107
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
108
|
+
const { PinoInstrumentation, LoggerProvider } = otel;
|
|
109
|
+
if (pinoInstrumentation) {
|
|
110
|
+
pinoInstrumentation.disable();
|
|
111
|
+
pinoInstrumentation = null;
|
|
112
|
+
}
|
|
113
|
+
loggerProvider = providedLoggerProvider ?? new LoggerProvider();
|
|
114
|
+
if (logRecordProcessor && loggerProvider) loggerProvider.addLogRecordProcessor(logRecordProcessor);
|
|
115
|
+
const resolvedServiceName = serviceName ?? (typeof process !== "undefined" ? process.env?.OTEL_SERVICE_NAME : void 0) ?? "unknown-service";
|
|
116
|
+
pinoInstrumentation = new PinoInstrumentation({ logHook: (_span, record) => {
|
|
117
|
+
record["service.name"] = resolvedServiceName;
|
|
118
|
+
} });
|
|
119
|
+
pinoInstrumentation.enable();
|
|
120
|
+
Logger.info({
|
|
37
121
|
namespace: "logger:otel",
|
|
38
|
-
context: { hasProcessor:
|
|
122
|
+
context: { hasProcessor: Boolean(logRecordProcessor) }
|
|
39
123
|
}, "OpenTelemetry integration enabled");
|
|
40
124
|
}
|
|
41
|
-
|
|
42
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Shut down the OpenTelemetry logger integration.
|
|
127
|
+
* Call this when your application is shutting down to flush any pending logs.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* process.on('SIGTERM', async () => {
|
|
131
|
+
* await shutdownOpenTelemetryLogger();
|
|
132
|
+
* process.exit(0);
|
|
133
|
+
* });
|
|
134
|
+
*/
|
|
135
|
+
async function shutdownOpenTelemetryLogger() {
|
|
136
|
+
if (typeof window !== "undefined") return;
|
|
137
|
+
if (pinoInstrumentation) {
|
|
138
|
+
pinoInstrumentation.disable();
|
|
139
|
+
pinoInstrumentation = null;
|
|
140
|
+
}
|
|
141
|
+
if (loggerProvider) {
|
|
142
|
+
await loggerProvider.shutdown();
|
|
143
|
+
loggerProvider = null;
|
|
144
|
+
}
|
|
145
|
+
Logger.info({ namespace: "logger:otel" }, "OpenTelemetry integration shut down");
|
|
43
146
|
}
|
|
44
|
-
|
|
45
|
-
|
|
147
|
+
/**
|
|
148
|
+
* Get the active LoggerProvider instance, if any.
|
|
149
|
+
* Useful for advanced use cases or debugging.
|
|
150
|
+
*/
|
|
151
|
+
function getLoggerProvider() {
|
|
152
|
+
if (typeof window !== "undefined") return null;
|
|
153
|
+
return loggerProvider;
|
|
46
154
|
}
|
|
47
155
|
//#endregion
|
|
48
|
-
export {
|
|
156
|
+
export { getLoggerProvider, setupOpenTelemetryLogger, shutdownOpenTelemetryLogger };
|
|
157
|
+
|
|
158
|
+
//# sourceMappingURL=opentelemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opentelemetry.js","names":[],"sources":["../src/opentelemetry.ts"],"sourcesContent":["/**\n * OpenTelemetry integration for @eventuras/logger\n *\n * This module provides integration between Pino and OpenTelemetry Logs API.\n * It allows sending logs to any OpenTelemetry-compatible backend (Sentry, Grafana, Jaeger, etc.)\n * without vendor lock-in.\n *\n * NOTE: This module requires OpenTelemetry packages to be installed as peer dependencies.\n * If they are not available, the integration will gracefully disable itself.\n *\n * @example\n * // In your app's instrumentation.ts or main entry point\n * import { setupOpenTelemetryLogger } from '@eventuras/logger/opentelemetry';\n * import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\n * import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\n *\n * setupOpenTelemetryLogger({\n * logRecordProcessor: new BatchLogRecordProcessor(\n * new OTLPLogExporter({\n * url: 'https://[org].ingest.sentry.io/api/[project]/integration/otlp/v1/logs',\n * headers: { 'x-sentry-auth': 'sentry sentry_key=...' }\n * })\n * )\n * });\n *\n * @example\n * // Then use logger as normal\n * import { Logger } from '@eventuras/logger';\n *\n * const logger = Logger.create({ namespace: 'MyService' });\n * logger.error({ error: err }, 'Something failed'); // Sent to OpenTelemetry backend\n */\n\nimport { Logger } from './Logger';\n\n/**\n * Minimal interface for an OpenTelemetry LogRecordProcessor.\n * Compatible with `@opentelemetry/sdk-logs` `LogRecordProcessor`.\n * Defined locally to avoid requiring OTel types at compile time.\n */\nexport interface LogRecordProcessor {\n shutdown(): Promise<void>;\n forceFlush(): Promise<void>;\n}\n\n/**\n * Minimal interface for an OpenTelemetry LoggerProvider.\n * Compatible with `@opentelemetry/sdk-logs` `LoggerProvider`.\n */\nexport interface OTelLoggerProvider {\n addLogRecordProcessor(processor: LogRecordProcessor): void;\n shutdown(): Promise<void>;\n forceFlush?(): Promise<void>;\n}\n\n/** Internal interface for Pino instrumentation */\ninterface PinoInstrumentationInstance {\n enable(): void;\n disable(): void;\n}\n\n// Lazy load OpenTelemetry packages to handle optional peer dependencies\nasync function loadOpenTelemetry() {\n try {\n const [pinoModule, logsModule] = await Promise.all([\n import('@opentelemetry/instrumentation-pino'),\n import('@opentelemetry/sdk-logs'),\n ]);\n return {\n PinoInstrumentation: pinoModule.PinoInstrumentation,\n LoggerProvider: logsModule.LoggerProvider\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Options for OpenTelemetry logger integration\n */\nexport type OpenTelemetryLoggerOptions = {\n /**\n * Log record processor (e.g., BatchLogRecordProcessor with an exporter).\n * If not provided, logs will only be instrumented but not exported.\n */\n logRecordProcessor?: LogRecordProcessor;\n\n /**\n * Logger provider instance. If not provided, a new one will be created.\n */\n loggerProvider?: OTelLoggerProvider;\n\n /**\n * Service name to attach to log records.\n * Defaults to the `OTEL_SERVICE_NAME` environment variable, or `'unknown-service'`.\n */\n serviceName?: string;\n\n /**\n * Whether to enable the integration. Default: true\n */\n enabled?: boolean;\n};\n\nlet pinoInstrumentation: PinoInstrumentationInstance | null = null;\nlet loggerProvider: OTelLoggerProvider | null = null;\n\n/**\n * Set up OpenTelemetry integration for Pino logger.\n *\n * This function:\n * 1. Creates or uses provided LoggerProvider\n * 2. Registers the log record processor (for exporting logs)\n * 3. Enables Pino instrumentation to bridge Pino logs to OTel\n *\n * Call this function once at application startup, before creating any loggers.\n *\n * @param options - Configuration options\n *\n * @example\n * // Send to Sentry via OTLP\n * import { setupOpenTelemetryLogger } from '@eventuras/logger';\n * import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\n * import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\n *\n * setupOpenTelemetryLogger({\n * logRecordProcessor: new BatchLogRecordProcessor(\n * new OTLPLogExporter({\n * url: process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT,\n * headers: {\n * 'x-sentry-auth': `sentry sentry_key=${process.env.SENTRY_KEY}`\n * }\n * })\n * )\n * });\n *\n * @example\n * // Use environment variables (recommended)\n * // Set these in your environment:\n * // OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://[org].ingest.sentry.io/api/[project]/integration/otlp/v1/logs\n * // OTEL_EXPORTER_OTLP_LOGS_HEADERS=x-sentry-auth=sentry sentry_key=...\n *\n * import { setupOpenTelemetryLogger } from '@eventuras/logger';\n * import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\n * import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\n *\n * await setupOpenTelemetryLogger({\n * logRecordProcessor: new BatchLogRecordProcessor(\n * new OTLPLogExporter() // Reads from env vars\n * )\n * });\n */\nexport async function setupOpenTelemetryLogger(\n options: OpenTelemetryLoggerOptions = {}\n): Promise<void> {\n // Check if we're running in a browser environment\n if (typeof window !== 'undefined') {\n Logger.warn({ namespace: 'logger:otel' }, 'OpenTelemetry integration is server-side only, skipping');\n return;\n }\n\n const {\n logRecordProcessor,\n loggerProvider: providedLoggerProvider,\n serviceName,\n enabled = true,\n } = options;\n\n if (!enabled) {\n Logger.debug({ namespace: 'logger:otel' }, 'OpenTelemetry integration disabled');\n return;\n }\n\n // Lazy load OpenTelemetry packages\n const otel = await loadOpenTelemetry();\n\n if (!otel) {\n Logger.warn(\n { namespace: 'logger:otel' },\n 'OpenTelemetry packages not available — integration disabled. Install @opentelemetry/api, @opentelemetry/api-logs, @opentelemetry/instrumentation-pino, and @opentelemetry/sdk-logs to enable.',\n );\n return;\n }\n\n const { PinoInstrumentation, LoggerProvider } = otel;\n\n // Clean up existing instrumentation if re-initializing\n if (pinoInstrumentation) {\n pinoInstrumentation.disable();\n pinoInstrumentation = null;\n }\n\n // Create or use provided logger provider\n loggerProvider = (providedLoggerProvider ?? new LoggerProvider()) as OTelLoggerProvider;\n\n // Register log record processor if provided\n if (logRecordProcessor && loggerProvider) {\n loggerProvider.addLogRecordProcessor(logRecordProcessor);\n }\n\n // Resolve service name from option, env var, or fallback\n const resolvedServiceName =\n serviceName ??\n (typeof process !== 'undefined' ? process.env?.OTEL_SERVICE_NAME : undefined) ??\n 'unknown-service';\n\n // Enable Pino instrumentation to bridge Pino logs to OpenTelemetry\n pinoInstrumentation = new PinoInstrumentation({\n logHook: (_span: unknown, record: Record<string, unknown>) => {\n record['service.name'] = resolvedServiceName;\n },\n }) as PinoInstrumentationInstance;\n\n pinoInstrumentation.enable();\n\n Logger.info(\n { namespace: 'logger:otel', context: { hasProcessor: Boolean(logRecordProcessor) } },\n 'OpenTelemetry integration enabled',\n );\n}\n\n/**\n * Shut down the OpenTelemetry logger integration.\n * Call this when your application is shutting down to flush any pending logs.\n *\n * @example\n * process.on('SIGTERM', async () => {\n * await shutdownOpenTelemetryLogger();\n * process.exit(0);\n * });\n */\nexport async function shutdownOpenTelemetryLogger(): Promise<void> {\n // Check if we're running in a browser environment\n if (typeof window !== 'undefined') {\n return;\n }\n\n if (pinoInstrumentation) {\n pinoInstrumentation.disable();\n pinoInstrumentation = null;\n }\n\n if (loggerProvider) {\n await loggerProvider.shutdown();\n loggerProvider = null;\n }\n\n Logger.info({ namespace: 'logger:otel' }, 'OpenTelemetry integration shut down');\n}\n\n/**\n * Get the active LoggerProvider instance, if any.\n * Useful for advanced use cases or debugging.\n */\nexport function getLoggerProvider(): OTelLoggerProvider | null {\n // Return null if in browser environment\n if (typeof window !== 'undefined') {\n return null;\n }\n\n return loggerProvider;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,eAAe,oBAAoB;AACjC,KAAI;EACF,MAAM,CAAC,YAAY,cAAc,MAAM,QAAQ,IAAI,CACjD,OAAO,wCACP,OAAO,2BACR,CAAC;AACF,SAAO;GACL,qBAAqB,WAAW;GAChC,gBAAgB,WAAW;GAC5B;SACK;AACN,SAAO;;;AA+BX,IAAI,sBAA0D;AAC9D,IAAI,iBAA4C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+ChD,eAAsB,yBACpB,UAAsC,EAAE,EACzB;AAEf,KAAI,OAAO,WAAW,aAAa;AACjC,SAAO,KAAK,EAAE,WAAW,eAAe,EAAE,0DAA0D;AACpG;;CAGF,MAAM,EACJ,oBACA,gBAAgB,wBAChB,aACA,UAAU,SACR;AAEJ,KAAI,CAAC,SAAS;AACZ,SAAO,MAAM,EAAE,WAAW,eAAe,EAAE,qCAAqC;AAChF;;CAIF,MAAM,OAAO,MAAM,mBAAmB;AAEtC,KAAI,CAAC,MAAM;AACT,SAAO,KACL,EAAE,WAAW,eAAe,EAC5B,gMACD;AACD;;CAGF,MAAM,EAAE,qBAAqB,mBAAmB;AAGhD,KAAI,qBAAqB;AACvB,sBAAoB,SAAS;AAC7B,wBAAsB;;AAIxB,kBAAkB,0BAA0B,IAAI,gBAAgB;AAGhE,KAAI,sBAAsB,eACxB,gBAAe,sBAAsB,mBAAmB;CAI1D,MAAM,sBACJ,gBACC,OAAO,YAAY,cAAc,QAAQ,KAAK,oBAAoB,KAAA,MACnE;AAGF,uBAAsB,IAAI,oBAAoB,EAC5C,UAAU,OAAgB,WAAoC;AAC5D,SAAO,kBAAkB;IAE5B,CAAC;AAEF,qBAAoB,QAAQ;AAE5B,QAAO,KACL;EAAE,WAAW;EAAe,SAAS,EAAE,cAAc,QAAQ,mBAAmB,EAAE;EAAE,EACpF,oCACD;;;;;;;;;;;;AAaH,eAAsB,8BAA6C;AAEjE,KAAI,OAAO,WAAW,YACpB;AAGF,KAAI,qBAAqB;AACvB,sBAAoB,SAAS;AAC7B,wBAAsB;;AAGxB,KAAI,gBAAgB;AAClB,QAAM,eAAe,UAAU;AAC/B,mBAAiB;;AAGnB,QAAO,KAAK,EAAE,WAAW,eAAe,EAAE,sCAAsC;;;;;;AAOlF,SAAgB,oBAA+C;AAE7D,KAAI,OAAO,WAAW,YACpB,QAAO;AAGT,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eventuras/logger",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "Structured logging with Pino and optional OpenTelemetry integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"logger",
|
|
@@ -45,12 +45,12 @@
|
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@opentelemetry/api": "^1.9.1",
|
|
48
|
-
"@opentelemetry/api-logs": "^0.
|
|
49
|
-
"@opentelemetry/instrumentation-pino": "^0.
|
|
50
|
-
"@opentelemetry/sdk-logs": "^0.
|
|
48
|
+
"@opentelemetry/api-logs": "^0.215.0",
|
|
49
|
+
"@opentelemetry/instrumentation-pino": "^0.61.0",
|
|
50
|
+
"@opentelemetry/sdk-logs": "^0.215.0",
|
|
51
51
|
"vite": "^8.0.8",
|
|
52
52
|
"vitest": "^4.1.4",
|
|
53
|
-
"@eventuras/vite-config": "0.2.
|
|
53
|
+
"@eventuras/vite-config": "0.2.2"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"@opentelemetry/api": "^1.9.0",
|