@loglayer/transport-google-cloud-logging 2.1.4 → 2.2.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/README.md CHANGED
@@ -18,7 +18,7 @@ npm install @loglayer/transport-google-cloud-logging @google-cloud/logging seria
18
18
 
19
19
  This transport uses `log.entry(metadata, data)` as described in the library documentation.
20
20
 
21
- - The `metadata` portion is not the data from `withMetadata()` or `withContext()`. See the `rootLevelData` option
21
+ - The `metadata` portion is not the data from `withMetadata()` or `withContext()`. See the `rootLevelData` and `rootLevelMetadataFields` options
22
22
  for this transport on how to modify this value.
23
23
  - The `data` portion is actually the `jsonPayload` is what the transport uses for all LogLayer data.
24
24
  - The message data is stored in `jsonPayload.message`
@@ -54,8 +54,8 @@ logger.info("Hello from Cloud Run!");
54
54
 
55
55
  ### `rootLevelData`
56
56
 
57
- The root level data to include for all log entries.
58
- This is not the same as using `withContext()`, which would be included as part of the `jsonPayload`.
57
+ The root level metadata to include for all log entries.
58
+ This value is merged with metadata provided using `withContext()`.
59
59
 
60
60
  The `rootLevelData` option accepts any valid [Google Cloud LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry)
61
61
  fields except for `severity`, `timestamp`, and `jsonPayload` which are managed by the transport.
@@ -82,6 +82,56 @@ const logger = new LogLayer({
82
82
  });
