@logickernel/logger 0.6.0 → 0.7.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/README.md CHANGED
@@ -17,15 +17,17 @@ logger.warning("disk space low", { used: "92%", mount: "/data" });
17
17
 
18
18
  ## 1. Introduction
19
19
 
20
- - **What it is**: A tiny logging helper with the full GCP severity ladder and a smart backend:
21
- - In **GCP** (or when `SYSTEM_LOGS=gcp`): writes to Google Cloud Logging with proper severities and structured `jsonPayload` when a context object is provided.
22
- - Otherwise: writes to the local console with emoji prefixes, a local timestamp, and the context object inlined as compact JSON.
20
+ - **What it is**: A tiny logging helper with the full GCP severity ladder and a configurable backend:
21
+ - In **GCP** (or when `LOGGER_TARGET=gcp`): writes to Google Cloud Logging with proper severities and structured `jsonPayload` when a context object is provided.
22
+ - On the **console**: writes with emoji prefixes, a local timestamp, and the context object inlined as compact JSON.
23
+ - **Both at once**: set `LOGGER_TARGET=gcp,console` to fan out to both.
23
24
  - **Why it exists**: To avoid sprinkling environment-specific logging logic across your codebase. You import one `logger` and use it everywhere.
24
25
 
25
26
  **Key features**
26
27
 
27
28
  - **Zero config in GCP**: Uses `LOGGER_NAME` / `K_SERVICE` and `GCP_PROJECT` from the environment.
28
- - **Auto backend selection**: GCP vs console decided once at module load.
29
+ - **Auto backend selection**: GCP vs console decided once at module load; override with `LOGGER_TARGET`.
30
+ - **Multi-backend**: `LOGGER_TARGET` accepts a comma-separated list — `"gcp,console"` writes to both simultaneously.
29
31
  - **Full severity ladder**: `debug`, `info`, `notice`, `warning`, `error`, `critical`, `alert`, `emergency`.
30
32
  - **Structured context**: Pass a plain object as the last argument — it becomes a `jsonPayload` in GCP (queryable by field) and inline JSON in the console.
31
33
  - **Tiny API**: One default export (`logger`) plus a `formatMessage` helper if you need it.
@@ -71,9 +73,9 @@ The default export is a **singleton** whose backend is chosen at module load:
71
73
  | `info` | `INFO` | ⚪️ |
72
74
  | `notice` | `NOTICE` | 🔵 |
73
75
  | `warning` | `WARNING` | 🟡 |
74
- | `error` | `ERROR` | ⛔️ |
75
- | `critical` | `CRITICAL` | ❗️ |
76
- | `alert` | `ALERT` | 🔴 |
76
+ | `error` | `ERROR` | 🔴 |
77
+ | `critical` | `CRITICAL` | ⛔️ |
78
+ | `alert` | `ALERT` | ❗️ |
77
79
  | `emergency` | `EMERGENCY` | 🚨 |
78
80
 
79
81
  ### Structured context
@@ -91,7 +93,7 @@ logger.info("request complete", { method: "GET", path: "/api/users", status: 200
91
93
 
92
94
  By default, console logs are plain: `message [payload]` without emoji or timestamp.
93
95
 
94
- When `LOGGER_FORMAT=pretty`, console logs look like:
96
+ When `LOGGER_CONSOLE_FORMAT=pretty`, console logs look like:
95
97
 
96
98
  ```
97
99
  ⚪️ 2026-02-26 13:04:22.120 server started
@@ -109,10 +111,10 @@ This "pretty" format (emoji + local timestamp + message + optional payload) is m
109
111
  - `LOGGER_NAME`
110
112
  Log name in Google Cloud Logging. Falls back to `K_SERVICE`, then `"local"`.
111
113
 
112
- - `LOGGER_TARGET`
113
- Optional override for the backend: `"gcp"` forces the GCP logger when possible, `"console"` forces the console logger.
114
+ - `LOGGER_TARGET`
115
+ Comma-separated list of backends to activate: `"gcp"`, `"console"`, or `"gcp,console"` for both simultaneously. When unset, GCP is used if `GCP_PROJECT` is set, otherwise console.
114
116
 
115
- - `LOGGER_FORMAT`
117
+ - `LOGGER_CONSOLE_FORMAT`
116
118
  Controls the console output format. When set to `"pretty"`, uses emoji + timestamp lines (mirroring the feel of GCP Logging's console UI); otherwise (default) prints plain `message [payload]` without emoji or timestamp.
117
119
 
118
120
  - `K_SERVICE`
package/dist/index.cjs CHANGED
@@ -38,14 +38,18 @@ ${arg.stack}` : "");
38
38
  }
39
39
  }).join(" ");
40
40
  }
41
- var LOGGER_TARGET = process.env.LOGGER_TARGET?.toLowerCase();
42
- var LOGGER_FORMAT = process.env.LOGGER_FORMAT?.toLowerCase();
43
- var FORCE_GCP = LOGGER_TARGET === "gcp";
44
- var FORCE_CONSOLE = LOGGER_TARGET === "console";
45
- var USE_GCP = !FORCE_CONSOLE && (FORCE_GCP || !!process.env.GCP_PROJECT);
46
- var CONSOLE_PRETTY = LOGGER_FORMAT === "pretty";
41
+ var rawTargets = process.env.LOGGER_TARGET;
42
+ var targets = rawTargets ? new Set(rawTargets.toLowerCase().split(",").map((s) => s.trim()).filter(Boolean)) : null;
43
+ var USE_GCP = targets ? targets.has("gcp") : !!process.env.GCP_PROJECT;
44
+ var USE_CONSOLE = targets ? targets.has("console") : !process.env.GCP_PROJECT;
45
+ var CONSOLE_PRETTY = process.env.LOGGER_CONSOLE_FORMAT?.toLowerCase() === "pretty";
47
46
  var noop = () => {
48
47
  };
48
+ var gcpLabels = {};
49
+ if (process.env.ENVIRONMENT) gcpLabels.environment = process.env.ENVIRONMENT;
50
+ if (process.env.SERVICE_ID) gcpLabels.service_id = process.env.SERVICE_ID;
51
+ if (process.env.VERSION) gcpLabels.version = process.env.VERSION;
52
+ var GCP_ENV_LABEL = Object.keys(gcpLabels).length ? { labels: gcpLabels } : {};
49
53
  function consoleLine(emoji, args) {
50
54
  const d = /* @__PURE__ */ new Date();
51
55
  const ts = d.toLocaleString("sv-SE") + "." + String(d.getMilliseconds()).padStart(3, "0");
@@ -69,101 +73,117 @@ function gcpPayload(args) {
69
73
  }
70
74
  return formatMessage(args);
71
75
  }
