@levrbet/shared 0.2.16 → 0.2.17
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.
|
@@ -2,14 +2,11 @@ import winston from "winston";
|
|
|
2
2
|
export interface LoggerOptions {
|
|
3
3
|
service?: string;
|
|
4
4
|
level?: string;
|
|
5
|
-
|
|
5
|
+
extra?: Record<string, unknown>;
|
|
6
6
|
}
|
|
7
|
-
export declare const createLogger: (
|
|
7
|
+
export declare const createLogger: ({ service, level, extra }?: LoggerOptions) => winston.Logger;
|
|
8
8
|
declare const logger: winston.Logger;
|
|
9
|
-
export declare const createStream: (loggerInstance?: winston.Logger) => {
|
|
10
|
-
write: (message: string) => void;
|
|
11
|
-
};
|
|
12
|
-
export declare const stream: {
|
|
13
|
-
write: (message: string) => void;
|
|
14
|
-
};
|
|
15
9
|
export default logger;
|
|
10
|
+
export declare const createMorganStream: (log?: winston.Logger) => {
|
|
11
|
+
write: (msg: string) => winston.Logger;
|
|
12
|
+
};
|
|
@@ -3,148 +3,58 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.createMorganStream = exports.createLogger = void 0;
|
|
7
7
|
const winston_1 = __importDefault(require("winston"));
|
|
8
8
|
const dotenv_1 = require("./dotenv");
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// Or just use the default
|
|
30
|
-
import logger from "@levrbet/shared"
|
|
31
|
-
logger.info("Using default logger")
|
|
32
|
-
*
|
|
33
|
-
*/
|
|
34
|
-
const { combine, timestamp, errors, json, printf, splat } = winston_1.default.format;
|
|
35
|
-
// Determine log level based on environment
|
|
36
|
-
const getLogLevel = () => {
|
|
37
|
-
switch (dotenv_1.LEVR_ENV) {
|
|
38
|
-
case "local":
|
|
39
|
-
return "debug";
|
|
40
|
-
case "dev":
|
|
41
|
-
return "debug";
|
|
42
|
-
case "staging":
|
|
43
|
-
return "info";
|
|
44
|
-
case "prod":
|
|
45
|
-
return "error";
|
|
46
|
-
default:
|
|
47
|
-
return "info";
|
|
9
|
+
const { combine, timestamp, errors, json, printf, colorize, splat } = winston_1.default.format;
|
|
10
|
+
const LOG_LEVEL = {
|
|
11
|
+
local: "debug",
|
|
12
|
+
dev: "debug",
|
|
13
|
+
staging: "info",
|
|
14
|
+
prod: "error",
|
|
15
|
+
}[dotenv_1.LEVR_ENV] ?? "info";
|
|
16
|
+
/// @dev more detailed console format for local development
|
|
17
|
+
const devFormat = printf(({ level, message, timestamp, service, ...meta }) => {
|
|
18
|
+
// color the level
|
|
19
|
+
const colouredLevel = winston_1.default.format.colorize().colorize(level, level.toUpperCase());
|
|
20
|
+
// base line
|
|
21
|
+
let line = `${timestamp} ${colouredLevel}`;
|
|
22
|
+
if (service)
|
|
23
|
+
line += ` [${service}]`;
|
|
24
|
+
line += ` ${message}`;
|
|
25
|
+
// print any extra meta on a new line (pretty JSON)
|
|
26
|
+
const keys = Object.keys(meta);
|
|
27
|
+
if (keys.length) {
|
|
28
|
+
line += `\n${JSON.stringify(meta, null, 2)}`;
|
|
48
29
|
}
|
|
49
|
-
|
|
50
|
-
// Color mapping for manual colorization
|
|
51
|
-
const colors = {
|
|
52
|
-
error: "\x1b[31m", // red
|
|
53
|
-
warn: "\x1b[33m", // yellow
|
|
54
|
-
info: "\x1b[36m", // cyan
|
|
55
|
-
http: "\x1b[35m", // magenta
|
|
56
|
-
verbose: "\x1b[90m", // gray
|
|
57
|
-
debug: "\x1b[34m", // blue
|
|
58
|
-
silly: "\x1b[90m", // gray
|
|
59
|
-
};
|
|
60
|
-
const reset = "\x1b[0m";
|
|
61
|
-
// Custom format for console output in non-production
|
|
62
|
-
const consoleFormat = printf((info) => {
|
|
63
|
-
const { level, message, timestamp, stack, service, ...metadata } = info;
|
|
64
|
-
const color = colors[level] || "";
|
|
65
|
-
const coloredLevel = dotenv_1.LEVR_ENV === "prod" ? level : `${color}${level}${reset}`;
|
|
66
|
-
let msg = `${timestamp} [${coloredLevel}]`;
|
|
67
|
-
if (service) {
|
|
68
|
-
msg += ` [${service}]`;
|
|
69
|
-
}
|
|
70
|
-
// Simple message handling
|
|
71
|
-
if (typeof message === "string") {
|
|
72
|
-
msg += `: ${message}`;
|
|
73
|
-
}
|
|
74
|
-
else if (message !== undefined && message !== null) {
|
|
75
|
-
try {
|
|
76
|
-
msg += `: ${JSON.stringify(message)}`;
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
msg += `: ${String(message)}`;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// Add stack trace if error
|
|
83
|
-
if (stack) {
|
|
84
|
-
msg += `\n${stack}`;
|
|
85
|
-
}
|
|
86
|
-
// Handle splat metadata (printf-style arguments)
|
|
87
|
-
const splatData = metadata[Symbol.for("splat")];
|
|
88
|
-
if (Array.isArray(splatData) && splatData.length > 0) {
|
|
89
|
-
splatData.forEach((item) => {
|
|
90
|
-
try {
|
|
91
|
-
msg += ` ${typeof item === "string" ? item : JSON.stringify(item)}`;
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
msg += ` ${String(item)}`;
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
// Add remaining metadata if present
|
|
99
|
-
const relevantKeys = Object.keys(metadata).filter((key) => !["level", "message", "timestamp", "service", "environment", "splat"].includes(key));
|
|
100
|
-
if (relevantKeys.length > 0) {
|
|
101
|
-
const metaObj = Object.fromEntries(relevantKeys.map((key) => [key, metadata[key]]));
|
|
102
|
-
try {
|
|
103
|
-
msg += `\n${JSON.stringify(metaObj, null, 2)}`;
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
msg += `\n${String(metaObj)}`;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return msg;
|
|
30
|
+
return line;
|
|
110
31
|
});
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
32
|
+
/// @dev pure json format for otel collection
|
|
33
|
+
const prodFormat = combine(timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), // ISO-ish
|
|
34
|
+
errors({ stack: true }), // stack traces as `error.stack`
|
|
35
|
+
splat(), // %s, %d, %j support
|
|
36
|
+
json() // final JSON string
|
|
37
|
+
);
|
|
38
|
+
const createLogger = ({ service = "unknown-levr-service", level = LOG_LEVEL, extra = {} } = {}) => {
|
|
39
|
+
return winston_1.default.createLogger({
|
|
118
40
|
level,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
defaultMeta: {
|
|
122
|
-
service,
|
|
123
|
-
environment: dotenv_1.LEVR_ENV,
|
|
124
|
-
...additionalMeta,
|
|
125
|
-
},
|
|
41
|
+
format: dotenv_1.LEVR_ENV === "local" ? combine(colorize(), devFormat) : prodFormat,
|
|
42
|
+
defaultMeta: { service, environment: dotenv_1.LEVR_ENV, ...extra },
|
|
126
43
|
transports: [
|
|
127
44
|
new winston_1.default.transports.Console({
|
|
128
|
-
stderrLevels: ["error"],
|
|
45
|
+
stderrLevels: ["error"], // error → stderr, everything else → stdout
|
|
129
46
|
}),
|
|
130
47
|
],
|
|
131
48
|
exitOnError: false,
|
|
132
49
|
});
|
|
133
|
-
return winstonLogger;
|
|
134
50
|
};
|
|
135
51
|
exports.createLogger = createLogger;
|
|
136
|
-
|
|
137
|
-
const logger = (0, exports.createLogger)();
|
|
138
|
-
// Create stream for Morgan (HTTP logging)
|
|
139
|
-
const createStream = (loggerInstance = logger) => ({
|
|
140
|
-
write: (message) => {
|
|
141
|
-
const msg = typeof message === "string" ? message.trim() : String(message);
|
|
142
|
-
if (msg.length > 0) {
|
|
143
|
-
loggerInstance.info(msg);
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
});
|
|
147
|
-
exports.createStream = createStream;
|
|
148
|
-
exports.stream = (0, exports.createStream)();
|
|
52
|
+
/// @dev default logger for general use
|
|
53
|
+
const logger = (0, exports.createLogger)({ service: "@levr/shared" });
|
|
149
54
|
exports.default = logger;
|
|
55
|
+
/// @dev Morgan stream adapter
|
|
56
|
+
const createMorganStream = (log = logger) => ({
|
|
57
|
+
write: (msg) => log.http(msg.trim()),
|
|
58
|
+
});
|
|
59
|
+
exports.createMorganStream = createMorganStream;
|
|
150
60
|
//# sourceMappingURL=winston.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"winston.js","sourceRoot":"","sources":["../../../src/server/config/winston.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA6B;AAC7B,qCAAmC;AAEnC
|
|
1
|
+
{"version":3,"file":"winston.js","sourceRoot":"","sources":["../../../src/server/config/winston.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA6B;AAC7B,qCAAmC;AAEnC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,iBAAO,CAAC,MAAM,CAAA;AAEpF,MAAM,SAAS,GACX;IACI,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,OAAO;IACZ,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,OAAO;CAChB,CAAC,iBAAQ,CAAC,IAAI,MAAM,CAAA;AAEzB,2DAA2D;AAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IACzE,kBAAkB;IAClB,MAAM,aAAa,GAAG,iBAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;IAEpF,YAAY;IACZ,IAAI,IAAI,GAAG,GAAG,SAAS,IAAI,aAAa,EAAE,CAAA;IAC1C,IAAI,OAAO;QAAE,IAAI,IAAI,KAAK,OAAO,GAAG,CAAA;IACpC,IAAI,IAAI,IAAI,OAAO,EAAE,CAAA;IAErB,mDAAmD;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;IAChD,CAAC;IACD,OAAO,IAAI,CAAA;AACf,CAAC,CAAC,CAAA;AAEF,6CAA6C;AAC7C,MAAM,UAAU,GAAG,OAAO,CACtB,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,UAAU;AACxD,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,gCAAgC;AACzD,KAAK,EAAE,EAAE,qBAAqB;AAC9B,IAAI,EAAE,CAAC,oBAAoB;CAC9B,CAAA;AAQM,MAAM,YAAY,GAAG,CAAC,EAAE,OAAO,GAAG,sBAAsB,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,GAAG,EAAE,KAAoB,EAAE,EAAE,EAAE;IACpH,OAAO,iBAAO,CAAC,YAAY,CAAC;QACxB,KAAK;QACL,MAAM,EAAE,iBAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU;QAC1E,WAAW,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAQ,EAAE,GAAG,KAAK,EAAE;QACzD,UAAU,EAAE;YACR,IAAI,iBAAO,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC3B,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,2CAA2C;aACvE,CAAC;SACL;QACD,WAAW,EAAE,KAAK;KACrB,CAAC,CAAA;AACN,CAAC,CAAA;AAZY,QAAA,YAAY,gBAYxB;AAED,uCAAuC;AACvC,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;AACxD,kBAAe,MAAM,CAAA;AAErB,8BAA8B;AACvB,MAAM,kBAAkB,GAAG,CAAC,MAAsB,MAAM,EAAE,EAAE,CAAC,CAAC;IACjE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;CAC/C,CAAC,CAAA;AAFW,QAAA,kBAAkB,sBAE7B"}
|