@altinn/dialogporten-node-logger 1.104.1 → 1.113.4

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/index.d.ts CHANGED
@@ -4,8 +4,8 @@ export declare const createContextLogger: (context: Record<string | number | sym
4
4
  debug: pino.LogFn;
5
5
  info: pino.LogFn;
6
6
  warn: pino.LogFn;
7
- error: pino.LogFn;
8
- fatal: pino.LogFn;
7
+ error: (errorOrObj: Error | Record<string, unknown> | string, message?: string) => void;
8
+ fatal: (errorOrObj: Error | Record<string, unknown> | string, message?: string) => void;
9
9
  silent: pino.LogFn;
10
10
  };
11
11
  export declare const logger: {
@@ -13,8 +13,8 @@ export declare const logger: {
13
13
  debug: pino.LogFn;
14
14
  info: pino.LogFn;
15
15
  warn: pino.LogFn;
16
- error: pino.LogFn;
17
- fatal: pino.LogFn;
16
+ error: (errorOrObj: Error | Record<string, unknown> | string, message?: string) => void;
17
+ fatal: (errorOrObj: Error | Record<string, unknown> | string, message?: string) => void;
18
18
  silent: pino.LogFn;
19
19
  pinoLoggerInstance: import("pino").Logger<never>;
20
20
  };
package/dist/index.js CHANGED
@@ -11,6 +11,90 @@ const envVariables = z.object({
11
11
  });
12
12
  const env = envVariables.parse(process.env);
13
13
  console.info(`node-logger: Log level set to ${env.LOG_LEVEL}`);
14
+ /**
15
+ * Extracts exception attributes from an Error object according to OpenTelemetry semantic conventions.
16
+ * These attributes are required for Application Insights to recognize errors as exceptions.
17
+ * Only used when OTEL_EXPORTER_OTLP_ENDPOINT is defined.
18
+ */
19
+ const extractExceptionAttributes = (error) => {
20
+ if (error instanceof Error) {
21
+ return {
22
+ 'exception.type': error.constructor.name || 'Error',
23
+ 'exception.message': error.message || '',
24
+ 'exception.stacktrace': error.stack || '',
25
+ };
26
+ }
27
+ return {};
28
+ };
29
+ /**
30
+ * Wraps error logging to ensure OpenTelemetry exception attributes are included.
31
+ * This ensures Application Insights recognizes errors as exceptions, not just traces with severity level.
32
+ * Exception attributes are only added when OTEL_EXPORTER_OTLP_ENDPOINT is defined.
33
+ */
34
+ const createErrorLogger = (baseLogger) => {
35
+ const isOpenTelemetryEnabled = !!env.OTEL_EXPORTER_OTLP_ENDPOINT;
36
+ return (errorOrObj, message) => {
37
+ // Handle different call signatures: logger.error(error), logger.error(error, msg), logger.error(obj, msg)
38
+ if (errorOrObj instanceof Error) {
39
+ const exceptionAttrs = isOpenTelemetryEnabled ? extractExceptionAttributes(errorOrObj) : {};
40
+ if (message) {
41
+ baseLogger.error({ ...exceptionAttrs, err: errorOrObj }, message);
42
+ }
43
+ else {
44
+ baseLogger.error({ ...exceptionAttrs, err: errorOrObj });
45
+ }
46
+ }
47
+ else if (typeof errorOrObj === 'object' && errorOrObj !== null) {
48
+ // Check if the object contains an Error (common pattern: { err: Error })
49
+ const errorObj = errorOrObj;
50
+ const err = errorObj.err || errorObj.error || errorObj.exception;
51
+ if (err instanceof Error) {
52
+ const exceptionAttrs = isOpenTelemetryEnabled ? extractExceptionAttributes(err) : {};
53
+ baseLogger.error({ ...errorObj, ...exceptionAttrs, err }, message || '');
54
+ }
55
+ else {
56
+ // No error found, log as-is
57
+ baseLogger.error(errorOrObj, message || '');
58
+ }
59
+ }
60
+ else {
61
+ // String or other primitive
62
+ baseLogger.error(errorOrObj, message);
63
+ }
64
+ };
65
+ };
66
+ /**
67
+ * Wraps fatal logging to ensure OpenTelemetry exception attributes are included.
68
+ * Exception attributes are only added when OTEL_EXPORTER_OTLP_ENDPOINT is defined.
69
+ */
70
+ const createFatalLogger = (baseLogger) => {
71
+ const isOpenTelemetryEnabled = !!env.OTEL_EXPORTER_OTLP_ENDPOINT;
72
+ return (errorOrObj, message) => {
73
+ if (errorOrObj instanceof Error) {
74
+ const exceptionAttrs = isOpenTelemetryEnabled ? extractExceptionAttributes(errorOrObj) : {};
75
+ if (message) {
76
+ baseLogger.fatal({ ...exceptionAttrs, err: errorOrObj }, message);
77
+ }
78
+ else {
79
+ baseLogger.fatal({ ...exceptionAttrs, err: errorOrObj });
80
+ }
81
+ }
82
+ else if (typeof errorOrObj === 'object' && errorOrObj !== null) {
83
+ const errorObj = errorOrObj;
84
+ const err = errorObj.err || errorObj.error || errorObj.exception;
85
+ if (err instanceof Error) {
86
+ const exceptionAttrs = isOpenTelemetryEnabled ? extractExceptionAttributes(err) : {};
87
+ baseLogger.fatal({ ...errorObj, ...exceptionAttrs, err }, message || '');
88
+ }
89
+ else {
90
+ baseLogger.fatal(errorOrObj, message || '');
91
+ }
92
+ }
93
+ else {
94
+ baseLogger.fatal(errorOrObj, message);
95
+ }
96
+ };
97
+ };
14
98
  const openTelemetryTransport = {
15
99
  target: 'pino-opentelemetry-transport',
16
100
  };
@@ -50,8 +134,8 @@ export const createContextLogger = (context) => {
50
134
  debug: child.debug.bind(child),
51
135
  info: child.info.bind(child),
52
136
  warn: child.warn.bind(child),
53
- error: child.error.bind(child),
54
- fatal: child.fatal.bind(child),
137
+ error: createErrorLogger(child),
138
+ fatal: createFatalLogger(child),
55
139
  silent: child.silent.bind(child),
56
140
  };
57
141
  };