83
83
  ```
84
84
 
85
+ ### `rootLevelMetadataFields`
86
+
87
+ By default, `withMetadata()` fields are forwarded as part of `jsonPayload` of the [LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry).
88
+
89
+ The `rootLevelMetadataFields` option accepts an array of field names to pluck from metadata and shallow merge with `rootLevelData`. This allows you to dynamically specify the metadata portion of a log entry.
90
+
91
+ ```typescript
92
+ const logger = new LogLayer({
93
+ transport: new GoogleCloudLoggingTransport({
94
+ logger: log,
95
+ rootLevelMetadataFields: ["labels"],
96
+ rootLevelData: {
97
+ labels: {
98
+ environment: "production",
99
+ location: "west",
100
+ },
101
+ },
102
+ }),
103
+ });
104
+
105
+ // This will overwrite `labels` in root level data.
106
+ // `customField` is still sent as part of `jsonPayload`.
107
+ logger
108
+ .withMetadata({ labels: { location: "east" }, customField: "example" })
109
+ .info("example")
110
+ ```
111
+
112
+ To allow mapping to every supported `LogEntry` metadata field, the following list is recommended:
113
+
114
+ ```typescript
115
+ const logger = new LogLayer({
116
+ transport: new GoogleCloudLoggingTransport({
117
+ logger: log,
118
+ rootLevelMetadataFields: [
119
+ "logName",
120
+ "resource",
121
+ "insertId",
122
+ "httpRequest",
123
+ "labels",
124
+ "operation",
125
+ "trace",
126
+ "spanId",
127
+ "traceSampled",
128
+ "sourceLocation",
129
+ "split",
130
+ ],
131
+ }),
132
+ });
133
+ ```
134
+
85
135
  ## Log Level Mapping
86
136
 
87
137
  LogLayer log levels are mapped to Google Cloud Logging severity levels as follows:
package/dist/index.cjs CHANGED
@@ -6,7 +6,7 @@ var GoogleCloudLoggingTransport = class extends _transport.BaseTransport {
6
6
  constructor(config) {
7
7
  super(config);
8
8
  this.rootLevelData = config.rootLevelData || {};
9
- this.level = _nullishCoalesce(config.level, () => ( _transport.LogLevel.trace));
9
+ this.rootLevelMetadataFields = _nullishCoalesce(config.rootLevelMetadataFields, () => ( []));
10
10
  }
11
11
  mapLogLevel(level) {
12
12
  switch (level) {
@@ -26,18 +26,29 @@ var GoogleCloudLoggingTransport = class extends _transport.BaseTransport {
26
26
  return "DEFAULT";
27
27
  }
28
28
  }
29
- shipToLogger({ data, hasData, logLevel, messages }) {
30
- if (_transport.LogLevelPriority[logLevel] < _transport.LogLevelPriority[this.level]) {
31
- return [];
29
+ extractLogEntryFields(data) {
30
+ const keys = Object.keys(data);
31
+ const metadata = {};
32
+ for (const key of keys) {
33
+ if (this.rootLevelMetadataFields.includes(key)) {
34
+ metadata[key] = data[key];
35
+ delete data[key];
36
+ }
32
37
  }
38
+ return metadata;
39
+ }
40
+ shipToLogger({ data, hasData, logLevel, messages }) {
41
+ const safeData = data && hasData ? data : {};
42
+ const metadata = this.extractLogEntryFields(safeData);
33
43
  const entry = this.logger.entry(
34
44
  {
35
45
  ...this.rootLevelData,
46
+ ...metadata,
36
47
  severity: this.mapLogLevel(logLevel),
37
48
  timestamp: /* @__PURE__ */ new Date()
38
49
  },
39
50
  {
40
- ...data && hasData ? data : {},
51
+ ...safeData,
41
52
  message: messages.join(" ")
42
53
  }
43
54
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/loglayer/loglayer/packages/transports/google-cloud-logging/dist/index.cjs","../src/GoogleCloudLoggingTransport.ts"],"names":[],"mappings":"AAAA;ACGA,gDAA6E;AAgBtE,IAAM,4BAAA,EAAN,MAAA,QAA0C,yBAA6B;AAAA,EACpE;AAAA,EACA;AAAA,EAER,WAAA,CAAY,MAAA,EAA2C;AACrD,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,cAAA,EAAgB,MAAA,CAAO,cAAA,GAAiB,CAAC,CAAA;AAC9C,IAAA,IAAA,CAAK,MAAA,mBAAQ,MAAA,CAAO,KAAA,UAAS,mBAAA,CAAS,OAAA;AAAA,EACxC;AAAA,EAEQ,WAAA,CAAY,KAAA,EAA6B;AAC/C,IAAA,OAAA,CAAQ,KAAA,EAAO;AAAA,MACb,KAAK,mBAAA,CAAS,KAAA;AACZ,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,mBAAA,CAAS,KAAA;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,mBAAA,CAAS,IAAA;AACZ,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,mBAAA,CAAS,IAAA;AACZ,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,mBAAA,CAAS,KAAA;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,mBAAA,CAAS,KAAA;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,OAAA;AACE,QAAA,OAAO,SAAA;AAAA,IACX;AAAA,EACF;AAAA,EAEA,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,SAAS,CAAA,EAAmC;AAElF,IAAA,GAAA,CAAI,2BAAA,CAAiB,QAAQ,EAAA,EAAI,2BAAA,CAAiB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7D,MAAA,OAAO,CAAC,CAAA;AAAA,IACV;AAEA,IAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACxB;AAAA,QACE,GAAG,IAAA,CAAK,aAAA;AAAA,QACR,QAAA,EAAU,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,QACnC,SAAA,kBAAW,IAAI,IAAA,CAAK;AAAA,MACtB,CAAA;AAAA,MACA;AAAA,QACE,GAAI,KAAA,GAAQ,QAAA,EAAU,KAAA,EAAO,CAAC,CAAA;AAAA,QAC9B,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,GAAG;AAAA,MAC5B;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAEvB,IAAA,GAAA,CAAI,KAAA,GAAQ,OAAA,EAAS;AACnB,MAAA,OAAO,CAAC,IAAA,EAAM,QAAQ,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,EAClB;AACF,CAAA;ADxBA;AACE;AACF,kEAAC","file":"/home/runner/work/loglayer/loglayer/packages/transports/google-cloud-logging/dist/index.cjs","sourcesContent":[null,"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, LogLevelPriority, 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<LogEntry, \"severity\" | \"timestamp\" | \"jsonPayload\">;\n\n /**\n * Minimum log level to process. Defaults to \"trace\"\n */\n level?: LogLevelType;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: Omit<LogEntry, \"severity\" | \"timestamp\" | \"jsonPayload\">;\n private level: LogLevelType;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.level = config.level ?? LogLevel.trace; // Default to trace to allow all logs\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 shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n // Skip if log level is lower priority than configured minimum\n if (LogLevelPriority[logLevel] < LogLevelPriority[this.level]) {\n return [];\n }\n\n const entry = this.logger.entry(\n {\n ...this.rootLevelData,\n severity: this.mapLogLevel(logLevel),\n timestamp: new Date(),\n },\n {\n ...(data && hasData ? data : {}),\n message: messages.join(\" \"),\n },\n );\n\n this.logger.write(entry);\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/loglayer/loglayer/packages/transports/google-cloud-logging/dist/index.cjs","../src/GoogleCloudLoggingTransport.ts"],"names":[],"mappings":"AAAA;ACGA,gDAA2D;AAmBpD,IAAM,4BAAA,EAAN,MAAA,QAA0C,yBAA6B;AAAA,EACpE;AAAA,EACA;AAAA,EAER,WAAA,CAAY,MAAA,EAA2C;AACrD,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,cAAA,EAAgB,MAAA,CAAO,cAAA,GAAiB,CAAC,CAAA;AAC9C,IAAA,IAAA,CAAK,wBAAA,mBAA0B,MAAA,CAAO,uBAAA,UAA2B,CAAC,GAAA;AAAA,EACpE;AAAA,EAEQ,WAAA,CAAY,KAAA,EAA6B;AAC/C,IAAA,OAAA,CAAQ,KAAA,EAAO;AAAA,MACb,KAAK,mBAAA,CAAS,KAAA;AACZ,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,mBAAA,CAAS,KAAA;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,mBAAA,CAAS,IAAA;AACZ,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,mBAAA,CAAS,IAAA;AACZ,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,mBAAA,CAAS,KAAA;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,mBAAA,CAAS,KAAA;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,OAAA;AACE,QAAA,OAAO,SAAA;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,qBAAA,CAAsB,IAAA,EAA+B;AAC3D,IAAA,MAAM,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC7B,IAAA,MAAM,SAAA,EAAoC,CAAC,CAAA;AAE3C,IAAA,IAAA,CAAA,MAAW,IAAA,GAAO,IAAA,EAAM;AACtB,MAAA,GAAA,CAAI,IAAA,CAAK,uBAAA,CAAwB,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,QAAA,QAAA,CAAS,GAAG,EAAA,EAAI,IAAA,CAAK,GAAG,CAAA;AACxB,QAAA,OAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,SAAS,CAAA,EAAmC;AAClF,IAAA,MAAM,SAAA,EAAW,KAAA,GAAQ,QAAA,EAAU,KAAA,EAAO,CAAC,CAAA;AAC3C,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,qBAAA,CAAsB,QAAQ,CAAA;AAEpD,IAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACxB;AAAA,QACE,GAAG,IAAA,CAAK,aAAA;AAAA,QACR,GAAG,QAAA;AAAA,QACH,QAAA,EAAU,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,QACnC,SAAA,kBAAW,IAAI,IAAA,CAAK;AAAA,MACtB,CAAA;AAAA,MACA;AAAA,QACE,GAAG,QAAA;AAAA,QACH,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,GAAG;AAAA,MAC5B;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAEvB,IAAA,GAAA,CAAI,KAAA,GAAQ,OAAA,EAAS;AACnB,MAAA,OAAO,CAAC,IAAA,EAAM,QAAQ,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,EAClB;AACF,CAAA;AD7BA;AACE;AACF,kEAAC","file":"/home/runner/work/loglayer/loglayer/packages/transports/google-cloud-logging/dist/index.cjs","sourcesContent":[null,"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 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 this.logger.write(entry);\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Log, LogSync } from '@google-cloud/logging';
2
2
  import { LogEntry } from '@google-cloud/logging/build/src/entry.js';
3
- import { BaseTransport, LogLayerTransportConfig, LogLevelType, LogLayerTransportParams } from '@loglayer/transport';
3
+ import { BaseTransport, LogLayerTransportConfig, LogLayerTransportParams } from '@loglayer/transport';
4
4
 
5
5
  interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {
6
6
  /**
@@ -8,17 +8,18 @@ interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log
8
8
  * "severity", "timestamp" and "jsonPayload" are already populated by the transport.
9
9
  * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
10
10
  */
11
- rootLevelData?: Omit<LogEntry, "severity" | "timestamp" | "jsonPayload">;
11
+ rootLevelData?: Omit<LogEntry, "severity" | "timestamp" | "receiveTimestamp" | "jsonPayload" | "textPayload" | "protoPayload">;
12
12
  /**
13
- * Minimum log level to process. Defaults to "trace"
13
+ * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.
14
14
  */
15
- level?: LogLevelType;
15
+ rootLevelMetadataFields?: Array<string>;
16
16
  }
17
17
  declare class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {
18
18
  private rootLevelData;
19
- private level;
19
+ private rootLevelMetadataFields;
20
20
  constructor(config: GoogleCloudLoggingTransportConfig);
21
21
  private mapLogLevel;
22
+ private extractLogEntryFields;
22
23
  shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[];
23
24
  }
24
25
 
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Log, LogSync } from '@google-cloud/logging';
2
2
  import { LogEntry } from '@google-cloud/logging/build/src/entry.js';
3
- import { BaseTransport, LogLayerTransportConfig, LogLevelType, LogLayerTransportParams } from '@loglayer/transport';
3
+ import { BaseTransport, LogLayerTransportConfig, LogLayerTransportParams } from '@loglayer/transport';
4
4
 
5
5
  interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {
6
6
  /**
@@ -8,17 +8,18 @@ interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log
8
8
  * "severity", "timestamp" and "jsonPayload" are already populated by the transport.
9
9
  * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
10
10
  */
11
- rootLevelData?: Omit<LogEntry, "severity" | "timestamp" | "jsonPayload">;
11
+ rootLevelData?: Omit<LogEntry, "severity" | "timestamp" | "receiveTimestamp" | "jsonPayload" | "textPayload" | "protoPayload">;
12
12
  /**
13
- * Minimum log level to process. Defaults to "trace"
13
+ * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.
14
14
  */
15
- level?: LogLevelType;
15
+ rootLevelMetadataFields?: Array<string>;
16
16
  }
17
17
  declare class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {
18
18
  private rootLevelData;
19
- private level;
19
+ private rootLevelMetadataFields;
20
20
  constructor(config: GoogleCloudLoggingTransportConfig);
21
21
  private mapLogLevel;
22
+ private extractLogEntryFields;
22
23
  shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[];
23
24
  }
24
25
 
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  // src/GoogleCloudLoggingTransport.ts
2
- import { BaseTransport, LogLevel, LogLevelPriority } from "@loglayer/transport";
2
+ import { BaseTransport, LogLevel } from "@loglayer/transport";
3
3
  var GoogleCloudLoggingTransport = class extends BaseTransport {
4
4
  rootLevelData;
5
- level;
5
+ rootLevelMetadataFields;
6
6
  constructor(config) {
7
7
  super(config);
8
8
  this.rootLevelData = config.rootLevelData || {};
9
- this.level = config.level ?? LogLevel.trace;
9
+ this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];
10
10
  }
11
11
  mapLogLevel(level) {
12
12
  switch (level) {
@@ -26,18 +26,29 @@ var GoogleCloudLoggingTransport = class extends BaseTransport {
26
26
  return "DEFAULT";
27
27
  }
28
28
  }
29
- shipToLogger({ data, hasData, logLevel, messages }) {
30
- if (LogLevelPriority[logLevel] < LogLevelPriority[this.level]) {
31
- return [];
29
+ extractLogEntryFields(data) {
30
+ const keys = Object.keys(data);
31
+ const metadata = {};
32
+ for (const key of keys) {
33
+ if (this.rootLevelMetadataFields.includes(key)) {
34
+ metadata[key] = data[key];
35
+ delete data[key];
36
+ }
32
37
  }
38
+ return metadata;
39
+ }
40
+ shipToLogger({ data, hasData, logLevel, messages }) {
41
+ const safeData = data && hasData ? data : {};
42
+ const metadata = this.extractLogEntryFields(safeData);
33
43
  const entry = this.logger.entry(
34
44
  {
35
45
  ...this.rootLevelData,
46
+ ...metadata,
36
47
  severity: this.mapLogLevel(logLevel),
37
48
  timestamp: /* @__PURE__ */ new Date()
38
49
  },
39
50
  {
40
- ...data && hasData ? data : {},
51
+ ...safeData,
41
52
  message: messages.join(" ")
42
53
  }
43
54
  );
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"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, LogLevelPriority, 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<LogEntry, \"severity\" | \"timestamp\" | \"jsonPayload\">;\n\n /**\n * Minimum log level to process. Defaults to \"trace\"\n */\n level?: LogLevelType;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: Omit<LogEntry, \"severity\" | \"timestamp\" | \"jsonPayload\">;\n private level: LogLevelType;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.level = config.level ?? LogLevel.trace; // Default to trace to allow all logs\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 shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n // Skip if log level is lower priority than configured minimum\n if (LogLevelPriority[logLevel] < LogLevelPriority[this.level]) {\n return [];\n }\n\n const entry = this.logger.entry(\n {\n ...this.rootLevelData,\n severity: this.mapLogLevel(logLevel),\n timestamp: new Date(),\n },\n {\n ...(data && hasData ? data : {}),\n message: messages.join(\" \"),\n },\n );\n\n this.logger.write(entry);\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"],"mappings":";AAGA,SAAS,eAAe,UAAU,wBAA2C;AAgBtE,IAAM,8BAAN,cAA0C,cAA6B;AAAA,EACpE;AAAA,EACA;AAAA,EAER,YAAY,QAA2C;AACrD,UAAM,MAAM;AACZ,SAAK,gBAAgB,OAAO,iBAAiB,CAAC;AAC9C,SAAK,QAAQ,OAAO,SAAS,SAAS;AAAA,EACxC;AAAA,EAEQ,YAAY,OAA6B;AAC/C,YAAQ,OAAO;AAAA,MACb,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,aAAa,EAAE,MAAM,SAAS,UAAU,SAAS,GAAmC;AAElF,QAAI,iBAAiB,QAAQ,IAAI,iBAAiB,KAAK,KAAK,GAAG;AAC7D,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,QAAQ,KAAK,OAAO;AAAA,MACxB;AAAA,QACE,GAAG,KAAK;AAAA,QACR,UAAU,KAAK,YAAY,QAAQ;AAAA,QACnC,WAAW,oBAAI,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,QACE,GAAI,QAAQ,UAAU,OAAO,CAAC;AAAA,QAC9B,SAAS,SAAS,KAAK,GAAG;AAAA,MAC5B;AAAA,IACF;AAEA,SAAK,OAAO,MAAM,KAAK;AAEvB,QAAI,QAAQ,SAAS;AACnB,aAAO,CAAC,MAAM,QAAQ;AAAA,IACxB;AAEA,WAAO,CAAC,QAAQ;AAAA,EAClB;AACF;","names":[]}
1
+ {"version":3,"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 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 this.logger.write(entry);\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"],"mappings":";AAGA,SAAS,eAAe,gBAAmC;AAmBpD,IAAM,8BAAN,cAA0C,cAA6B;AAAA,EACpE;AAAA,EACA;AAAA,EAER,YAAY,QAA2C;AACrD,UAAM,MAAM;AACZ,SAAK,gBAAgB,OAAO,iBAAiB,CAAC;AAC9C,SAAK,0BAA0B,OAAO,2BAA2B,CAAC;AAAA,EACpE;AAAA,EAEQ,YAAY,OAA6B;AAC/C,YAAQ,OAAO;AAAA,MACb,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT,KAAK,SAAS;AACZ,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,sBAAsB,MAA+B;AAC3D,UAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,UAAM,WAAoC,CAAC;AAE3C,eAAW,OAAO,MAAM;AACtB,UAAI,KAAK,wBAAwB,SAAS,GAAG,GAAG;AAC9C,iBAAS,GAAG,IAAI,KAAK,GAAG;AACxB,eAAO,KAAK,GAAG;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,EAAE,MAAM,SAAS,UAAU,SAAS,GAAmC;AAClF,UAAM,WAAW,QAAQ,UAAU,OAAO,CAAC;AAC3C,UAAM,WAAW,KAAK,sBAAsB,QAAQ;AAEpD,UAAM,QAAQ,KAAK,OAAO;AAAA,MACxB;AAAA,QACE,GAAG,KAAK;AAAA,QACR,GAAG;AAAA,QACH,UAAU,KAAK,YAAY,QAAQ;AAAA,QACnC,WAAW,oBAAI,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,SAAS,SAAS,KAAK,GAAG;AAAA,MAC5B;AAAA,IACF;AAEA,SAAK,OAAO,MAAM,KAAK;AAEvB,QAAI,QAAQ,SAAS;AACnB,aAAO,CAAC,MAAM,QAAQ;AAAA,IACxB;AAEA,WAAO,CAAC,QAAQ;AAAA,EAClB;AACF;","names":[]}
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": "2.1.4",
4
+ "version": "2.2.1",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.js",
@@ -37,16 +37,16 @@
37
37
  "transport"
38
38
  ],
39
39
  "dependencies": {
40
- "@loglayer/transport": "2.2.2"
40
+ "@loglayer/transport": "2.3.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@types/node": "24.3.1",
43
+ "@types/node": "24.6.1",
44
44
  "serialize-error": "12.0.0",
45
45
  "tsup": "8.5.0",
46
- "typescript": "5.9.2",
46
+ "typescript": "5.9.3",
47
47
  "vitest": "3.2.4",
48
- "tsx": "4.20.5",
49
- "loglayer": "6.7.0",
48
+ "tsx": "4.20.6",
49
+ "loglayer": "6.7.1",
50
50
  "@internal/tsconfig": "2.1.0"
51
51
  },
52
52
  "peerDependencies": {