@logickernel/logger 0.5.1 β†’ 0.6.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
@@ -24,7 +24,7 @@ logger.warning("disk space low", { used: "92%", mount: "/data" });
24
24
 
25
25
  **Key features**
26
26
 
27
- - **Zero config in GCP**: Uses `K_SERVICE` and `GCP_PROJECT` from the environment.
27
+ - **Zero config in GCP**: Uses `LOGGER_NAME` / `K_SERVICE` and `GCP_PROJECT` from the environment.
28
28
  - **Auto backend selection**: GCP vs console decided once at module load.
29
29
  - **Full severity ladder**: `debug`, `info`, `notice`, `warning`, `error`, `critical`, `alert`, `emergency`.
30
30
  - **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.
@@ -68,12 +68,12 @@ The default export is a **singleton** whose backend is chosen at module load:
68
68
  | Method | GCP severity | Console emoji |
69
69
  |---|---|---|
70
70
  | `debug` | `DEBUG` | 🐞 |
71
- | `info` | `INFO` | ℹ️ |
72
- | `notice` | `NOTICE` | *️⃣ |
73
- | `warning` | `WARNING` | ⚠️ |
71
+ | `info` | `INFO` | βšͺ️ |
72
+ | `notice` | `NOTICE` | πŸ”΅ |
73
+ | `warning` | `WARNING` | 🟑 |
74
74
  | `error` | `ERROR` | ⛔️ |
75
75
  | `critical` | `CRITICAL` | ❗️ |
76
- | `alert` | `ALERT` | ‼️ |
76
+ | `alert` | `ALERT` | πŸ”΄ |
77
77
  | `emergency` | `EMERGENCY` | 🚨 |
78
78
 
79
79
  ### Structured context