@@ -60,16 +144,17 @@ if (env.TEST_LOGGING) {
60
144
  pinoLogger.trace('Trace test');
61
145
  pinoLogger.info({ some: 'object' }, 'Info test');
62
146
  pinoLogger.warn('Consider this a warning');
63
- pinoLogger.error(new Error('Test error'), 'Error test');
64
- pinoLogger.fatal(new Error('Test error'), 'Fatal test');
147
+ // Use wrapped error logger to test exception attributes
148
+ createErrorLogger(pinoLogger)(new Error('Test error'), 'Error test');
149
+ createFatalLogger(pinoLogger)(new Error('Test error'), 'Fatal test');
65
150
  }
66
151
  export const logger = {
67
152
  trace: pinoLogger.trace.bind(pinoLogger),
68
153
  debug: pinoLogger.debug.bind(pinoLogger),
69
154
  info: pinoLogger.info.bind(pinoLogger),
70
155
  warn: pinoLogger.warn.bind(pinoLogger),
71
- error: pinoLogger.error.bind(pinoLogger),
72
- fatal: pinoLogger.fatal.bind(pinoLogger),
156
+ error: createErrorLogger(pinoLogger),
157
+ fatal: createFatalLogger(pinoLogger),
73
158
  silent: pinoLogger.silent.bind(pinoLogger),
74
159
  pinoLoggerInstance: pinoLogger,
75
160
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@altinn/dialogporten-node-logger",
3
- "version": "1.104.1",
3
+ "version": "1.113.4",
4
4
  "description": "A logger for nodejs",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/index.ts CHANGED
@@ -15,6 +15,89 @@ const env = envVariables.parse(process.env);
15
15
 
16
16
  console.info(`node-logger: Log level set to ${env.LOG_LEVEL}`);
17
17
 
18
+ /**
19
+ * Extracts exception attributes from an Error object according to OpenTelemetry semantic conventions.
20
+ * These attributes are required for Application Insights to recognize errors as exceptions.
21
+ * Only used when OTEL_EXPORTER_OTLP_ENDPOINT is defined.
22
+ */
23
+ const extractExceptionAttributes = (error: Error | unknown): Record<string, string> => {
24
+ if (error instanceof Error) {
25
+ return {
26
+ 'exception.type': error.constructor.name || 'Error',
27
+ 'exception.message': error.message || '',
28
+ 'exception.stacktrace': error.stack || '',
29
+ };
30
+ }
31
+ return {};
32
+ };
33
+
34
+ /**
35
+ * Wraps error logging to ensure OpenTelemetry exception attributes are included.
36
+ * This ensures Application Insights recognizes errors as exceptions, not just traces with severity level.
37
+ * Exception attributes are only added when OTEL_EXPORTER_OTLP_ENDPOINT is defined.
38
+ */
39
+ const createErrorLogger = (baseLogger: pino.Logger) => {
40
+ const isOpenTelemetryEnabled = !!env.OTEL_EXPORTER_OTLP_ENDPOINT;
41
+
42
+ return (errorOrObj: Error | Record<string, unknown> | string, message?: string) => {
43
+ // Handle different call signatures: logger.error(error), logger.error(error, msg), logger.error(obj, msg)
44
+ if (errorOrObj instanceof Error) {
45
+ const exceptionAttrs = isOpenTelemetryEnabled ? extractExceptionAttributes(errorOrObj) : {};
46
+ if (message) {
47
+ baseLogger.error({ ...exceptionAttrs, err: errorOrObj }, message);
48
+ } else {
49
+ baseLogger.error({ ...exceptionAttrs, err: errorOrObj });
50
+ }
51
+ } else if (typeof errorOrObj === 'object' && errorOrObj !== null) {
52
+ // Check if the object contains an Error (common pattern: { err: Error })
53
+ const errorObj = errorOrObj as Record<string, unknown>;
54
+ const err = errorObj.err || errorObj.error || errorObj.exception;
55
+
56
+ if (err instanceof Error) {
57
+ const exceptionAttrs = isOpenTelemetryEnabled ? extractExceptionAttributes(err) : {};
58
+ baseLogger.error({ ...errorObj, ...exceptionAttrs, err }, message || '');
59
+ } else {
60
+ // No error found, log as-is
61
+ baseLogger.error(errorOrObj, message || '');
62
+ }
63
+ } else {
64
+ // String or other primitive
65
+ baseLogger.error(errorOrObj, message);
66
+ }
67
+ };
68
+ };
69
+
70
+ /**
71
+ * Wraps fatal logging to ensure OpenTelemetry exception attributes are included.
72
+ * Exception attributes are only added when OTEL_EXPORTER_OTLP_ENDPOINT is defined.
73
+ */
74
+ const createFatalLogger = (baseLogger: pino.Logger) => {
75
+ const isOpenTelemetryEnabled = !!env.OTEL_EXPORTER_OTLP_ENDPOINT;
76
+
77
+ return (errorOrObj: Error | Record<string, unknown> | string, message?: string) => {
78
+ if (errorOrObj instanceof Error) {
79
+ const exceptionAttrs = isOpenTelemetryEnabled ? extractExceptionAttributes(errorOrObj) : {};
80
+ if (message) {
81
+ baseLogger.fatal({ ...exceptionAttrs, err: errorOrObj }, message);
82
+ } else {
83
+ baseLogger.fatal({ ...exceptionAttrs, err: errorOrObj });
84
+ }
85
+ } else if (typeof errorOrObj === 'object' && errorOrObj !== null) {
86
+ const errorObj = errorOrObj as Record<string, unknown>;
87
+ const err = errorObj.err || errorObj.error || errorObj.exception;
88
+
89
+ if (err instanceof Error) {
90
+ const exceptionAttrs = isOpenTelemetryEnabled ? extractExceptionAttributes(err) : {};
91
+ baseLogger.fatal({ ...errorObj, ...exceptionAttrs, err }, message || '');
92
+ } else {
93
+ baseLogger.fatal(errorOrObj, message || '');
94
+ }
95
+ } else {
96
+ baseLogger.fatal(errorOrObj, message);
97
+ }
98
+ };
99
+ };
100
+
18
101
  const openTelemetryTransport = {
19
102
  target: 'pino-opentelemetry-transport',
20
103
  };
@@ -61,8 +144,8 @@ export const createContextLogger = (context: Record<string | number | symbol, un
61
144
  debug: child.debug.bind(child),
62
145
  info: child.info.bind(child),
63
146
  warn: child.warn.bind(child),
64
- error: child.error.bind(child),
65
- fatal: child.fatal.bind(child),
147
+ error: createErrorLogger(child),
148
+ fatal: createFatalLogger(child),
66
149
  silent: child.silent.bind(child),
67
150
  };
68
151
  };
