@loglayer/transport-google-cloud-logging 3.2.0 → 3.4.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/dist/index.cjs +26 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.mjs +26 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -4,10 +4,12 @@ let _loglayer_transport = require("@loglayer/transport");
|
|
|
4
4
|
var GoogleCloudLoggingTransport = class extends _loglayer_transport.BaseTransport {
|
|
5
5
|
rootLevelData;
|
|
6
6
|
rootLevelMetadataFields;
|
|
7
|
+
onError;
|
|
7
8
|
constructor(config) {
|
|
8
9
|
super(config);
|
|
9
10
|
this.rootLevelData = config.rootLevelData || {};
|
|
10
11
|
this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];
|
|
12
|
+
this.onError = config.onError;
|
|
11
13
|
}
|
|
12
14
|
mapLogLevel(level) {
|
|
13
15
|
switch (level) {
|
|
@@ -29,19 +31,32 @@ var GoogleCloudLoggingTransport = class extends _loglayer_transport.BaseTranspor
|
|
|
29
31
|
}
|
|
30
32
|
return metadata;
|
|
31
33
|
}
|
|
34
|
+
handleError(error) {
|
|
35
|
+
if (!this.onError) return;
|
|
36
|
+
try {
|
|
37
|
+
this.onError(error instanceof Error ? error : new Error(String(error)));
|
|
38
|
+
} catch {}
|
|
39
|
+
}
|
|
32
40
|
shipToLogger({ data, hasData, logLevel, messages }) {
|
|
33
41
|
const safeData = data && hasData ? data : {};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
try {
|
|
43
|
+
const metadata = this.extractLogEntryFields(safeData);
|
|
44
|
+
const entry = this.logger.entry({
|
|
45
|
+
...this.rootLevelData,
|
|
46
|
+
...metadata,
|
|
47
|
+
severity: this.mapLogLevel(logLevel),
|
|
48
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
49
|
+
}, {
|
|
50
|
+
...safeData,
|
|
51
|
+
message: messages.join(" ")
|
|
52
|
+
});
|
|
53
|
+
const writeResult = this.logger.write(entry);
|
|
54
|
+
if (writeResult && typeof writeResult.then === "function") writeResult.then(void 0, (error) => {
|
|
55
|
+
this.handleError(error);
|
|
56
|
+
});
|
|
57
|
+
} catch (error) {
|
|
58
|
+
this.handleError(error);
|
|
59
|
+
}
|
|
45
60
|
if (data && hasData) return [data, messages];
|
|
46
61
|
return [messages];
|
|
47
62
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["BaseTransport","LogLevel"],"sources":["../src/GoogleCloudLoggingTransport.ts"],"sourcesContent":["import type { Log, LogSync } from \"@google-cloud/logging\";\nimport type { LogEntry } from \"@google-cloud/logging/build/src/entry.js\";\nimport type { LogLayerTransportConfig, LogLayerTransportParams } from \"@loglayer/transport\";\nimport { BaseTransport, LogLevel, type LogLevelType } from \"@loglayer/transport\";\n\nexport interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {\n /**\n * The root level data to include for all log entries.\n * \"severity\", \"timestamp\" and \"jsonPayload\" are already populated by the transport.\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n */\n rootLevelData?: Omit<\n LogEntry,\n \"severity\" | \"timestamp\" | \"receiveTimestamp\" | \"jsonPayload\" | \"textPayload\" | \"protoPayload\"\n >;\n\n /**\n * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.\n */\n rootLevelMetadataFields?: Array<string>;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: GoogleCloudLoggingTransportConfig[\"rootLevelData\"];\n private rootLevelMetadataFields: Array<string>;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];\n }\n\n private mapLogLevel(level: LogLevelType): string {\n switch (level) {\n case LogLevel.fatal:\n return \"CRITICAL\";\n case LogLevel.error:\n return \"ERROR\";\n case LogLevel.warn:\n return \"WARNING\";\n case LogLevel.info:\n return \"INFO\";\n case LogLevel.debug:\n return \"DEBUG\";\n case LogLevel.trace:\n return \"DEBUG\";\n default:\n return \"DEFAULT\";\n }\n }\n\n private extractLogEntryFields(data: Record<string, unknown>) {\n const keys = Object.keys(data);\n const metadata: Record<string, unknown> = {};\n\n for (const key of keys) {\n if (this.rootLevelMetadataFields.includes(key)) {\n metadata[key] = data[key];\n delete data[key];\n }\n }\n\n return metadata;\n }\n\n shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n const safeData = data && hasData ? data : {};\n const metadata = this.extractLogEntryFields(safeData);\n\n
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["BaseTransport","LogLevel"],"sources":["../src/GoogleCloudLoggingTransport.ts"],"sourcesContent":["import type { Log, LogSync } from \"@google-cloud/logging\";\nimport type { LogEntry } from \"@google-cloud/logging/build/src/entry.js\";\nimport type { LogLayerTransportConfig, LogLayerTransportParams } from \"@loglayer/transport\";\nimport { BaseTransport, LogLevel, type LogLevelType } from \"@loglayer/transport\";\n\nexport interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {\n /**\n * The root level data to include for all log entries.\n * \"severity\", \"timestamp\" and \"jsonPayload\" are already populated by the transport.\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n */\n rootLevelData?: Omit<\n LogEntry,\n \"severity\" | \"timestamp\" | \"receiveTimestamp\" | \"jsonPayload\" | \"textPayload\" | \"protoPayload\"\n >;\n\n /**\n * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.\n */\n rootLevelMetadataFields?: Array<string>;\n\n /**\n * Callback to handle errors that occur when creating or writing log entries.\n *\n * Errors are caught by the transport (so logging failures never surface as\n * unhandled rejections or crash the application) and reported here. If `onError`\n * is not provided, errors are silently ignored.\n *\n * If the Google Cloud Logging client was created with a `defaultWriteDeleteCallback`,\n * API-level write failures are reported to that callback instead of rejecting the\n * `write()` promise. `onError` still receives failures that occur before the SDK\n * invokes that callback (for example, project or resource detection failures),\n * so the two are complementary.\n */\n onError?: (error: Error) => void;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: GoogleCloudLoggingTransportConfig[\"rootLevelData\"];\n private rootLevelMetadataFields: Array<string>;\n private onError?: (error: Error) => void;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];\n this.onError = config.onError;\n }\n\n private mapLogLevel(level: LogLevelType): string {\n switch (level) {\n case LogLevel.fatal:\n return \"CRITICAL\";\n case LogLevel.error:\n return \"ERROR\";\n case LogLevel.warn:\n return \"WARNING\";\n case LogLevel.info:\n return \"INFO\";\n case LogLevel.debug:\n return \"DEBUG\";\n case LogLevel.trace:\n return \"DEBUG\";\n default:\n return \"DEFAULT\";\n }\n }\n\n private extractLogEntryFields(data: Record<string, unknown>) {\n const keys = Object.keys(data);\n const metadata: Record<string, unknown> = {};\n\n for (const key of keys) {\n if (this.rootLevelMetadataFields.includes(key)) {\n metadata[key] = data[key];\n delete data[key];\n }\n }\n\n return metadata;\n }\n\n private handleError(error: unknown) {\n if (!this.onError) {\n return;\n }\n\n try {\n this.onError(error instanceof Error ? error : new Error(String(error)));\n } catch {\n // A throwing onError callback must never escape the transport\n }\n }\n\n shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n const safeData = data && hasData ? data : {};\n\n try {\n const metadata = this.extractLogEntryFields(safeData);\n\n const entry = this.logger.entry(\n {\n ...this.rootLevelData,\n ...metadata,\n severity: this.mapLogLevel(logLevel),\n timestamp: new Date(),\n },\n {\n ...safeData,\n message: messages.join(\" \"),\n },\n );\n\n // `Log.write()` returns a Promise that can reject for failures that happen before the\n // SDK's `defaultWriteDeleteCallback` is invoked (eg, project/resource detection).\n // `LogSync.write()` returns void. Handle both shapes so logging failures never surface\n // as unhandled rejections.\n const writeResult = this.logger.write(entry) as PromiseLike<unknown> | undefined;\n\n if (writeResult && typeof writeResult.then === \"function\") {\n writeResult.then(undefined, (error: unknown) => {\n this.handleError(error);\n });\n }\n } catch (error) {\n this.handleError(error);\n }\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"],"mappings":";;;AAqCA,IAAa,8BAAb,cAAiDA,oBAAAA,cAA6B;CAC5E;CACA;CACA;CAEA,YAAY,QAA2C;EACrD,MAAM,MAAM;EACZ,KAAK,gBAAgB,OAAO,iBAAiB,CAAC;EAC9C,KAAK,0BAA0B,OAAO,2BAA2B,CAAC;EAClE,KAAK,UAAU,OAAO;CACxB;CAEA,YAAoB,OAA6B;EAC/C,QAAQ,OAAR;GACE,KAAKC,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,MACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,MACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,SACE,OAAO;EACX;CACF;CAEA,sBAA8B,MAA+B;EAC3D,MAAM,OAAO,OAAO,KAAK,IAAI;EAC7B,MAAM,WAAoC,CAAC;EAE3C,KAAK,MAAM,OAAO,MAChB,IAAI,KAAK,wBAAwB,SAAS,GAAG,GAAG;GAC9C,SAAS,OAAO,KAAK;GACrB,OAAO,KAAK;EACd;EAGF,OAAO;CACT;CAEA,YAAoB,OAAgB;EAClC,IAAI,CAAC,KAAK,SACR;EAGF,IAAI;GACF,KAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;EACxE,QAAQ,CAER;CACF;CAEA,aAAa,EAAE,MAAM,SAAS,UAAU,YAA4C;EAClF,MAAM,WAAW,QAAQ,UAAU,OAAO,CAAC;EAE3C,IAAI;GACF,MAAM,WAAW,KAAK,sBAAsB,QAAQ;GAEpD,MAAM,QAAQ,KAAK,OAAO,MACxB;IACE,GAAG,KAAK;IACR,GAAG;IACH,UAAU,KAAK,YAAY,QAAQ;IACnC,2BAAW,IAAI,KAAK;GACtB,GACA;IACE,GAAG;IACH,SAAS,SAAS,KAAK,GAAG;GAC5B,CACF;GAMA,MAAM,cAAc,KAAK,OAAO,MAAM,KAAK;GAE3C,IAAI,eAAe,OAAO,YAAY,SAAS,YAC7C,YAAY,KAAK,KAAA,IAAY,UAAmB;IAC9C,KAAK,YAAY,KAAK;GACxB,CAAC;EAEL,SAAS,OAAO;GACd,KAAK,YAAY,KAAK;EACxB;EAEA,IAAI,QAAQ,SACV,OAAO,CAAC,MAAM,QAAQ;EAGxB,OAAO,CAAC,QAAQ;CAClB;AACF"}
|
package/dist/index.d.cts
CHANGED
|
@@ -14,13 +14,29 @@ interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log
|
|
|
14
14
|
* List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.
|
|
15
15
|
*/
|
|
16
16
|
rootLevelMetadataFields?: Array<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Callback to handle errors that occur when creating or writing log entries.
|
|
19
|
+
*
|
|
20
|
+
* Errors are caught by the transport (so logging failures never surface as
|
|
21
|
+
* unhandled rejections or crash the application) and reported here. If `onError`
|
|
22
|
+
* is not provided, errors are silently ignored.
|
|
23
|
+
*
|
|
24
|
+
* If the Google Cloud Logging client was created with a `defaultWriteDeleteCallback`,
|
|
25
|
+
* API-level write failures are reported to that callback instead of rejecting the
|
|
26
|
+
* `write()` promise. `onError` still receives failures that occur before the SDK
|
|
27
|
+
* invokes that callback (for example, project or resource detection failures),
|
|
28
|
+
* so the two are complementary.
|
|
29
|
+
*/
|
|
30
|
+
onError?: (error: Error) => void;
|
|
17
31
|
}
|
|
18
32
|
declare class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {
|
|
19
33
|
private rootLevelData;
|
|
20
34
|
private rootLevelMetadataFields;
|
|
35
|
+
private onError?;
|
|
21
36
|
constructor(config: GoogleCloudLoggingTransportConfig);
|
|
22
37
|
private mapLogLevel;
|
|
23
38
|
private extractLogEntryFields;
|
|
39
|
+
private handleError;
|
|
24
40
|
shipToLogger({
|
|
25
41
|
data,
|
|
26
42
|
hasData,
|
package/dist/index.d.mts
CHANGED
|
@@ -14,13 +14,29 @@ interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log
|
|
|
14
14
|
* List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.
|
|
15
15
|
*/
|
|
16
16
|
rootLevelMetadataFields?: Array<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Callback to handle errors that occur when creating or writing log entries.
|
|
19
|
+
*
|
|
20
|
+
* Errors are caught by the transport (so logging failures never surface as
|
|
21
|
+
* unhandled rejections or crash the application) and reported here. If `onError`
|
|
22
|
+
* is not provided, errors are silently ignored.
|
|
23
|
+
*
|
|
24
|
+
* If the Google Cloud Logging client was created with a `defaultWriteDeleteCallback`,
|
|
25
|
+
* API-level write failures are reported to that callback instead of rejecting the
|
|
26
|
+
* `write()` promise. `onError` still receives failures that occur before the SDK
|
|
27
|
+
* invokes that callback (for example, project or resource detection failures),
|
|
28
|
+
* so the two are complementary.
|
|
29
|
+
*/
|
|
30
|
+
onError?: (error: Error) => void;
|
|
17
31
|
}
|
|
18
32
|
declare class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {
|
|
19
33
|
private rootLevelData;
|
|
20
34
|
private rootLevelMetadataFields;
|
|
35
|
+
private onError?;
|
|
21
36
|
constructor(config: GoogleCloudLoggingTransportConfig);
|
|
22
37
|
private mapLogLevel;
|
|
23
38
|
private extractLogEntryFields;
|
|
39
|
+
private handleError;
|
|
24
40
|
shipToLogger({
|
|
25
41
|
data,
|
|
26
42
|
hasData,
|
package/dist/index.mjs
CHANGED
|
@@ -3,10 +3,12 @@ import { BaseTransport, LogLevel } from "@loglayer/transport";
|
|
|
3
3
|
var GoogleCloudLoggingTransport = class extends BaseTransport {
|
|
4
4
|
rootLevelData;
|
|
5
5
|
rootLevelMetadataFields;
|
|
6
|
+
onError;
|
|
6
7
|
constructor(config) {
|
|
7
8
|
super(config);
|
|
8
9
|
this.rootLevelData = config.rootLevelData || {};
|
|
9
10
|
this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];
|
|
11
|
+
this.onError = config.onError;
|
|
10
12
|
}
|
|
11
13
|
mapLogLevel(level) {
|
|
12
14
|
switch (level) {
|
|
@@ -28,19 +30,32 @@ var GoogleCloudLoggingTransport = class extends BaseTransport {
|
|
|
28
30
|
}
|
|
29
31
|
return metadata;
|
|
30
32
|
}
|
|
33
|
+
handleError(error) {
|
|
34
|
+
if (!this.onError) return;
|
|
35
|
+
try {
|
|
36
|
+
this.onError(error instanceof Error ? error : new Error(String(error)));
|
|
37
|
+
} catch {}
|
|
38
|
+
}
|
|
31
39
|
shipToLogger({ data, hasData, logLevel, messages }) {
|
|
32
40
|
const safeData = data && hasData ? data : {};
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
try {
|
|
42
|
+
const metadata = this.extractLogEntryFields(safeData);
|
|
43
|
+
const entry = this.logger.entry({
|
|
44
|
+
...this.rootLevelData,
|
|
45
|
+
...metadata,
|
|
46
|
+
severity: this.mapLogLevel(logLevel),
|
|
47
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
48
|
+
}, {
|
|
49
|
+
...safeData,
|
|
50
|
+
message: messages.join(" ")
|
|
51
|
+
});
|
|
52
|
+
const writeResult = this.logger.write(entry);
|
|
53
|
+
if (writeResult && typeof writeResult.then === "function") writeResult.then(void 0, (error) => {
|
|
54
|
+
this.handleError(error);
|
|
55
|
+
});
|
|
56
|
+
} catch (error) {
|
|
57
|
+
this.handleError(error);
|
|
58
|
+
}
|
|
44
59
|
if (data && hasData) return [data, messages];
|
|
45
60
|
return [messages];
|
|
46
61
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/GoogleCloudLoggingTransport.ts"],"sourcesContent":["import type { Log, LogSync } from \"@google-cloud/logging\";\nimport type { LogEntry } from \"@google-cloud/logging/build/src/entry.js\";\nimport type { LogLayerTransportConfig, LogLayerTransportParams } from \"@loglayer/transport\";\nimport { BaseTransport, LogLevel, type LogLevelType } from \"@loglayer/transport\";\n\nexport interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {\n /**\n * The root level data to include for all log entries.\n * \"severity\", \"timestamp\" and \"jsonPayload\" are already populated by the transport.\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n */\n rootLevelData?: Omit<\n LogEntry,\n \"severity\" | \"timestamp\" | \"receiveTimestamp\" | \"jsonPayload\" | \"textPayload\" | \"protoPayload\"\n >;\n\n /**\n * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.\n */\n rootLevelMetadataFields?: Array<string>;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: GoogleCloudLoggingTransportConfig[\"rootLevelData\"];\n private rootLevelMetadataFields: Array<string>;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];\n }\n\n private mapLogLevel(level: LogLevelType): string {\n switch (level) {\n case LogLevel.fatal:\n return \"CRITICAL\";\n case LogLevel.error:\n return \"ERROR\";\n case LogLevel.warn:\n return \"WARNING\";\n case LogLevel.info:\n return \"INFO\";\n case LogLevel.debug:\n return \"DEBUG\";\n case LogLevel.trace:\n return \"DEBUG\";\n default:\n return \"DEFAULT\";\n }\n }\n\n private extractLogEntryFields(data: Record<string, unknown>) {\n const keys = Object.keys(data);\n const metadata: Record<string, unknown> = {};\n\n for (const key of keys) {\n if (this.rootLevelMetadataFields.includes(key)) {\n metadata[key] = data[key];\n delete data[key];\n }\n }\n\n return metadata;\n }\n\n shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n const safeData = data && hasData ? data : {};\n const metadata = this.extractLogEntryFields(safeData);\n\n
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/GoogleCloudLoggingTransport.ts"],"sourcesContent":["import type { Log, LogSync } from \"@google-cloud/logging\";\nimport type { LogEntry } from \"@google-cloud/logging/build/src/entry.js\";\nimport type { LogLayerTransportConfig, LogLayerTransportParams } from \"@loglayer/transport\";\nimport { BaseTransport, LogLevel, type LogLevelType } from \"@loglayer/transport\";\n\nexport interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {\n /**\n * The root level data to include for all log entries.\n * \"severity\", \"timestamp\" and \"jsonPayload\" are already populated by the transport.\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n */\n rootLevelData?: Omit<\n LogEntry,\n \"severity\" | \"timestamp\" | \"receiveTimestamp\" | \"jsonPayload\" | \"textPayload\" | \"protoPayload\"\n >;\n\n /**\n * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.\n */\n rootLevelMetadataFields?: Array<string>;\n\n /**\n * Callback to handle errors that occur when creating or writing log entries.\n *\n * Errors are caught by the transport (so logging failures never surface as\n * unhandled rejections or crash the application) and reported here. If `onError`\n * is not provided, errors are silently ignored.\n *\n * If the Google Cloud Logging client was created with a `defaultWriteDeleteCallback`,\n * API-level write failures are reported to that callback instead of rejecting the\n * `write()` promise. `onError` still receives failures that occur before the SDK\n * invokes that callback (for example, project or resource detection failures),\n * so the two are complementary.\n */\n onError?: (error: Error) => void;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: GoogleCloudLoggingTransportConfig[\"rootLevelData\"];\n private rootLevelMetadataFields: Array<string>;\n private onError?: (error: Error) => void;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];\n this.onError = config.onError;\n }\n\n private mapLogLevel(level: LogLevelType): string {\n switch (level) {\n case LogLevel.fatal:\n return \"CRITICAL\";\n case LogLevel.error:\n return \"ERROR\";\n case LogLevel.warn:\n return \"WARNING\";\n case LogLevel.info:\n return \"INFO\";\n case LogLevel.debug:\n return \"DEBUG\";\n case LogLevel.trace:\n return \"DEBUG\";\n default:\n return \"DEFAULT\";\n }\n }\n\n private extractLogEntryFields(data: Record<string, unknown>) {\n const keys = Object.keys(data);\n const metadata: Record<string, unknown> = {};\n\n for (const key of keys) {\n if (this.rootLevelMetadataFields.includes(key)) {\n metadata[key] = data[key];\n delete data[key];\n }\n }\n\n return metadata;\n }\n\n private handleError(error: unknown) {\n if (!this.onError) {\n return;\n }\n\n try {\n this.onError(error instanceof Error ? error : new Error(String(error)));\n } catch {\n // A throwing onError callback must never escape the transport\n }\n }\n\n shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n const safeData = data && hasData ? data : {};\n\n try {\n const metadata = this.extractLogEntryFields(safeData);\n\n const entry = this.logger.entry(\n {\n ...this.rootLevelData,\n ...metadata,\n severity: this.mapLogLevel(logLevel),\n timestamp: new Date(),\n },\n {\n ...safeData,\n message: messages.join(\" \"),\n },\n );\n\n // `Log.write()` returns a Promise that can reject for failures that happen before the\n // SDK's `defaultWriteDeleteCallback` is invoked (eg, project/resource detection).\n // `LogSync.write()` returns void. Handle both shapes so logging failures never surface\n // as unhandled rejections.\n const writeResult = this.logger.write(entry) as PromiseLike<unknown> | undefined;\n\n if (writeResult && typeof writeResult.then === \"function\") {\n writeResult.then(undefined, (error: unknown) => {\n this.handleError(error);\n });\n }\n } catch (error) {\n this.handleError(error);\n }\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"],"mappings":";;AAqCA,IAAa,8BAAb,cAAiD,cAA6B;CAC5E;CACA;CACA;CAEA,YAAY,QAA2C;EACrD,MAAM,MAAM;EACZ,KAAK,gBAAgB,OAAO,iBAAiB,CAAC;EAC9C,KAAK,0BAA0B,OAAO,2BAA2B,CAAC;EAClE,KAAK,UAAU,OAAO;CACxB;CAEA,YAAoB,OAA6B;EAC/C,QAAQ,OAAR;GACE,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,MACZ,OAAO;GACT,KAAK,SAAS,MACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,SACE,OAAO;EACX;CACF;CAEA,sBAA8B,MAA+B;EAC3D,MAAM,OAAO,OAAO,KAAK,IAAI;EAC7B,MAAM,WAAoC,CAAC;EAE3C,KAAK,MAAM,OAAO,MAChB,IAAI,KAAK,wBAAwB,SAAS,GAAG,GAAG;GAC9C,SAAS,OAAO,KAAK;GACrB,OAAO,KAAK;EACd;EAGF,OAAO;CACT;CAEA,YAAoB,OAAgB;EAClC,IAAI,CAAC,KAAK,SACR;EAGF,IAAI;GACF,KAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;EACxE,QAAQ,CAER;CACF;CAEA,aAAa,EAAE,MAAM,SAAS,UAAU,YAA4C;EAClF,MAAM,WAAW,QAAQ,UAAU,OAAO,CAAC;EAE3C,IAAI;GACF,MAAM,WAAW,KAAK,sBAAsB,QAAQ;GAEpD,MAAM,QAAQ,KAAK,OAAO,MACxB;IACE,GAAG,KAAK;IACR,GAAG;IACH,UAAU,KAAK,YAAY,QAAQ;IACnC,2BAAW,IAAI,KAAK;GACtB,GACA;IACE,GAAG;IACH,SAAS,SAAS,KAAK,GAAG;GAC5B,CACF;GAMA,MAAM,cAAc,KAAK,OAAO,MAAM,KAAK;GAE3C,IAAI,eAAe,OAAO,YAAY,SAAS,YAC7C,YAAY,KAAK,KAAA,IAAY,UAAmB;IAC9C,KAAK,YAAY,KAAK;GACxB,CAAC;EAEL,SAAS,OAAO;GACd,KAAK,YAAY,KAAK;EACxB;EAEA,IAAI,QAAQ,SACV,OAAO,CAAC,MAAM,QAAQ;EAGxB,OAAO,CAAC,QAAQ;CAClB;AACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loglayer/transport-google-cloud-logging",
|
|
3
3
|
"description": "Google Cloud Logging (Stackdriver) transport for the LogLayer logging library.",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.4.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"transport"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@loglayer/transport": "3.
|
|
41
|
+
"@loglayer/transport": "3.3.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/node": "25.9.1",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"tsx": "4.22.3",
|
|
48
48
|
"typescript": "6.0.3",
|
|
49
49
|
"vitest": "4.1.7",
|
|
50
|
-
"
|
|
51
|
-
"
|
|
50
|
+
"loglayer": "9.4.0",
|
|
51
|
+
"@internal/tsconfig": "2.1.0"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
54
|
"@google-cloud/logging": "*"
|