@@ -89,19 +89,34 @@ logger.info("request complete", { method: "GET", path: "/api/users", status: 200
89
89
 
90
90
  ### Console format
91
91
 
92
+ By default, console logs are plain: `message [payload]` without emoji or timestamp.
93
+
94
+ When `LOGGER_FORMAT=pretty`, console logs look like:
95
+
92
96
  ```
93
- ℹ️ 2026-02-26 13:04:22.120 server started
97
+ βšͺ️ 2026-02-26 13:04:22.120 server started
94
98
  🐞 2026-02-26 13:04:22.341 cache miss { "key": "user:42", "ttl": 300 }
95
- ⚠️ 2026-02-26 13:04:22.512 disk space low { "used": "92%", "mount": "/data" }
99
+ 🟑 2026-02-26 13:04:22.512 disk space low { "used": "92%", "mount": "/data" }
96
100
  ```
97
101
 
102
+ This "pretty" format (emoji + local timestamp + message + optional payload) is meant to roughly emulate what you see in the GCP Logging console when browsing entries by severity and time.
103
+
98
104
  ### Environment variables
99
105
 
100
- - `GCP_PROJECT`
101
- Project ID for Google Cloud Logging. When set, the GCP backend is used.
106
+ - `GCP_PROJECT`
107
+ Project ID for Google Cloud Logging. When set (and `LOGGER_TARGET` isn’t forcing console), the GCP backend is used.
108
+
109
+ - `LOGGER_NAME`
110
+ Log name in Google Cloud Logging. Falls back to `K_SERVICE`, then `"local"`.
111
+
112
+ - `LOGGER_TARGET`
113
+ Optional override for the backend: `"gcp"` forces the GCP logger when possible, `"console"` forces the console logger.
114
+
115
+ - `LOGGER_FORMAT`
116
+ 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.
102
117
 
103
- - `K_SERVICE`
104
- Used as the log name in Google Cloud Logging. If not set, `"app"` is used.
118
+ - `K_SERVICE`
119
+ Fallback log name in Google Cloud Logging when `LOGGER_NAME` is not set. Usually set up by Google Cloud Run. If neither is set, `"local"` is used.
105
120
 
106
121
  ### Named exports
107
122
 
package/dist/index.cjs CHANGED
@@ -39,9 +39,11 @@ ${arg.stack}` : "");
39
39
  }).join(" ");
40
40
  }
41
41
  var LOGGER_TARGET = process.env.LOGGER_TARGET?.toLowerCase();
42
+ var LOGGER_FORMAT = process.env.LOGGER_FORMAT?.toLowerCase();
42
43
  var FORCE_GCP = LOGGER_TARGET === "gcp";
43
44
  var FORCE_CONSOLE = LOGGER_TARGET === "console";
44
45
  var USE_GCP = !FORCE_CONSOLE && (FORCE_GCP || !!process.env.GCP_PROJECT);
46
+ var CONSOLE_PRETTY = LOGGER_FORMAT === "pretty";
45
47
  var noop = () => {
46
48
  };
47
49
  function consoleLine(emoji, args) {
@@ -53,6 +55,13 @@ function consoleLine(emoji, args) {
53
55
  const suffix = hasPayload ? " " + JSON.stringify(last, null, 2).replace(/\n\s*/g, " ") : "";
54
56
  return `${emoji} ${ts} ${msg}${suffix}`;
55
57
  }
58
+ function consolePlain(args) {
59
+ const last = args[args.length - 1];
60
+ const hasPayload = args.length >= 2 && last !== null && typeof last === "object" && !Array.isArray(last) && !(last instanceof Error);
61
+ const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);
62
+ const suffix = hasPayload ? " " + JSON.stringify(last, null, 2).replace(/\n\s*/g, " ") : "";
63
+ return `${msg}${suffix}`;
64
+ }
56
65
  function gcpPayload(args) {
57
66
  const last = args[args.length - 1];
58
67
  if (args.length >= 2 && last !== null && typeof last === "object" && !Array.isArray(last) && !(last instanceof Error)) {
@@ -63,7 +72,7 @@ function gcpPayload(args) {
63
72
  var gcpLog = null;
64
73
  if (USE_GCP) {
65
74
  try {
66
- const logName = process.env.K_SERVICE ?? "app";
75
+ const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? "local";
67
76
  gcpLog = new import_logging.Logging({ projectId: process.env.GCP_PROJECT }).log(logName);
68
77
  } catch {
69
78
  }
@@ -97,9 +106,14 @@ var logger = gcpLog ? /* @__PURE__ */ (() => {
97
106
  g.write(g.entry({ severity: "EMERGENCY" }, gcpPayload(args))).catch(noop);
98
107
  }
99
108
  };
100
- })() : {
109
+ })() : CONSOLE_PRETTY ? {
101
110
  debug: (...args) => {
102
- console.log(consoleLine("\u{1F41E}", args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)));
111
+ console.log(
112
+ consoleLine(
113
+ "\u{1F41E}",
114
+ args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)
115
+ )
116
+ );
103
117
  },
104
118
  info: (...args) => {
105
119
  console.log(consoleLine("\u26AA\uFE0F", args));
@@ -111,17 +125,46 @@ var logger = gcpLog ? /* @__PURE__ */ (() => {
111
125
  console.log(consoleLine("\u{1F7E1}", args));
112
126
  },
113
127
  error: (...args) => {
114
- console.log(consoleLine("\u26D4\uFE0F", args));
128
+ console.log(consoleLine("\u{1F534}", args));
115
129
  },
116
130
  critical: (...args) => {
117
- console.log(consoleLine("\u2757\uFE0F", args));
131
+ console.log(consoleLine("\u26D4\uFE0F", args));
118
132
  },
119
133
  alert: (...args) => {
120
- console.log(consoleLine("\u{1F534}", args));
134
+ console.log(consoleLine("\u2757\uFE0F", args));
121
135
  },
122
136
  emergency: (...args) => {
123
137
  console.log(consoleLine("\u{1F6A8}", args));
124
138
  }
139
+ } : {
140
+ debug: (...args) => {
141
+ console.log(
142
+ consolePlain(
143
+ args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)
144
+ )
145
+ );
146
+ },
147
+ info: (...args) => {
148
+ console.log(consolePlain(args));
149
+ },
150
+ notice: (...args) => {
151
+ console.log(consolePlain(args));
152
+ },
153
+ warning: (...args) => {
154
+ console.log(consolePlain(args));
155
+ },
156
+ error: (...args) => {
157
+ console.log(consolePlain(args));
158
+ },
159
+ critical: (...args) => {
160
+ console.log(consolePlain(args));
161
+ },
162
+ alert: (...args) => {
163
+ console.log(consolePlain(args));
164
+ },
165
+ emergency: (...args) => {
166
+ console.log(consolePlain(args));
167
+ }
125
168
  };
126
169
  var index_default = logger;
127
170
  // Annotate the CommonJS export names for ESM import in node:
@@ -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 FORCE_GCP = LOGGER_TARGET === \"gcp\";\nconst FORCE_CONSOLE = LOGGER_TARGET === \"console\";\nconst USE_GCP = !FORCE_CONSOLE && (FORCE_GCP || !!process.env.GCP_PROJECT);\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// 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.K_SERVICE ?? \"app\";\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 : {\n debug: (...args: unknown[]): void => {\n console.log(consoleLine(\"🐞\", args.map(a => typeof a === \"string\" ? a.replace(/\\n/g, \" \") : a)));\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\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.\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":[]}
package/dist/index.js CHANGED
@@ -13,9 +13,11 @@ ${arg.stack}` : "");
13
13
  }).join(" ");
