@logickernel/logger 0.6.1 → 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,12 +38,11 @@ ${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
  };
49
48
  var gcpLabels = {};
@@ -74,91 +73,117 @@ function gcpPayload(args) {
74
73
  }
75
74
  return formatMessage(args);
76
75
  }
77
- var gcpLog = null;
76
+ var backends = [];
78
77
  if (USE_GCP) {
79
78
  try {
80
79
  const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? "local";
81
- 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
+ });
82
107
  } catch {
83
108
  }
84
109
  }
85
- var logger = gcpLog ? /* @__PURE__ */ (() => {
86
- const g = gcpLog;
87
- return {
110
+ if (USE_CONSOLE || backends.length === 0) {
111
+ backends.push(CONSOLE_PRETTY ? {
88
112
  debug: (...args) => {
89
- g.write(g.entry({ severity: "DEBUG", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
113
+ console.log(consoleLine("\u{1F41E}", args));
90
114
  },
91
115
  info: (...args) => {
92
- g.write(g.entry({ severity: "INFO", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
116
+ console.log(consoleLine("\u26AA\uFE0F", args));
93
117
  },
94
118
  notice: (...args) => {
95
- g.write(g.entry({ severity: "NOTICE", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
119
+ console.log(consoleLine("\u{1F535}", args));
96
120
  },
97
121
  warning: (...args) => {
98
- g.write(g.entry({ severity: "WARNING", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
122
+ console.log(consoleLine("\u{1F7E1}", args));
99
123
  },
100
124
  error: (...args) => {
101
- g.write(g.entry({ severity: "ERROR", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
125
+ console.log(consoleLine("\u{1F534}", args));
102
126
  },
103
127
  critical: (...args) => {
104
- g.write(g.entry({ severity: "CRITICAL", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
128
+ console.log(consoleLine("\u26D4\uFE0F", args));
105
129
  },
106
130
  alert: (...args) => {
107
- g.write(g.entry({ severity: "ALERT", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
131
+ console.log(consoleLine("\u2757\uFE0F", args));
108
132
  },
109
133
  emergency: (...args) => {
110
- g.write(g.entry({ severity: "EMERGENCY", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
134
+ console.log(consoleLine("\u{1F6A8}", args));
111
135
  }
112
- };
113
- })() : CONSOLE_PRETTY ? {
114
- debug: (...args) => {
115
- console.log(consoleLine("\u{1F41E}", args));
116
- },
117
- info: (...args) => {
118
- console.log(consoleLine("\u26AA\uFE0F", args));
119
- },
120
- notice: (...args) => {
121
- console.log(consoleLine("\u{1F535}", args));
122
- },
123
- warning: (...args) => {
124
- console.log(consoleLine("\u{1F7E1}", args));
125
- },
126
- error: (...args) => {
127
- console.log(consoleLine("\u{1F534}", args));
128
- },
129
- critical: (...args) => {
130
- console.log(consoleLine("\u26D4\uFE0F", args));
131
- },
132
- alert: (...args) => {
133
- console.log(consoleLine("\u2757\uFE0F", args));
134
- },
135
- emergency: (...args) => {
136
- console.log(consoleLine("\u{1F6A8}", args));
137
- }
138
- } : {
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] : {
139
164
  debug: (...args) => {
140
- console.log(consolePlain(args));
165
+ backends.forEach((b) => b.debug(...args));
141
166
  },
142
167
  info: (...args) => {
143
- console.log(consolePlain(args));
168
+ backends.forEach((b) => b.info(...args));
144
169
  },
145
170
  notice: (...args) => {
146
- console.log(consolePlain(args));
171
+ backends.forEach((b) => b.notice(...args));
147
172
  },
148
173
  warning: (...args) => {
149
- console.log(consolePlain(args));
174
+ backends.forEach((b) => b.warning(...args));
150
175
  },
151
176
  error: (...args) => {
152
- console.log(consolePlain(args));
177
+ backends.forEach((b) => b.error(...args));
153
178
  },
154
179
  critical: (...args) => {
155
- console.log(consolePlain(args));
180
+ backends.forEach((b) => b.critical(...args));
156
181
  },
157
182
  alert: (...args) => {
158
- console.log(consolePlain(args));
183
+ backends.forEach((b) => b.alert(...args));
159
184
  },
160
185
  emergency: (...args) => {
161
- console.log(consolePlain(args));
186
+ backends.forEach((b) => b.emergency(...args));
162
187
  }
163
188
  };
164
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 => {};\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\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 g.write(g.entry({ severity: \"DEBUG\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n info: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"INFO\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n notice: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"NOTICE\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n warning: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"WARNING\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n error: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"ERROR\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n critical: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"CRITICAL\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n alert: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"ALERT\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n emergency: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"EMERGENCY\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n };\n })()\n : 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\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,12 +12,11 @@ ${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
  };
23
22
  var gcpLabels = {};
@@ -48,91 +47,117 @@ function gcpPayload(args) {
48
47
  }
49
48
  return formatMessage(args);
50
49
  }
51
- var gcpLog = null;
50
+ var backends = [];
52
51
  if (USE_GCP) {
53
52
  try {
54
53
  const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? "local";
55
- 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
+ });
56
81
  } catch {
57
82
  }
58
83
  }
59
- var logger = gcpLog ? /* @__PURE__ */ (() => {
60
- const g = gcpLog;
61
- return {
84
+ if (USE_CONSOLE || backends.length === 0) {
85
+ backends.push(CONSOLE_PRETTY ? {
62
86
  debug: (...args) => {
63
- g.write(g.entry({ severity: "DEBUG", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
87
+ console.log(consoleLine("\u{1F41E}", args));
64
88
  },
65
89
  info: (...args) => {
66
- g.write(g.entry({ severity: "INFO", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
90
+ console.log(consoleLine("\u26AA\uFE0F", args));
67
91
  },
68
92
  notice: (...args) => {
69
- g.write(g.entry({ severity: "NOTICE", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
93
+ console.log(consoleLine("\u{1F535}", args));
70
94
  },
71
95
  warning: (...args) => {
72
- g.write(g.entry({ severity: "WARNING", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
96
+ console.log(consoleLine("\u{1F7E1}", args));
73
97
  },
74
98
  error: (...args) => {
75
- g.write(g.entry({ severity: "ERROR", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
99
+ console.log(consoleLine("\u{1F534}", args));
76
100
  },
77
101
  critical: (...args) => {
78
- g.write(g.entry({ severity: "CRITICAL", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
102
+ console.log(consoleLine("\u26D4\uFE0F", args));
79
103
  },
80
104
  alert: (...args) => {
81
- g.write(g.entry({ severity: "ALERT", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
105
+ console.log(consoleLine("\u2757\uFE0F", args));
82
106
  },
83
107
  emergency: (...args) => {
84
- g.write(g.entry({ severity: "EMERGENCY", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);
108
+ console.log(consoleLine("\u{1F6A8}", args));
85
109
  }
86
- };
87
- })() : CONSOLE_PRETTY ? {
88
- debug: (...args) => {
89
- console.log(consoleLine("\u{1F41E}", args));
90
- },
91
- info: (...args) => {
92
- console.log(consoleLine("\u26AA\uFE0F", args));
93
- },
94
- notice: (...args) => {
95
- console.log(consoleLine("\u{1F535}", args));
96
- },
97
- warning: (...args) => {
98
- console.log(consoleLine("\u{1F7E1}", args));
99
- },
100
- error: (...args) => {
101
- console.log(consoleLine("\u{1F534}", args));
102
- },
103
- critical: (...args) => {
104
- console.log(consoleLine("\u26D4\uFE0F", args));
105
- },
106
- alert: (...args) => {
107
- console.log(consoleLine("\u2757\uFE0F", args));
108
- },
109
- emergency: (...args) => {
110
- console.log(consoleLine("\u{1F6A8}", args));
111
- }
112
- } : {
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] : {
113
138
  debug: (...args) => {
114
- console.log(consolePlain(args));
139
+ backends.forEach((b) => b.debug(...args));
115
140
  },
116
141
  info: (...args) => {
117
- console.log(consolePlain(args));
142
+ backends.forEach((b) => b.info(...args));
118
143
  },
119
144
  notice: (...args) => {
120
- console.log(consolePlain(args));
145
+ backends.forEach((b) => b.notice(...args));
121
146
  },
122
147
  warning: (...args) => {
123
- console.log(consolePlain(args));
148
+ backends.forEach((b) => b.warning(...args));
124
149
  },
125
150
  error: (...args) => {
126
- console.log(consolePlain(args));
151
+ backends.forEach((b) => b.error(...args));
127
152
  },
128
153
  critical: (...args) => {
129
- console.log(consolePlain(args));
154
+ backends.forEach((b) => b.critical(...args));
130
155
  },
131
156
  alert: (...args) => {
132
- console.log(consolePlain(args));
157
+ backends.forEach((b) => b.alert(...args));
133
158
  },
134
159
  emergency: (...args) => {
135
- console.log(consolePlain(args));
160
+ backends.forEach((b) => b.emergency(...args));
136
161
  }
137
162
  };
138
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 => {};\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\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 g.write(g.entry({ severity: \"DEBUG\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n info: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"INFO\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n notice: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"NOTICE\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n warning: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"WARNING\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n error: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"ERROR\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n critical: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"CRITICAL\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n alert: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"ALERT\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n emergency: (...args: unknown[]): void => {\n g.write(g.entry({ severity: \"EMERGENCY\", ...GCP_ENV_LABEL }, gcpPayload(args))).catch(noop);\n },\n };\n })()\n : 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\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;AAGA,IAAM,gBAAgB,QAAQ,IAAI,eAAe,YAAY;AAC7D,IAAM,gBAAgB,QAAQ,IAAI,eAAe,YAAY;AAC7D,IAAM,YAAY,kBAAkB;AACpC,IAAM,gBAAgB,kBAAkB;AACxC,IAAM,UAAU,CAAC,kBAAkB,aAAa,CAAC,CAAC,QAAQ,IAAI;AAC9D,IAAM,iBAAiB,kBAAkB;AACzC,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,IAAI,SAA4C;AAChD,IAAI,SAAS;AACX,MAAI;AACF,UAAM,UAAU,QAAQ,IAAI,eAAe,QAAQ,IAAI,aAAa;AACpE,aAAS,IAAI,QAAQ,EAAE,WAAW,QAAQ,IAAI,YAAY,CAAC,EAAE,IAAI,OAAO;AAAA,EAC1E,QAAQ;AAAA,EAER;AACF;AAEO,IAAM,SAAiB,SACzB,uBAAM;AACL,QAAM,IAAI;AACV,SAAO;AAAA,IACL,OAAO,IAAI,SAA0B;AACnC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAS,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACxF;AAAA,IACA,MAAM,IAAI,SAA0B;AAClC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,QAAQ,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACvF;AAAA,IACA,QAAQ,IAAI,SAA0B;AACpC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,UAAU,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACzF;AAAA,IACA,SAAS,IAAI,SAA0B;AACrC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,WAAW,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IAC1F;AAAA,IACA,OAAO,IAAI,SAA0B;AACnC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAS,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACxF;AAAA,IACA,UAAU,IAAI,SAA0B;AACtC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,YAAY,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IAC3F;AAAA,IACA,OAAO,IAAI,SAA0B;AACnC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAS,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACxF;AAAA,IACA,WAAW,IAAI,SAA0B;AACvC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,aAAa,GAAG,cAAc,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IAC5F;AAAA,EACF;AACF,GAAG,IACH,iBACA;AAAA,EACE,OAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,EAAG;AAAA,EACjF,MAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,YAAY,gBAAM,IAAI,CAAC;AAAA,EAAG;AAAA,EACjF,QAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,EAAG;AAAA,EACjF,SAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,EAAG;AAAA,EACjF,OAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,EAAG;AAAA,EACjF,UAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,YAAY,gBAAM,IAAI,CAAC;AAAA,EAAG;AAAA,EACjF,OAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,YAAY,gBAAM,IAAI,CAAC;AAAA,EAAG;AAAA,EACjF,WAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,YAAY,aAAM,IAAI,CAAC;AAAA,EAAG;AACnF,IACA;AAAA,EACE,OAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAAG;AAAA,EAC5E,MAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAAG;AAAA,EAC5E,QAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAAG;AAAA,EAC5E,SAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAAG;AAAA,EAC5E,OAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAAG;AAAA,EAC5E,UAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAAG;AAAA,EAC5E,OAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAAG;AAAA,EAC5E,WAAW,IAAI,SAA0B;AAAE,YAAQ,IAAI,aAAa,IAAI,CAAC;AAAA,EAAG;AAC9E;AAEJ,IAAO,gBAAQ;","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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logickernel/logger",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",