72
- var gcpLog = null;
76
+ var backends = [];
73
77
  if (USE_GCP) {
74
78
  try {
75
79
  const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? "local";
76
- gcpLog = new import_logging.Logging({ projectId: process.env.GCP_PROJECT }).log(logName);
80
+ const g = new import_logging.Logging({ projectId: process.env.GCP_PROJECT }).log(logName);
81
+ backends.push({
82
+ debug: (...args) => {
83
+ g.write(g.entry({ severity: "DEBUG", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
84
+ },
85
+ info: (...args) => {
86
+ g.write(g.entry({ severity: "INFO", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
87
+ },
88
+ notice: (...args) => {
89
+ g.write(g.entry({ severity: "NOTICE", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
90
+ },
91
+ warning: (...args) => {
92
+ g.write(g.entry({ severity: "WARNING", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
93
+ },
94
+ error: (...args) => {
95
+ g.write(g.entry({ severity: "ERROR", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
96
+ },
97
+ critical: (...args) => {
98
+ g.write(g.entry({ severity: "CRITICAL", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
99
+ },
100
+ alert: (...args) => {
101
+ g.write(g.entry({ severity: "ALERT", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
102
+ },
103
+ emergency: (...args) => {
104
+ g.write(g.entry({ severity: "EMERGENCY", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
105
+ }
106
+ });
77
107
  } catch {
78
108
  }
79
109
  }
80
- var logger = gcpLog ? /* @__PURE__ */ (() => {
81
- const g = gcpLog;
82
- return {
110
+ if (USE_CONSOLE || backends.length === 0) {
111
+ backends.push(CONSOLE_PRETTY ? {
83
112
  debug: (...args) => {
84
- const mapped = args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a);
85
- g.write(g.entry({ severity: "DEBUG" }, gcpPayload(mapped))).catch(noop);
113
+ console.log(consoleLine("\u{1F41E}", args));
86
114
  },
87
115
  info: (...args) => {
88
- g.write(g.entry({ severity: "INFO" }, gcpPayload(args))).catch(noop);
116
+ console.log(consoleLine("\u26AA\uFE0F", args));
89
117
  },
90
118
  notice: (...args) => {
91
- g.write(g.entry({ severity: "NOTICE" }, gcpPayload(args))).catch(noop);
119
+ console.log(consoleLine("\u{1F535}", args));
92
120
  },
93
121
  warning: (...args) => {
94
- g.write(g.entry({ severity: "WARNING" }, gcpPayload(args))).catch(noop);
122
+ console.log(consoleLine("\u{1F7E1}", args));
95
123
  },
96
124
  error: (...args) => {
97
- g.write(g.entry({ severity: "ERROR" }, gcpPayload(args))).catch(noop);
125
+ console.log(consoleLine("\u{1F534}", args));
98
126
  },
99
127
  critical: (...args) => {
100
- g.write(g.entry({ severity: "CRITICAL" }, gcpPayload(args))).catch(noop);
128
+ console.log(consoleLine("\u26D4\uFE0F", args));
101
129
  },
102
130
  alert: (...args) => {
103
- g.write(g.entry({ severity: "ALERT" }, gcpPayload(args))).catch(noop);
131
+ console.log(consoleLine("\u2757\uFE0F", args));
104
132
  },
105
133
  emergency: (...args) => {
106
- g.write(g.entry({ severity: "EMERGENCY" }, gcpPayload(args))).catch(noop);
134
+ console.log(consoleLine("\u{1F6A8}", args));
107
135
  }
108
- };
109
- })() : CONSOLE_PRETTY ? {
110
- debug: (...args) => {
111
- console.log(
112
- consoleLine(
113
- "\u{1F41E}",
114
- args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)
115
- )
116
- );
117
- },
118
- info: (...args) => {
119
- console.log(consoleLine("\u26AA\uFE0F", args));
120
- },
121
- notice: (...args) => {
122
- console.log(consoleLine("\u{1F535}", args));
123
- },
124
- warning: (...args) => {
125
- console.log(consoleLine("\u{1F7E1}", args));
126
- },
127
- error: (...args) => {
128
- console.log(consoleLine("\u{1F534}", args));
129
- },
130
- critical: (...args) => {
131
- console.log(consoleLine("\u26D4\uFE0F", args));
132
- },
133
- alert: (...args) => {
134
- console.log(consoleLine("\u2757\uFE0F", args));
135
- },
136
- emergency: (...args) => {
137
- console.log(consoleLine("\u{1F6A8}", args));
138
- }
139
- } : {
136
+ } : {
137
+ debug: (...args) => {
138
+ console.log(consolePlain(args));
139
+ },
140
+ info: (...args) => {
141
+ console.log(consolePlain(args));
142
+ },
143
+ notice: (...args) => {
144
+ console.log(consolePlain(args));
145
+ },
146
+ warning: (...args) => {
147
+ console.log(consolePlain(args));
148
+ },
149
+ error: (...args) => {
150
+ console.log(consolePlain(args));
151
+ },
152
+ critical: (...args) => {
153
+ console.log(consolePlain(args));
154
+ },
155
+ alert: (...args) => {
156
+ console.log(consolePlain(args));
157
+ },
158
+ emergency: (...args) => {
159
+ console.log(consolePlain(args));
160
+ }
161
+ });
162
+ }
163
+ var logger = backends.length === 1 ? backends[0] : {
140
164
  debug: (...args) => {
141
- console.log(
142
- consolePlain(
143
- args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)
144
- )
145
- );
165
+ backends.forEach((b) => b.debug(...args));
146
166
  },
147
167
  info: (...args) => {
148
- console.log(consolePlain(args));
168
+ backends.forEach((b) => b.info(...args));
149
169
  },
150
170
  notice: (...args) => {
151
- console.log(consolePlain(args));
171
+ backends.forEach((b) => b.notice(...args));
152
172
  },
153
173
  warning: (...args) => {
154
- console.log(consolePlain(args));
174
+ backends.forEach((b) => b.warning(...args));
155
175
  },
156
176
  error: (...args) => {
157
- console.log(consolePlain(args));
177
+ backends.forEach((b) => b.error(...args));
158
178
  },
159
179
  critical: (...args) => {
160
- console.log(consolePlain(args));
180
+ backends.forEach((b) => b.critical(...args));
161
181
  },
162
182
  alert: (...args) => {
163
- console.log(consolePlain(args));
183
+ backends.forEach((b) => b.alert(...args));
164
184
  },
165
185
  emergency: (...args) => {
166
- console.log(consolePlain(args));
186
+ backends.forEach((b) => b.emergency(...args));
167
187
  }
168
188
  };
169
189
  var index_default = logger;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Logging } from \"@google-cloud/logging\";\n\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n notice: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n critical: (...args: unknown[]) => void;\n alert: (...args: unknown[]) => void;\n emergency: (...args: unknown[]) => void;\n}\n\nexport function formatMessage(args: unknown[]): string {\n return args.map(arg => {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return arg.message + (arg.stack ? `\\n${arg.stack}` : \"\");\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }).join(\" \");\n}\n\n// Resolved once at module load — no per-call branching.\nconst LOGGER_TARGET = process.env.LOGGER_TARGET?.toLowerCase();\nconst LOGGER_FORMAT = process.env.LOGGER_FORMAT?.toLowerCase();\nconst FORCE_GCP = LOGGER_TARGET === \"gcp\";\nconst FORCE_CONSOLE = LOGGER_TARGET === \"console\";\nconst USE_GCP = !FORCE_CONSOLE && (FORCE_GCP || !!process.env.GCP_PROJECT);\nconst CONSOLE_PRETTY = LOGGER_FORMAT === \"pretty\";\nconst noop = (): void => {};\n\n// Formats a single console log line: \"{emoji} {local timestamp} {message} [{payload}]\"\nfunction consoleLine(emoji: string, args: unknown[]): string {\n const d = new Date();\n const ts = d.toLocaleString(\"sv-SE\") + \".\" + String(d.getMilliseconds()).padStart(3, \"0\");\n const last = args[args.length - 1];\n const hasPayload = args.length >= 2 && last !== null && typeof last === \"object\" && !Array.isArray(last) && !(last instanceof Error);\n const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);\n const suffix = hasPayload ? \" \" + JSON.stringify(last, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n return `${emoji} ${ts} ${msg}${suffix}`;\n}\n\n// Plain console line: \"message [{payload}]\"\nfunction consolePlain(args: unknown[]): string {\n const last = args[args.length - 1];\n const hasPayload =\n args.length >= 2 &&\n last !== null &&\n typeof last === \"object\" &&\n !Array.isArray(last) &&\n !(last instanceof Error);\n const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);\n const suffix = hasPayload ? \" \" + JSON.stringify(last, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n return `${msg}${suffix}`;\n}\n\n// If the last arg is a plain object, return a jsonPayload so Cloud Logging\n// indexes its fields. Otherwise return a plain string (textPayload).\nfunction gcpPayload(args: unknown[]): string | Record<string, unknown> {\n const last = args[args.length - 1];\n if (\n args.length >= 2 &&\n last !== null &&\n typeof last === \"object\" &&\n !Array.isArray(last) &&\n !(last instanceof Error)\n ) {\n return { message: formatMessage(args.slice(0, -1)), ...(last as Record<string, unknown>) };\n }\n return formatMessage(args);\n}\n\nlet gcpLog: ReturnType<Logging[\"log\"]> | null = null;\nif (USE_GCP) {\n try {\n const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? \"local\";\n gcpLog = new Logging({ projectId: process.env.GCP_PROJECT }).log(logName);\n } catch {\n // GCP init failed; fall back to console\n }\n}\n\nexport const logger: Logger = gcpLog\n ? (() => {\n const g = gcpLog!;\n return {\n debug: (...args: unknown[]): void => {\n const mapped = args.map(a => (typeof a === \"string\" ? a.replace(/\\n/g, \" \") : a));\n g.write(g.entry({ severity: \"DEBUG\" }, gcpPayload(mapped))).catch(noop);\n },\n info: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"INFO\" }, gcpPayload(args))).catch(noop);\n },\n notice: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"NOTICE\" }, gcpPayload(args))).catch(noop);\n },\n warning: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"WARNING\" }, gcpPayload(args))).catch(noop);\n },\n error: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"ERROR\" }, gcpPayload(args))).catch(noop);\n },\n critical: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"CRITICAL\" }, gcpPayload(args))).catch(noop);\n },\n alert: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"ALERT\" }, gcpPayload(args))).catch(noop);\n },\n emergency: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"EMERGENCY\" }, gcpPayload(args))).catch(noop);\n },\n };\n })()\n : CONSOLE_PRETTY\n ? {\n debug: (...args: unknown[]): void => {\n console.log(\n consoleLine(\n \"🐞\",\n args.map(a => (typeof a === \"string\" ? a.replace(/\\n/g, \" \") : a)),\n ),\n );\n },\n info: (...args: unknown[]): void => { console.log(consoleLine(\"⚪️\", args)); },\n notice: (...args: unknown[]): void => { console.log(consoleLine(\"🔵\", args)); },\n warning: (...args: unknown[]): void => { console.log(consoleLine(\"🟡\", args)); },\n error: (...args: unknown[]): void => { console.log(consoleLine(\"🔴\", args)); },\n critical: (...args: unknown[]): void => { console.log(consoleLine(\"⛔️\", args)); },\n alert: (...args: unknown[]): void => { console.log(consoleLine(\"❗️\", args)); },\n emergency: (...args: unknown[]): void => { console.log(consoleLine(\"🚨\", args)); },\n }\n : {\n debug: (...args: unknown[]): void => {\n console.log(\n consolePlain(\n args.map(a => (typeof a === \"string\" ? a.replace(/\\n/g, \" \") : a)),\n ),\n );\n },\n info: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n notice: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n warning: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n error: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n critical: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n alert: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n emergency: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n };\n\nexport default logger;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Logging } from \"@google-cloud/logging\";\n\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n notice: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n critical: (...args: unknown[]) => void;\n alert: (...args: unknown[]) => void;\n emergency: (...args: unknown[]) => void;\n}\n\nexport function formatMessage(args: unknown[]): string {\n return args.map(arg => {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return arg.message + (arg.stack ? `\\n${arg.stack}` : \"\");\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }).join(\" \");\n}\n\n// Resolved once at module load — no per-call branching.\n// LOGGER_TARGET accepts a comma-separated list of backends: \"gcp\", \"console\", or \"gcp,console\".\nconst rawTargets = process.env.LOGGER_TARGET;\nconst targets = rawTargets\n ? new Set(rawTargets.toLowerCase().split(\",\").map(s => s.trim()).filter(Boolean))\n : null;\n\nconst USE_GCP = targets ? targets.has(\"gcp\") : !!process.env.GCP_PROJECT;\nconst USE_CONSOLE = targets ? targets.has(\"console\") : !process.env.GCP_PROJECT;\nconst CONSOLE_PRETTY = process.env.LOGGER_CONSOLE_FORMAT?.toLowerCase() === \"pretty\";\nconst noop = (): void => {};\nconst gcpLabels: Record<string, string> = {};\nif (process.env.ENVIRONMENT) gcpLabels.environment = process.env.ENVIRONMENT;\nif (process.env.SERVICE_ID) gcpLabels.service_id = process.env.SERVICE_ID;\nif (process.env.VERSION) gcpLabels.version = process.env.VERSION;\nconst GCP_ENV_LABEL = Object.keys(gcpLabels).length ? { labels: gcpLabels } : {};\n\n// Formats a single console log line: \"{emoji} {local timestamp} {message} [{payload}]\"\nfunction consoleLine(emoji: string, args: unknown[]): string {\n const d = new Date();\n const ts = d.toLocaleString(\"sv-SE\") + \".\" + String(d.getMilliseconds()).padStart(3, \"0\");\n const last = args[args.length - 1];\n const hasPayload = args.length >= 2 && last !== null && typeof last === \"object\" && !Array.isArray(last) && !(last instanceof Error);\n const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);\n const suffix = hasPayload ? \" \" + JSON.stringify(last, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n return `${emoji} ${ts} ${msg}${suffix}`;\n}\n\n// Plain console line: \"message [{payload}]\"\nfunction consolePlain(args: unknown[]): string {\n const last = args[args.length - 1];\n const hasPayload =\n args.length >= 2 &&\n last !== null &&\n typeof last === \"object\" &&\n !Array.isArray(last) &&\n !(last instanceof Error);\n const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);\n const suffix = hasPayload ? \" \" + JSON.stringify(last, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n return `${msg}${suffix}`;\n}\n\n// If the last arg is a plain object, return a jsonPayload so Cloud Logging\n// indexes its fields. Otherwise return a plain string (textPayload).\nfunction gcpPayload(args: unknown[]): string | Record<string, unknown> {\n const last = args[args.length - 1];\n if (\n args.length >= 2 &&\n last !== null &&\n typeof last === \"object\" &&\n !Array.isArray(last) &&\n !(last instanceof Error)\n ) {\n return { message: formatMessage(args.slice(0, -1)), ...(last as Record<string, unknown>) };\n }\n return formatMessage(args);\n}\n\nconst backends: Logger[] = [];\n\nif (USE_GCP) {\n try {\n const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? \"local\";\n const g = new Logging({ projectId: process.env.GCP_PROJECT }).log(logName);\n backends.push({\n debug: (...args: unknown[]): void => { g.write(g.entry({ severity: \"DEBUG\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n info: (...args: unknown[]): void => { g.write(g.entry({ severity: \"INFO\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n notice: (...args: unknown[]): void => { g.write(g.entry({ severity: \"NOTICE\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n warning: (...args: unknown[]): void => { g.write(g.entry({ severity: \"WARNING\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n error: (...args: unknown[]): void => { g.write(g.entry({ severity: \"ERROR\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n critical: (...args: unknown[]): void => { g.write(g.entry({ severity: \"CRITICAL\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n alert: (...args: unknown[]): void => { g.write(g.entry({ severity: \"ALERT\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n emergency: (...args: unknown[]): void => { g.write(g.entry({ severity: \"EMERGENCY\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n });\n } catch {\n // GCP init failed; will fall back to console\n }\n}\n\nif (USE_CONSOLE || backends.length === 0) {\n backends.push(CONSOLE_PRETTY\n ? {\n debug: (...args: unknown[]): void => { console.log(consoleLine(\"🐞\", args)); },\n info: (...args: unknown[]): void => { console.log(consoleLine(\"⚪️\", args)); },\n notice: (...args: unknown[]): void => { console.log(consoleLine(\"🔵\", args)); },\n warning: (...args: unknown[]): void => { console.log(consoleLine(\"🟡\", args)); },\n error: (...args: unknown[]): void => { console.log(consoleLine(\"🔴\", args)); },\n critical: (...args: unknown[]): void => { console.log(consoleLine(\"⛔️\", args)); },\n alert: (...args: unknown[]): void => { console.log(consoleLine(\"❗️\", args)); },\n emergency: (...args: unknown[]): void => { console.log(consoleLine(\"🚨\", args)); },\n }\n : {\n debug: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n info: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n notice: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n warning: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n error: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n critical: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n alert: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n emergency: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n });\n}\n\nexport const logger: Logger =\n backends.length === 1\n ? backends[0]\n : {\n debug: (...args: unknown[]): void => { backends.forEach(b => b.debug(...args)); },\n info: (...args: unknown[]): void => { backends.forEach(b => b.info(...args)); },\n notice: (...args: unknown[]): void => { backends.forEach(b => b.notice(...args)); },\n warning: (...args: unknown[]): void => { backends.forEach(b => b.warning(...args)); },\n error: (...args: unknown[]): void => { backends.forEach(b => b.error(...args)); },\n critical: (...args: unknown[]): void => { backends.forEach(b => b.critical(...args)); },\n alert: (...args: unknown[]): void => { backends.forEach(b => b.alert(...args)); },\n emergency: (...args: unknown[]): void => { backends.forEach(b => b.emergency(...args)); },\n };\n\nexport default logger;\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -12,14 +12,18 @@ ${arg.stack}` : "");
12
12
  }
13
13
  }).join(" ");
14
14
  }
15
- var LOGGER_TARGET = process.env.LOGGER_TARGET?.toLowerCase();
16
- var LOGGER_FORMAT = process.env.LOGGER_FORMAT?.toLowerCase();
17
- var FORCE_GCP = LOGGER_TARGET === "gcp";
18
- var FORCE_CONSOLE = LOGGER_TARGET === "console";
19
- var USE_GCP = !FORCE_CONSOLE && (FORCE_GCP || !!process.env.GCP_PROJECT);
20
- var CONSOLE_PRETTY = LOGGER_FORMAT === "pretty";
15
+ var rawTargets = process.env.LOGGER_TARGET;
16
+ var targets = rawTargets ? new Set(rawTargets.toLowerCase().split(",").map((s) => s.trim()).filter(Boolean)) : null;
17
+ var USE_GCP = targets ? targets.has("gcp") : !!process.env.GCP_PROJECT;
18
+ var USE_CONSOLE = targets ? targets.has("console") : !process.env.GCP_PROJECT;
19
+ var CONSOLE_PRETTY = process.env.LOGGER_CONSOLE_FORMAT?.toLowerCase() === "pretty";
21
20
  var noop = () => {
22
21
  };
22
+ var gcpLabels = {};
23
+ if (process.env.ENVIRONMENT) gcpLabels.environment = process.env.ENVIRONMENT;
24
+ if (process.env.SERVICE_ID) gcpLabels.service_id = process.env.SERVICE_ID;
25
+ if (process.env.VERSION) gcpLabels.version = process.env.VERSION;
26
+ var GCP_ENV_LABEL = Object.keys(gcpLabels).length ? { labels: gcpLabels } : {};
23
27
  function consoleLine(emoji, args) {
24
28
  const d = /* @__PURE__ */ new Date();
25
29
  const ts = d.toLocaleString("sv-SE") + "." + String(d.getMilliseconds()).padStart(3, "0");
@@ -43,101 +47,117 @@ function gcpPayload(args) {
43
47
  }
44
48
  return formatMessage(args);
45
49
  }
46
- var gcpLog = null;
50
+ var backends = [];
47
51
  if (USE_GCP) {
48
52
  try {
49
53
  const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? "local";
50
- gcpLog = new Logging({ projectId: process.env.GCP_PROJECT }).log(logName);
54
+ const g = new Logging({ projectId: process.env.GCP_PROJECT }).log(logName);
55
+ backends.push({
56
+ debug: (...args) => {
57
+ g.write(g.entry({ severity: "DEBUG", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
58
+ },
59
+ info: (...args) => {
60
+ g.write(g.entry({ severity: "INFO", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
61
+ },
62
+ notice: (...args) => {
63
+ g.write(g.entry({ severity: "NOTICE", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
64
+ },
65
+ warning: (...args) => {
66
+ g.write(g.entry({ severity: "WARNING", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
67
+ },
68
+ error: (...args) => {
69
+ g.write(g.entry({ severity: "ERROR", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
70
+ },
71
+ critical: (...args) => {
72
+ g.write(g.entry({ severity: "CRITICAL", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
73
+ },
74
+ alert: (...args) => {
75
+ g.write(g.entry({ severity: "ALERT", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
76
+ },
77
+ emergency: (...args) => {
78
+ g.write(g.entry({ severity: "EMERGENCY", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
79
+ }
80
+ });
51
81
  } catch {
52
82
  }
53
83
  }
54
- var logger = gcpLog ? /* @__PURE__ */ (() => {
55
- const g = gcpLog;
56
- return {
84
+ if (USE_CONSOLE || backends.length === 0) {
85
+ backends.push(CONSOLE_PRETTY ? {
57
86
  debug: (...args) => {
58
- const mapped = args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a);
59
- g.write(g.entry({ severity: "DEBUG" }, gcpPayload(mapped))).catch(noop);
87
+ console.log(consoleLine("\u{1F41E}", args));
60
88
  },
61
89
  info: (...args) => {
62
- g.write(g.entry({ severity: "INFO" }, gcpPayload(args))).catch(noop);
90
+ console.log(consoleLine("\u26AA\uFE0F", args));
63
91
  },
64
92
  notice: (...args) => {
65
- g.write(g.entry({ severity: "NOTICE" }, gcpPayload(args))).catch(noop);
93
+ console.log(consoleLine("\u{1F535}", args));
66
94
  },
67
95
  warning: (...args) => {
68
- g.write(g.entry({ severity: "WARNING" }, gcpPayload(args))).catch(noop);
96
+ console.log(consoleLine("\u{1F7E1}", args));
69
97
  },
70
98
  error: (...args) => {
71
- g.write(g.entry({ severity: "ERROR" }, gcpPayload(args))).catch(noop);
99
+ console.log(consoleLine("\u{1F534}", args));
72
100
  },
73
101
  critical: (...args) => {
74
- g.write(g.entry({ severity: "CRITICAL" }, gcpPayload(args))).catch(noop);
102
+ console.log(consoleLine("\u26D4\uFE0F", args));
75
103
  },
76
104
  alert: (...args) => {
77
- g.write(g.entry({ severity: "ALERT" }, gcpPayload(args))).catch(noop);
105
+ console.log(consoleLine("\u2757\uFE0F", args));
78
106
  },
79
107
  emergency: (...args) => {
80
- g.write(g.entry({ severity: "EMERGENCY" }, gcpPayload(args))).catch(noop);
108
+ console.log(consoleLine("\u{1F6A8}", args));
81
109
  }
82
- };
83
- })() : CONSOLE_PRETTY ? {
84
- debug: (...args) => {
85
- console.log(
86
- consoleLine(
87
- "\u{1F41E}",
88
- args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)
89
- )
90
- );
91
- },
92
- info: (...args) => {
93
- console.log(consoleLine("\u26AA\uFE0F", args));
94
- },
95
- notice: (...args) => {
96
- console.log(consoleLine("\u{1F535}", args));
97
- },
98
- warning: (...args) => {
99
- console.log(consoleLine("\u{1F7E1}", args));
100
- },
101
- error: (...args) => {
102
- console.log(consoleLine("\u{1F534}", args));
103
- },
104
- critical: (...args) => {
105
- console.log(consoleLine("\u26D4\uFE0F", args));
106
- },
107
- alert: (...args) => {
108
- console.log(consoleLine("\u2757\uFE0F", args));
109
- },
110
- emergency: (...args) => {
111
- console.log(consoleLine("\u{1F6A8}", args));
112
- }
113
- } : {
110
+ } : {
111
+ debug: (...args) => {
112
+ console.log(consolePlain(args));
113
+ },
114
+ info: (...args) => {
115
+ console.log(consolePlain(args));
116
+ },
117
+ notice: (...args) => {
118
+ console.log(consolePlain(args));
119
+ },
120
+ warning: (...args) => {
121
+ console.log(consolePlain(args));
122
+ },
123
+ error: (...args) => {
124
+ console.log(consolePlain(args));
125
+ },
126
+ critical: (...args) => {
127
+ console.log(consolePlain(args));
128
+ },
129
+ alert: (...args) => {
130
+ console.log(consolePlain(args));
131
+ },
132
+ emergency: (...args) => {
133
+ console.log(consolePlain(args));
134
+ }
135
+ });
136
+ }
137
+ var logger = backends.length === 1 ? backends[0] : {
114
138
  debug: (...args) => {
115
- console.log(
116
- consolePlain(
117
- args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)
118
- )
119
- );
139
+ backends.forEach((b) => b.debug(...args));
120
140
  },
121
141
  info: (...args) => {
122
- console.log(consolePlain(args));
142
+ backends.forEach((b) => b.info(...args));
123
143
  },
124
144
  notice: (...args) => {
125
- console.log(consolePlain(args));
145
+ backends.forEach((b) => b.notice(...args));
126
146
  },
127
147
  warning: (...args) => {
128
- console.log(consolePlain(args));
148
+ backends.forEach((b) => b.warning(...args));
129
149
  },
130
150
  error: (...args) => {
131
- console.log(consolePlain(args));
151
+ backends.forEach((b) => b.error(...args));
132
152
  },
133
153
  critical: (...args) => {
134
- console.log(consolePlain(args));
154
+ backends.forEach((b) => b.critical(...args));
135
155
  },
136
156
  alert: (...args) => {
137
- console.log(consolePlain(args));
157
+ backends.forEach((b) => b.alert(...args));
138
158
  },
139
159
  emergency: (...args) => {
140
- console.log(consolePlain(args));
160
+ backends.forEach((b) => b.emergency(...args));
141
161
  }
142
162
  };
143
163
  var index_default = logger;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Logging } from \"@google-cloud/logging\";\n\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n notice: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n critical: (...args: unknown[]) => void;\n alert: (...args: unknown[]) => void;\n emergency: (...args: unknown[]) => void;\n}\n\nexport function formatMessage(args: unknown[]): string {\n return args.map(arg => {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return arg.message + (arg.stack ? `\\n${arg.stack}` : \"\");\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }).join(\" \");\n}\n\n// Resolved once at module load — no per-call branching.\nconst LOGGER_TARGET = process.env.LOGGER_TARGET?.toLowerCase();\nconst LOGGER_FORMAT = process.env.LOGGER_FORMAT?.toLowerCase();\nconst FORCE_GCP = LOGGER_TARGET === \"gcp\";\nconst FORCE_CONSOLE = LOGGER_TARGET === \"console\";\nconst USE_GCP = !FORCE_CONSOLE && (FORCE_GCP || !!process.env.GCP_PROJECT);\nconst CONSOLE_PRETTY = LOGGER_FORMAT === \"pretty\";\nconst noop = (): void => {};\n\n// Formats a single console log line: \"{emoji} {local timestamp} {message} [{payload}]\"\nfunction consoleLine(emoji: string, args: unknown[]): string {\n const d = new Date();\n const ts = d.toLocaleString(\"sv-SE\") + \".\" + String(d.getMilliseconds()).padStart(3, \"0\");\n const last = args[args.length - 1];\n const hasPayload = args.length >= 2 && last !== null && typeof last === \"object\" && !Array.isArray(last) && !(last instanceof Error);\n const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);\n const suffix = hasPayload ? \" \" + JSON.stringify(last, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n return `${emoji} ${ts} ${msg}${suffix}`;\n}\n\n// Plain console line: \"message [{payload}]\"\nfunction consolePlain(args: unknown[]): string {\n const last = args[args.length - 1];\n const hasPayload =\n args.length >= 2 &&\n last !== null &&\n typeof last === \"object\" &&\n !Array.isArray(last) &&\n !(last instanceof Error);\n const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);\n const suffix = hasPayload ? \" \" + JSON.stringify(last, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n return `${msg}${suffix}`;\n}\n\n// If the last arg is a plain object, return a jsonPayload so Cloud Logging\n// indexes its fields. Otherwise return a plain string (textPayload).\nfunction gcpPayload(args: unknown[]): string | Record<string, unknown> {\n const last = args[args.length - 1];\n if (\n args.length >= 2 &&\n last !== null &&\n typeof last === \"object\" &&\n !Array.isArray(last) &&\n !(last instanceof Error)\n ) {\n return { message: formatMessage(args.slice(0, -1)), ...(last as Record<string, unknown>) };\n }\n return formatMessage(args);\n}\n\nlet gcpLog: ReturnType<Logging[\"log\"]> | null = null;\nif (USE_GCP) {\n try {\n const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? \"local\";\n gcpLog = new Logging({ projectId: process.env.GCP_PROJECT }).log(logName);\n } catch {\n // GCP init failed; fall back to console\n }\n}\n\nexport const logger: Logger = gcpLog\n ? (() => {\n const g = gcpLog!;\n return {\n debug: (...args: unknown[]): void => {\n const mapped = args.map(a => (typeof a === \"string\" ? a.replace(/\\n/g, \" \") : a));\n g.write(g.entry({ severity: \"DEBUG\" }, gcpPayload(mapped))).catch(noop);\n },\n info: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"INFO\" }, gcpPayload(args))).catch(noop);\n },\n notice: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"NOTICE\" }, gcpPayload(args))).catch(noop);\n },\n warning: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"WARNING\" }, gcpPayload(args))).catch(noop);\n },\n error: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"ERROR\" }, gcpPayload(args))).catch(noop);\n },\n critical: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"CRITICAL\" }, gcpPayload(args))).catch(noop);\n },\n alert: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"ALERT\" }, gcpPayload(args))).catch(noop);\n },\n emergency: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"EMERGENCY\" }, gcpPayload(args))).catch(noop);\n },\n };\n })()\n : CONSOLE_PRETTY\n ? {\n debug: (...args: unknown[]): void => {\n console.log(\n consoleLine(\n \"🐞\",\n args.map(a => (typeof a === \"string\" ? a.replace(/\\n/g, \" \") : a)),\n ),\n );\n },\n info: (...args: unknown[]): void => { console.log(consoleLine(\"⚪️\", args)); },\n notice: (...args: unknown[]): void => { console.log(consoleLine(\"🔵\", args)); },\n warning: (...args: unknown[]): void => { console.log(consoleLine(\"🟡\", args)); },\n error: (...args: unknown[]): void => { console.log(consoleLine(\"🔴\", args)); },\n critical: (...args: unknown[]): void => { console.log(consoleLine(\"⛔️\", args)); },\n alert: (...args: unknown[]): void => { console.log(consoleLine(\"❗️\", args)); },\n emergency: (...args: unknown[]): void => { console.log(consoleLine(\"🚨\", args)); },\n }\n : {\n debug: (...args: unknown[]): void => {\n console.log(\n consolePlain(\n args.map(a => (typeof a === \"string\" ? a.replace(/\\n/g, \" \") : a)),\n ),\n );\n },\n info: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n notice: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n warning: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n error: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n critical: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n alert: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n emergency: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n };\n\nexport default logger;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Logging } from \"@google-cloud/logging\";\n\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n notice: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n critical: (...args: unknown[]) => void;\n alert: (...args: unknown[]) => void;\n emergency: (...args: unknown[]) => void;\n}\n\nexport function formatMessage(args: unknown[]): string {\n return args.map(arg => {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return arg.message + (arg.stack ? `\\n${arg.stack}` : \"\");\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }).join(\" \");\n}\n\n// Resolved once at module load — no per-call branching.\n// LOGGER_TARGET accepts a comma-separated list of backends: \"gcp\", \"console\", or \"gcp,console\".\nconst rawTargets = process.env.LOGGER_TARGET;\nconst targets = rawTargets\n ? new Set(rawTargets.toLowerCase().split(\",\").map(s => s.trim()).filter(Boolean))\n : null;\n\nconst USE_GCP = targets ? targets.has(\"gcp\") : !!process.env.GCP_PROJECT;\nconst USE_CONSOLE = targets ? targets.has(\"console\") : !process.env.GCP_PROJECT;\nconst CONSOLE_PRETTY = process.env.LOGGER_CONSOLE_FORMAT?.toLowerCase() === \"pretty\";\nconst noop = (): void => {};\nconst gcpLabels: Record<string, string> = {};\nif (process.env.ENVIRONMENT) gcpLabels.environment = process.env.ENVIRONMENT;\nif (process.env.SERVICE_ID) gcpLabels.service_id = process.env.SERVICE_ID;\nif (process.env.VERSION) gcpLabels.version = process.env.VERSION;\nconst GCP_ENV_LABEL = Object.keys(gcpLabels).length ? { labels: gcpLabels } : {};\n\n// Formats a single console log line: \"{emoji} {local timestamp} {message} [{payload}]\"\nfunction consoleLine(emoji: string, args: unknown[]): string {\n const d = new Date();\n const ts = d.toLocaleString(\"sv-SE\") + \".\" + String(d.getMilliseconds()).padStart(3, \"0\");\n const last = args[args.length - 1];\n const hasPayload = args.length >= 2 && last !== null && typeof last === \"object\" && !Array.isArray(last) && !(last instanceof Error);\n const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);\n const suffix = hasPayload ? \" \" + JSON.stringify(last, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n return `${emoji} ${ts} ${msg}${suffix}`;\n}\n\n// Plain console line: \"message [{payload}]\"\nfunction consolePlain(args: unknown[]): string {\n const last = args[args.length - 1];\n const hasPayload =\n args.length >= 2 &&\n last !== null &&\n typeof last === \"object\" &&\n !Array.isArray(last) &&\n !(last instanceof Error);\n const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);\n const suffix = hasPayload ? \" \" + JSON.stringify(last, null, 2).replace(/\\n\\s*/g, \" \") : \"\";\n return `${msg}${suffix}`;\n}\n\n// If the last arg is a plain object, return a jsonPayload so Cloud Logging\n// indexes its fields. Otherwise return a plain string (textPayload).\nfunction gcpPayload(args: unknown[]): string | Record<string, unknown> {\n const last = args[args.length - 1];\n if (\n args.length >= 2 &&\n last !== null &&\n typeof last === \"object\" &&\n !Array.isArray(last) &&\n !(last instanceof Error)\n ) {\n return { message: formatMessage(args.slice(0, -1)), ...(last as Record<string, unknown>) };\n }\n return formatMessage(args);\n}\n\nconst backends: Logger[] = [];\n\nif (USE_GCP) {\n try {\n const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? \"local\";\n const g = new Logging({ projectId: process.env.GCP_PROJECT }).log(logName);\n backends.push({\n debug: (...args: unknown[]): void => { g.write(g.entry({ severity: \"DEBUG\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n info: (...args: unknown[]): void => { g.write(g.entry({ severity: \"INFO\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n notice: (...args: unknown[]): void => { g.write(g.entry({ severity: \"NOTICE\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n warning: (...args: unknown[]): void => { g.write(g.entry({ severity: \"WARNING\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n error: (...args: unknown[]): void => { g.write(g.entry({ severity: \"ERROR\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n critical: (...args: unknown[]): void => { g.write(g.entry({ severity: \"CRITICAL\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n alert: (...args: unknown[]): void => { g.write(g.entry({ severity: \"ALERT\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n emergency: (...args: unknown[]): void => { g.write(g.entry({ severity: \"EMERGENCY\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop); },\n });\n } catch {\n // GCP init failed; will fall back to console\n }\n}\n\nif (USE_CONSOLE || backends.length === 0) {\n backends.push(CONSOLE_PRETTY\n ? {\n debug: (...args: unknown[]): void => { console.log(consoleLine(\"🐞\", args)); },\n info: (...args: unknown[]): void => { console.log(consoleLine(\"⚪️\", args)); },\n notice: (...args: unknown[]): void => { console.log(consoleLine(\"🔵\", args)); },\n warning: (...args: unknown[]): void => { console.log(consoleLine(\"🟡\", args)); },\n error: (...args: unknown[]): void => { console.log(consoleLine(\"🔴\", args)); },\n critical: (...args: unknown[]): void => { console.log(consoleLine(\"⛔️\", args)); },\n alert: (...args: unknown[]): void => { console.log(consoleLine(\"❗️\", args)); },\n emergency: (...args: unknown[]): void => { console.log(consoleLine(\"🚨\", args)); },\n }\n : {\n debug: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n info: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n notice: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n warning: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n error: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n critical: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n alert: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n emergency: (...args: unknown[]): void => { console.log(consolePlain(args)); },\n });\n}\n\nexport const logger: Logger =\n backends.length === 1\n ? backends[0]\n : {\n debug: (...args: unknown[]): void => { backends.forEach(b => b.debug(...args)); },\n info: (...args: unknown[]): void => { backends.forEach(b => b.info(...args)); },\n notice: (...args: unknown[]): void => { backends.forEach(b => b.notice(...args)); },\n warning: (...args: unknown[]): void => { backends.forEach(b => b.warning(...args)); },\n error: (...args: unknown[]): void => { backends.forEach(b => b.error(...args)); },\n critical: (...args: unknown[]): void => { backends.forEach(b => b.critical(...args)); },\n alert: (...args: unknown[]): void => { backends.forEach(b => b.alert(...args)); },\n emergency: (...args: unknown[]): void => { backends.forEach(b => b.emergency(...args)); },\n };\n\nexport default logger;\n"],"mappings":";AAAA,SAAS,eAAe;AAajB,SAAS,cAAc,MAAyB;AACrD,SAAO,KAAK,IAAI,SAAO;AACrB,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,eAAe,MAAO,QAAO,IAAI,WAAW,IAAI,QAAQ;AAAA,EAAK,IAAI,KAAK,KAAK;AAC/E,QAAI;AACF,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B,QAAQ;AACN,aAAO,OAAO,GAAG;AAAA,IACnB;AAAA,EACF,CAAC,EAAE,KAAK,GAAG;AACb;AAIA,IAAM,aAAa,QAAQ,IAAI;AAC/B,IAAM,UAAU,aACZ,IAAI,IAAI,WAAW,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,IAC9E;AAEJ,IAAM,UAAc,UAAU,QAAQ,IAAI,KAAK,IAAO,CAAC,CAAC,QAAQ,IAAI;AACpE,IAAM,cAAc,UAAU,QAAQ,IAAI,SAAS,IAAI,CAAC,QAAQ,IAAI;AACpE,IAAM,iBAAiB,QAAQ,IAAI,uBAAuB,YAAY,MAAM;AAC5E,IAAM,OAAO,MAAY;AAAC;AAC1B,IAAM,YAAoC,CAAC;AAC3C,IAAI,QAAQ,IAAI,YAAa,WAAU,cAAc,QAAQ,IAAI;AACjE,IAAI,QAAQ,IAAI,WAAa,WAAU,aAAc,QAAQ,IAAI;AACjE,IAAI,QAAQ,IAAI,QAAa,WAAU,UAAe,QAAQ,IAAI;AAClE,IAAM,gBAAgB,OAAO,KAAK,SAAS,EAAE,SAAS,EAAE,QAAQ,UAAU,IAAI,CAAC;AAG/E,SAAS,YAAY,OAAe,MAAyB;AAC3D,QAAM,IAAI,oBAAI,KAAK;AACnB,QAAM,KAAK,EAAE,eAAe,OAAO,IAAI,MAAM,OAAO,EAAE,gBAAgB,CAAC,EAAE,SAAS,GAAG,GAAG;AACxF,QAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,QAAM,aAAa,KAAK,UAAU,KAAK,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAE,gBAAgB;AAC9H,QAAM,MAAM,cAAc,aAAa,KAAK,MAAM,GAAG,EAAE,IAAI,IAAI;AAC/D,QAAM,SAAS,aAAa,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,QAAQ,UAAU,GAAG,IAAI;AACzF,SAAO,GAAG,KAAK,IAAI,EAAE,IAAI,GAAG,GAAG,MAAM;AACvC;AAGA,SAAS,aAAa,MAAyB;AAC7C,QAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,QAAM,aACJ,KAAK,UAAU,KACf,SAAS,QACT,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,IAAI,KACnB,EAAE,gBAAgB;AACpB,QAAM,MAAM,cAAc,aAAa,KAAK,MAAM,GAAG,EAAE,IAAI,IAAI;AAC/D,QAAM,SAAS,aAAa,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,QAAQ,UAAU,GAAG,IAAI;AACzF,SAAO,GAAG,GAAG,GAAG,MAAM;AACxB;AAIA,SAAS,WAAW,MAAmD;AACrE,QAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,MACE,KAAK,UAAU,KACf,SAAS,QACT,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,IAAI,KACnB,EAAE,gBAAgB,QAClB;AACA,WAAO,EAAE,SAAS,cAAc,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,GAAI,KAAiC;AAAA,EAC3F;AACA,SAAO,cAAc,IAAI;AAC3B;AAEA,IAAM,WAAqB,CAAC;AAE5B,IAAI,SAAS;AACX,MAAI;AACF,UAAM,UAAU,QAAQ,IAAI,eAAe,QAAQ,IAAI,aAAa;AACpE,UAAM,IAAI,IAAI,QAAQ,EAAE,WAAW,QAAQ,IAAI,YAAY,CAAC,EAAE,IAAI,OAAO;AACzE,aAAS,KAAK;AAAA,MACZ,OAAW,IAAI,SAA0B;AAAE,UAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,MAAG;AAAA,MACxI,MAAW,IAAI,SAA0B;AAAE,UAAE,MAAM,EAAE,MAAM,EAAE,UAAU,QAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,MAAG;AAAA,MACxI,QAAW,IAAI,SAA0B;AAAE,UAAE,MAAM,EAAE,MAAM,EAAE,UAAU,UAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,MAAG;AAAA,MACxI,SAAW,IAAI,SAA0B;AAAE,UAAE,MAAM,EAAE,MAAM,EAAE,UAAU,WAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,MAAG;AAAA,MACxI,OAAW,IAAI,SAA0B;AAAE,UAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,MAAG;AAAA,MACxI,UAAW,IAAI,SAA0B;AAAE,UAAE,MAAM,EAAE,MAAM,EAAE,UAAU,YAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,MAAG;AAAA,MACxI,OAAW,IAAI,SAA0B;AAAE,UAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,MAAG;AAAA,MACxI,WAAW,IAAI,SAA0B;AAAE,UAAE,MAAM,EAAE,MAAM,EAAE,UAAU,aAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,MAAG;AAAA,IAC1I,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAEA,IAAI,eAAe,SAAS,WAAW,GAAG;AACxC,WAAS,KAAK,iBACV;AAAA,IACE,OAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,IAAG;AAAA,IACjF,MAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,YAAY,gBAAM,IAAI,CAAC;AAAA,IAAG;AAAA,IACjF,QAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,IAAG;AAAA,IACjF,SAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,IAAG;AAAA,IACjF,OAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,IAAG;AAAA,IACjF,UAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,YAAY,gBAAM,IAAI,CAAC;AAAA,IAAG;AAAA,IACjF,OAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,YAAY,gBAAM,IAAI,CAAC;AAAA,IAAG;AAAA,IACjF,WAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,IAAG;AAAA,EACnF,IACA;AAAA,IACE,OAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,IAAG;AAAA,IAC5E,MAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,IAAG;AAAA,IAC5E,QAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,IAAG;AAAA,IAC5E,SAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,IAAG;AAAA,IAC5E,OAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,IAAG;AAAA,IAC5E,UAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,IAAG;AAAA,IAC5E,OAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,IAAG;AAAA,IAC5E,WAAW,IAAI,SAA0B;AAAE,cAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,IAAG;AAAA,EAC9E,CAAC;AACP;AAEO,IAAM,SACX,SAAS,WAAW,IAChB,SAAS,CAAC,IACV;AAAA,EACE,OAAW,IAAI,SAA0B;AAAE,aAAS,QAAQ,OAAK,EAAE,MAAM,GAAG,IAAI,CAAC;AAAA,EAAO;AAAA,EACxF,MAAW,IAAI,SAA0B;AAAE,aAAS,QAAQ,OAAK,EAAE,KAAK,GAAG,IAAI,CAAC;AAAA,EAAQ;AAAA,EACxF,QAAW,IAAI,SAA0B;AAAE,aAAS,QAAQ,OAAK,EAAE,OAAO,GAAG,IAAI,CAAC;AAAA,EAAM;AAAA,EACxF,SAAW,IAAI,SAA0B;AAAE,aAAS,QAAQ,OAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;AAAA,EAAK;AAAA,EACxF,OAAW,IAAI,SAA0B;AAAE,aAAS,QAAQ,OAAK,EAAE,MAAM,GAAG,IAAI,CAAC;AAAA,EAAO;AAAA,EACxF,UAAW,IAAI,SAA0B;AAAE,aAAS,QAAQ,OAAK,EAAE,SAAS,GAAG,IAAI,CAAC;AAAA,EAAI;AAAA,EACxF,OAAW,IAAI,SAA0B;AAAE,aAAS,QAAQ,OAAK,EAAE,MAAM,GAAG,IAAI,CAAC;AAAA,EAAO;AAAA,EACxF,WAAW,IAAI,SAA0B;AAAE,aAAS,QAAQ,OAAK,EAAE,UAAU,GAAG,IAAI,CAAC;AAAA,EAAG;AAC1F;AAEN,IAAO,gBAAQ;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logickernel/logger",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",