14
14
  }
15
15
  var LOGGER_TARGET = process.env.LOGGER_TARGET?.toLowerCase();
16
+ var LOGGER_FORMAT = process.env.LOGGER_FORMAT?.toLowerCase();
16
17
  var FORCE_GCP = LOGGER_TARGET === "gcp";
17
18
  var FORCE_CONSOLE = LOGGER_TARGET === "console";
18
19
  var USE_GCP = !FORCE_CONSOLE && (FORCE_GCP || !!process.env.GCP_PROJECT);
20
+ var CONSOLE_PRETTY = LOGGER_FORMAT === "pretty";
19
21
  var noop = () => {
20
22
  };
21
23
  function consoleLine(emoji, args) {
@@ -27,6 +29,13 @@ function consoleLine(emoji, args) {
27
29
  const suffix = hasPayload ? " " + JSON.stringify(last, null, 2).replace(/\n\s*/g, " ") : "";
28
30
  return `${emoji} ${ts} ${msg}${suffix}`;
29
31
  }
32
+ function consolePlain(args) {
33
+ const last = args[args.length - 1];
34
+ const hasPayload = args.length >= 2 && last !== null && typeof last === "object" && !Array.isArray(last) && !(last instanceof Error);
35
+ const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);
36
+ const suffix = hasPayload ? " " + JSON.stringify(last, null, 2).replace(/\n\s*/g, " ") : "";
37
+ return `${msg}${suffix}`;
38
+ }
30
39
  function gcpPayload(args) {
31
40
  const last = args[args.length - 1];
32
41
  if (args.length >= 2 && last !== null && typeof last === "object" && !Array.isArray(last) && !(last instanceof Error)) {
@@ -37,7 +46,7 @@ function gcpPayload(args) {
37
46
  var gcpLog = null;
38
47
  if (USE_GCP) {
39
48
  try {
40
- const logName = process.env.K_SERVICE ?? "app";
49
+ const logName = process.env.LOGGER_NAME ?? process.env.K_SERVICE ?? "local";
41
50
  gcpLog = new Logging({ projectId: process.env.GCP_PROJECT }).log(logName);
42
51
  } catch {
43
52
  }
@@ -71,9 +80,14 @@ var logger = gcpLog ? /* @__PURE__ */ (() => {
71
80
  g.write(g.entry({ severity: "EMERGENCY" }, gcpPayload(args))).catch(noop);
72
81
  }
73
82
  };
74
- })() : {
83
+ })() : CONSOLE_PRETTY ? {
75
84
  debug: (...args) => {
76
- console.log(consoleLine("\u{1F41E}", args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)));
85
+ console.log(
86
+ consoleLine(
87
+ "\u{1F41E}",
88
+ args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)
89
+ )
90
+ );
77
91
  },