@@ -72,8 +155,9 @@ if (env.TEST_LOGGING) {
72
155
  pinoLogger.trace('Trace test');
73
156
  pinoLogger.info({ some: 'object' }, 'Info test');
74
157
  pinoLogger.warn('Consider this a warning');
75
- pinoLogger.error(new Error('Test error'), 'Error test');
76
- pinoLogger.fatal(new Error('Test error'), 'Fatal test');
158
+ // Use wrapped error logger to test exception attributes
159
+ createErrorLogger(pinoLogger)(new Error('Test error'), 'Error test');
160
+ createFatalLogger(pinoLogger)(new Error('Test error'), 'Fatal test');
77
161
  }
78
162
 
79
163
  export const logger = {
@@ -81,8 +165,8 @@ export const logger = {
81
165
  debug: pinoLogger.debug.bind(pinoLogger),
82
166
  info: pinoLogger.info.bind(pinoLogger),
83
167
  warn: pinoLogger.warn.bind(pinoLogger),
84
- error: pinoLogger.error.bind(pinoLogger),
85
- fatal: pinoLogger.fatal.bind(pinoLogger),
168
+ error: createErrorLogger(pinoLogger),
169
+ fatal: createFatalLogger(pinoLogger),
86
170
  silent: pinoLogger.silent.bind(pinoLogger),
87
171
  pinoLoggerInstance: pinoLogger,
88
172
  };