@logickernel/logger 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -9
- package/dist/index.cjs +18 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ logger.warning("disk space low", { used: "92%", mount: "/data" });
|
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
35
|
-
## 2. Installation & Usage
|
|
35
|
+
## 2. Installation & Usage
|
|
36
36
|
|
|
37
37
|
### Install from npm
|
|
38
38
|
|
|
@@ -60,9 +60,7 @@ logger.critical("primary db unreachable", { host: "db-1", retries: 3 });
|
|
|
60
60
|
|
|
61
61
|
The default export is a **singleton** whose backend is chosen at module load:
|
|
62
62
|
|
|
63
|
-
- **GCP backend** is used when
|
|
64
|
-
- `SYSTEM_LOGS=gcp`, or
|
|
65
|
-
- `K_SERVICE` is set (e.g. Cloud Run)
|
|
63
|
+
- **GCP backend** is used when `GCP_PROJECT` is set.
|
|
66
64
|
- Otherwise, the **console backend** is used.
|
|
67
65
|
|
|
68
66
|
### Severity methods
|
|
@@ -99,15 +97,12 @@ logger.info("request complete", { method: "GET", path: "/api/users", status: 200
|
|
|
99
97
|
|
|
100
98
|
### Environment variables
|
|
101
99
|
|
|
102
|
-
- `
|
|
103
|
-
|
|
100
|
+
- `GCP_PROJECT`
|
|
101
|
+
Project ID for Google Cloud Logging. When set, the GCP backend is used.
|
|
104
102
|
|
|
105
103
|
- `K_SERVICE`
|
|
106
104
|
Used as the log name in Google Cloud Logging. If not set, `"app"` is used.
|
|
107
105
|
|
|
108
|
-
- `GCP_PROJECT`
|
|
109
|
-
Project ID for Google Cloud Logging. Required when using the GCP backend.
|
|
110
|
-
|
|
111
106
|
### Named exports
|
|
112
107
|
|
|
113
108
|
```ts
|
package/dist/index.cjs
CHANGED
|
@@ -38,9 +38,18 @@ ${arg.stack}` : "");
|
|
|
38
38
|
}
|
|
39
39
|
}).join(" ");
|
|
40
40
|
}
|
|
41
|
-
var USE_GCP =
|
|
41
|
+
var USE_GCP = !!process.env.GCP_PROJECT;
|
|
42
42
|
var noop = () => {
|
|
43
43
|
};
|
|
44
|
+
function consoleLine(emoji, args) {
|
|
45
|
+
const d = /* @__PURE__ */ new Date();
|
|
46
|
+
const ts = d.toLocaleString("sv-SE") + "." + String(d.getMilliseconds()).padStart(3, "0");
|
|
47
|
+
const last = args[args.length - 1];
|
|
48
|
+
const hasPayload = args.length >= 2 && last !== null && typeof last === "object" && !Array.isArray(last) && !(last instanceof Error);
|
|
49
|
+
const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);
|
|
50
|
+
const suffix = hasPayload ? " " + JSON.stringify(last, null, 2).replace(/\n\s*/g, " ") : "";
|
|
51
|
+
return `${emoji} ${ts} ${msg}${suffix}`;
|
|
52
|
+
}
|
|
44
53
|
function gcpPayload(args) {
|
|
45
54
|
const last = args[args.length - 1];
|
|
46
55
|
if (args.length >= 2 && last !== null && typeof last === "object" && !Array.isArray(last) && !(last instanceof Error)) {
|
|
@@ -87,28 +96,28 @@ var logger = gcpLog ? /* @__PURE__ */ (() => {
|
|
|
87
96
|
};
|
|
88
97
|
})() : {
|
|
89
98
|
debug: (...args) => {
|
|
90
|
-
console.log("
|
|
99
|
+
console.log(consoleLine("\u{1F41E}", args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)));
|
|
91
100
|
},
|
|
92
101
|
info: (...args) => {
|
|
93
|
-
console.log("
|
|
102
|
+
console.log(consoleLine("\u2139\uFE0F", args));
|
|
94
103
|
},
|
|
95
104
|
notice: (...args) => {
|
|
96
|
-
console.log("
|
|
105
|
+
console.log(consoleLine("*\uFE0F\u20E3", args));
|
|
97
106
|
},
|
|
98
107
|
warning: (...args) => {
|
|
99
|
-
console.log("
|
|
108
|
+
console.log(consoleLine("\u26A0\uFE0F", args));
|
|
100
109
|
},
|
|
101
110
|
error: (...args) => {
|
|
102
|
-
console.log("
|
|
111
|
+
console.log(consoleLine("\u26D4\uFE0F", args));
|
|
103
112
|
},
|
|
104
113
|
critical: (...args) => {
|
|
105
|
-
console.log("
|
|
114
|
+
console.log(consoleLine("\u2757\uFE0F", args));
|
|
106
115
|
},
|
|
107
116
|
alert: (...args) => {
|
|
108
|
-
console.log("
|
|
117
|
+
console.log(consoleLine("\u203C\uFE0F", args));
|
|
109
118
|
},
|
|
110
119
|
emergency: (...args) => {
|
|
111
|
-
console.log("
|
|
120
|
+
console.log(consoleLine("\u{1F6A8}", args));
|
|
112
121
|
}
|
|
113
122
|
};
|
|
114
123
|
var index_default = logger;
|
package/dist/index.cjs.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 USE_GCP = process.env.
|
|
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 USE_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":[]}
|
package/dist/index.js
CHANGED
|
@@ -12,9 +12,18 @@ ${arg.stack}` : "");
|
|
|
12
12
|
}
|
|
13
13
|
}).join(" ");
|
|
14
14
|
}
|
|
15
|
-
var USE_GCP =
|
|
15
|
+
var USE_GCP = !!process.env.GCP_PROJECT;
|
|
16
16
|
var noop = () => {
|
|
17
17
|
};
|
|
18
|
+
function consoleLine(emoji, args) {
|
|
19
|
+
const d = /* @__PURE__ */ new Date();
|
|
20
|
+
const ts = d.toLocaleString("sv-SE") + "." + String(d.getMilliseconds()).padStart(3, "0");
|
|
21
|
+
const last = args[args.length - 1];
|
|
22
|
+
const hasPayload = args.length >= 2 && last !== null && typeof last === "object" && !Array.isArray(last) && !(last instanceof Error);
|
|
23
|
+
const msg = formatMessage(hasPayload ? args.slice(0, -1) : args);
|
|
24
|
+
const suffix = hasPayload ? " " + JSON.stringify(last, null, 2).replace(/\n\s*/g, " ") : "";
|
|
25
|
+
return `${emoji} ${ts} ${msg}${suffix}`;
|
|
26
|
+
}
|
|
18
27
|
function gcpPayload(args) {
|
|
19
28
|
const last = args[args.length - 1];
|
|
20
29
|
if (args.length >= 2 && last !== null && typeof last === "object" && !Array.isArray(last) && !(last instanceof Error)) {
|
|
@@ -61,28 +70,28 @@ var logger = gcpLog ? /* @__PURE__ */ (() => {
|
|
|
61
70
|
};
|
|
62
71
|
})() : {
|
|
63
72
|
debug: (...args) => {
|
|
64
|
-
console.log("
|
|
73
|
+
console.log(consoleLine("\u{1F41E}", args.map((a) => typeof a === "string" ? a.replace(/\n/g, " ") : a)));
|
|
65
74
|
},
|
|
66
75
|
info: (...args) => {
|
|
67
|
-
console.log("
|
|
76
|
+
console.log(consoleLine("\u2139\uFE0F", args));
|
|
68
77
|
},
|
|
69
78
|
notice: (...args) => {
|
|
70
|
-
console.log("
|
|
79
|
+
console.log(consoleLine("*\uFE0F\u20E3", args));
|
|
71
80
|
},
|
|
72
81
|
warning: (...args) => {
|
|
73
|
-
console.log("
|
|
82
|
+
console.log(consoleLine("\u26A0\uFE0F", args));
|
|
74
83
|
},
|
|
75
84
|
error: (...args) => {
|
|
76
|
-
console.log("
|
|
85
|
+
console.log(consoleLine("\u26D4\uFE0F", args));
|
|
77
86
|
},
|
|
78
87
|
critical: (...args) => {
|
|
79
|
-
console.log("
|
|
88
|
+
console.log(consoleLine("\u2757\uFE0F", args));
|
|
80
89
|
},
|
|
81
90
|
alert: (...args) => {
|
|
82
|
-
console.log("
|
|
91
|
+
console.log(consoleLine("\u203C\uFE0F", args));
|
|
83
92
|
},
|
|
84
93
|
emergency: (...args) => {
|
|
85
|
-
console.log("
|
|
94
|
+
console.log(consoleLine("\u{1F6A8}", args));
|
|
86
95
|
}
|
|
87
96
|
};
|
|
88
97
|
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 USE_GCP = process.env.
|
|
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 USE_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":[]}
|