78
92
  info: (...args) => {
79
93
  console.log(consoleLine("\u26AA\uFE0F", args));
@@ -85,17 +99,46 @@ var logger = gcpLog ? /* @__PURE__ */ (() => {
85
99
  console.log(consoleLine("\u{1F7E1}", args));
86
100
  },
87
101
  error: (...args) => {
88
- console.log(consoleLine("\u26D4\uFE0F", args));
102
+ console.log(consoleLine("\u{1F534}", args));
89
103
  },
90
104
  critical: (...args) => {
91
- console.log(consoleLine("\u2757\uFE0F", args));
105
+ console.log(consoleLine("\u26D4\uFE0F", args));
92
106
  },
93
107
  alert: (...args) => {
94
- console.log(consoleLine("\u{1F534}", args));
108
+ console.log(consoleLine("\u2757\uFE0F", args));
95
109
  },
96
110
  emergency: (...args) => {
97
111
  console.log(consoleLine("\u{1F6A8}", args));
98
112
  }
113
+ } : {
114
+ debug: (...args) => {
115
+ console.log(
116
+ consolePlain(
117
+ args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)
118
+ )
119
+ );
120
+ },
121
+ info: (...args) => {
122
+ console.log(consolePlain(args));
123
+ },
124
+ notice: (...args) => {
125
+ console.log(consolePlain(args));
126
+ },
127
+ warning: (...args) => {
128
+ console.log(consolePlain(args));
129
+ },
130
+ error: (...args) => {
131
+ console.log(consolePlain(args));
132
+ },
133
+ critical: (...args) => {
134
+ console.log(consolePlain(args));
135
+ },
136
+ alert: (...args) => {
137
+ console.log(consolePlain(args));
138
+ },
139
+ emergency: (...args) => {
140
+ console.log(consolePlain(args));
141
+ }
99
142
  };
100
143
  var index_default = logger;
101
144
  export {
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 FORCE_GCP = LOGGER_TARGET === \"gcp\";\nconst FORCE_CONSOLE = LOGGER_TARGET === \"console\";\nconst USE_GCP = !FORCE_CONSOLE && (FORCE_GCP || !!process.env.GCP_PROJECT);\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// 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.K_SERVICE ?? \"app\";\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 : {\n debug: (...args: unknown[]): void => {\n console.log(consoleLine(\"🐞\", args.map(a => typeof a === \"string\" ? a.replace(/\\n/g, \" \") : a)));\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\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.\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":";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;AAG1B,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,YAAM,SAAS,KAAK,IAAI,OAAM,OAAO,MAAM,WAAW,EAAE,QAAQ,OAAO,GAAG,IAAI,CAAE;AAChF,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,QAAQ,GAAG,WAAW,MAAM,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACxE;AAAA,IACA,MAAM,IAAI,SAA0B;AAClC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,OAAO,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACrE;AAAA,IACA,QAAQ,IAAI,SAA0B;AACpC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,SAAS,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACvE;AAAA,IACA,SAAS,IAAI,SAA0B;AACrC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,UAAU,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACxE;AAAA,IACA,OAAO,IAAI,SAA0B;AACnC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,QAAQ,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACtE;AAAA,IACA,UAAU,IAAI,SAA0B;AACtC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,WAAW,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACzE;AAAA,IACA,OAAO,IAAI,SAA0B;AACnC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,QAAQ,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IACtE;AAAA,IACA,WAAW,IAAI,SAA0B;AACvC,QAAE,MAAM,EAAE,MAAM,EAAE,UAAU,YAAY,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI;AAAA,IAC1E;AAAA,EACF;AACF,GAAG,IACH,iBACA;AAAA,EACE,OAAO,IAAI,SAA0B;AACnC,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA,KAAK,IAAI,OAAM,OAAO,MAAM,WAAW,EAAE,QAAQ,OAAO,GAAG,IAAI,CAAE;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA,EACA,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,OAAO,IAAI,SAA0B;AACnC,YAAQ;AAAA,MACN;AAAA,QACE,KAAK,IAAI,OAAM,OAAO,MAAM,WAAW,EAAE,QAAQ,OAAO,GAAG,IAAI,CAAE;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA,EACA,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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logickernel/logger",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",