@globalart/nestjs-logger 1.0.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 +263 -0
- package/dist/constants/index.d.ts +22 -0
- package/dist/constants/index.js +38 -0
- package/dist/contracts/index.d.ts +26 -0
- package/dist/contracts/index.js +2 -0
- package/dist/core/http-logger.interceptor.d.ts +16 -0
- package/dist/core/http-logger.interceptor.js +97 -0
- package/dist/core/logger.module.d.ts +20 -0
- package/dist/core/logger.module.js +103 -0
- package/dist/core/logger.service.d.ts +19 -0
- package/dist/core/logger.service.js +60 -0
- package/dist/decorators/index.d.ts +8 -0
- package/dist/decorators/index.js +15 -0
- package/dist/factories/formatter.factory.d.ts +5 -0
- package/dist/factories/formatter.factory.js +31 -0
- package/dist/formatters/base-formatter.d.ts +12 -0
- package/dist/formatters/base-formatter.js +44 -0
- package/dist/formatters/json-formatter.d.ts +6 -0
- package/dist/formatters/json-formatter.js +36 -0
- package/dist/formatters/pino-formatter.d.ts +6 -0
- package/dist/formatters/pino-formatter.js +28 -0
- package/dist/formatters/text-formatter.d.ts +6 -0
- package/dist/formatters/text-formatter.js +45 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +31 -0
- package/dist/interceptors/index.d.ts +1 -0
- package/dist/interceptors/index.js +5 -0
- package/dist/interfaces/index.d.ts +59 -0
- package/dist/interfaces/index.js +2 -0
- package/dist/types/index.d.ts +50 -0
- package/dist/types/index.js +18 -0
- package/dist/utils/context-resolver.d.ts +7 -0
- package/dist/utils/context-resolver.js +68 -0
- package/dist/utils/data-sanitizer.d.ts +9 -0
- package/dist/utils/data-sanitizer.js +56 -0
- package/dist/utils/request-id-generator.d.ts +8 -0
- package/dist/utils/request-id-generator.js +34 -0
- package/dist/writers/console-writer.d.ts +4 -0
- package/dist/writers/console-writer.js +19 -0
- package/package.json +65 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decorator to set logging context for a class or method
|
|
3
|
+
*/
|
|
4
|
+
export declare const LogContext: (context: string) => import("@nestjs/common").CustomDecorator<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Decorator to add metadata to logs
|
|
7
|
+
*/
|
|
8
|
+
export declare const LogMetadata: (metadata: Record<string, unknown>) => import("@nestjs/common").CustomDecorator<string>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LogMetadata = exports.LogContext = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const constants_1 = require("../constants");
|
|
6
|
+
/**
|
|
7
|
+
* Decorator to set logging context for a class or method
|
|
8
|
+
*/
|
|
9
|
+
const LogContext = (context) => (0, common_1.SetMetadata)(constants_1.LOGGER_CONTEXT_METADATA, context);
|
|
10
|
+
exports.LogContext = LogContext;
|
|
11
|
+
/**
|
|
12
|
+
* Decorator to add metadata to logs
|
|
13
|
+
*/
|
|
14
|
+
const LogMetadata = (metadata) => (0, common_1.SetMetadata)(constants_1.LOGGER_METADATA_METADATA, metadata);
|
|
15
|
+
exports.LogMetadata = LogMetadata;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.FormatterFactory = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const text_formatter_1 = require("../formatters/text-formatter");
|
|
12
|
+
const json_formatter_1 = require("../formatters/json-formatter");
|
|
13
|
+
const pino_formatter_1 = require("../formatters/pino-formatter");
|
|
14
|
+
let FormatterFactory = class FormatterFactory {
|
|
15
|
+
create(format, options) {
|
|
16
|
+
switch (format) {
|
|
17
|
+
case "text":
|
|
18
|
+
return new text_formatter_1.TextFormatter(options);
|
|
19
|
+
case "json":
|
|
20
|
+
return new json_formatter_1.JsonFormatter(options);
|
|
21
|
+
case "pino":
|
|
22
|
+
return new pino_formatter_1.PinoFormatter(options);
|
|
23
|
+
default:
|
|
24
|
+
throw new Error(`Unsupported log format: ${format}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
exports.FormatterFactory = FormatterFactory;
|
|
29
|
+
exports.FormatterFactory = FormatterFactory = __decorate([
|
|
30
|
+
(0, common_1.Injectable)()
|
|
31
|
+
], FormatterFactory);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ILogFormatter } from "../contracts";
|
|
2
|
+
import { LogEntry, HttpRequestLogEntry, FormatterOptions } from "../types";
|
|
3
|
+
import { COLORS } from "../constants";
|
|
4
|
+
export declare abstract class BaseFormatter implements ILogFormatter {
|
|
5
|
+
protected readonly options: FormatterOptions;
|
|
6
|
+
constructor(options: FormatterOptions);
|
|
7
|
+
abstract format(entry: LogEntry): string;
|
|
8
|
+
abstract formatHttpRequest(entry: HttpRequestLogEntry): string;
|
|
9
|
+
protected formatTimestamp(timestamp: Date): string;
|
|
10
|
+
protected colorize(text: string, color: keyof typeof COLORS): string;
|
|
11
|
+
protected getColorForLevel(level: string | number): keyof typeof COLORS;
|
|
12
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseFormatter = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
class BaseFormatter {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
formatTimestamp(timestamp) {
|
|
10
|
+
return timestamp.toISOString();
|
|
11
|
+
}
|
|
12
|
+
colorize(text, color) {
|
|
13
|
+
if (!this.options.colors)
|
|
14
|
+
return text;
|
|
15
|
+
return `${constants_1.COLORS[color]}${text}${constants_1.COLORS.reset}`;
|
|
16
|
+
}
|
|
17
|
+
getColorForLevel(level) {
|
|
18
|
+
if (typeof level === "string") {
|
|
19
|
+
switch (level) {
|
|
20
|
+
case "error":
|
|
21
|
+
return "red";
|
|
22
|
+
case "warn":
|
|
23
|
+
return "yellow";
|
|
24
|
+
case "info":
|
|
25
|
+
return "green";
|
|
26
|
+
case "debug":
|
|
27
|
+
return "blue";
|
|
28
|
+
case "verbose":
|
|
29
|
+
return "magenta";
|
|
30
|
+
default:
|
|
31
|
+
return "gray";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Для числовых уровней (Pino)
|
|
35
|
+
if (level >= 50)
|
|
36
|
+
return "red";
|
|
37
|
+
if (level >= 40)
|
|
38
|
+
return "yellow";
|
|
39
|
+
if (level >= 30)
|
|
40
|
+
return "green";
|
|
41
|
+
return "blue";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.BaseFormatter = BaseFormatter;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.JsonFormatter = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const base_formatter_1 = require("./base-formatter");
|
|
12
|
+
let JsonFormatter = class JsonFormatter extends base_formatter_1.BaseFormatter {
|
|
13
|
+
format(entry) {
|
|
14
|
+
const logObject = {
|
|
15
|
+
timestamp: this.formatTimestamp(entry.timestamp),
|
|
16
|
+
level: entry.level,
|
|
17
|
+
message: entry.message,
|
|
18
|
+
...(entry.context && { context: entry.context }),
|
|
19
|
+
...(entry.metadata && { metadata: entry.metadata }),
|
|
20
|
+
...(entry.trace && { trace: entry.trace }),
|
|
21
|
+
};
|
|
22
|
+
return JSON.stringify(logObject);
|
|
23
|
+
}
|
|
24
|
+
formatHttpRequest(entry) {
|
|
25
|
+
const jsonString = JSON.stringify(entry);
|
|
26
|
+
if (this.options.colors) {
|
|
27
|
+
const color = this.getColorForLevel(entry.level);
|
|
28
|
+
return this.colorize(jsonString, color);
|
|
29
|
+
}
|
|
30
|
+
return jsonString;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.JsonFormatter = JsonFormatter;
|
|
34
|
+
exports.JsonFormatter = JsonFormatter = __decorate([
|
|
35
|
+
(0, common_1.Injectable)()
|
|
36
|
+
], JsonFormatter);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PinoFormatter = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const base_formatter_1 = require("./base-formatter");
|
|
12
|
+
let PinoFormatter = class PinoFormatter extends base_formatter_1.BaseFormatter {
|
|
13
|
+
format(entry) {
|
|
14
|
+
return JSON.stringify(entry);
|
|
15
|
+
}
|
|
16
|
+
formatHttpRequest(entry) {
|
|
17
|
+
const jsonString = JSON.stringify(entry);
|
|
18
|
+
if (this.options.colors) {
|
|
19
|
+
const color = this.getColorForLevel(entry.level);
|
|
20
|
+
return this.colorize(jsonString, color);
|
|
21
|
+
}
|
|
22
|
+
return jsonString;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
exports.PinoFormatter = PinoFormatter;
|
|
26
|
+
exports.PinoFormatter = PinoFormatter = __decorate([
|
|
27
|
+
(0, common_1.Injectable)()
|
|
28
|
+
], PinoFormatter);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TextFormatter = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const base_formatter_1 = require("./base-formatter");
|
|
12
|
+
let TextFormatter = class TextFormatter extends base_formatter_1.BaseFormatter {
|
|
13
|
+
format(entry) {
|
|
14
|
+
const parts = [];
|
|
15
|
+
if (this.options.timestamp) {
|
|
16
|
+
const timestamp = this.colorize(`[${this.formatTimestamp(entry.timestamp)}]`, "gray");
|
|
17
|
+
parts.push(timestamp);
|
|
18
|
+
}
|
|
19
|
+
const level = this.colorize(`[${entry.level.toUpperCase()}]`, this.getColorForLevel(entry.level));
|
|
20
|
+
parts.push(level);
|
|
21
|
+
if (entry.context) {
|
|
22
|
+
const context = this.colorize(`[${entry.context}]`, "cyan");
|
|
23
|
+
parts.push(context);
|
|
24
|
+
}
|
|
25
|
+
const message = this.colorize(entry.message, "bright");
|
|
26
|
+
parts.push(message);
|
|
27
|
+
if (entry.metadata && Object.keys(entry.metadata).length > 0) {
|
|
28
|
+
const metadata = this.colorize(JSON.stringify(entry.metadata), "gray");
|
|
29
|
+
parts.push(metadata);
|
|
30
|
+
}
|
|
31
|
+
let result = parts.join(" ");
|
|
32
|
+
if (entry.trace) {
|
|
33
|
+
const trace = this.colorize(entry.trace, "red");
|
|
34
|
+
result += `\n${trace}`;
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
formatHttpRequest(entry) {
|
|
39
|
+
return JSON.stringify(entry);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.TextFormatter = TextFormatter;
|
|
43
|
+
exports.TextFormatter = TextFormatter = __decorate([
|
|
44
|
+
(0, common_1.Injectable)()
|
|
45
|
+
], TextFormatter);
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { LoggerModule, LoggerModuleOptions, LoggerModuleAsyncOptions, } from "./core/logger.module";
|
|
2
|
+
export { LoggerService } from "./core/logger.service";
|
|
3
|
+
export { HttpLoggerInterceptor } from "./core/http-logger.interceptor";
|
|
4
|
+
export { LogContext, LogMetadata } from "./decorators";
|
|
5
|
+
export * from "./types";
|
|
6
|
+
export * from "./contracts";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.LogMetadata = exports.LogContext = exports.HttpLoggerInterceptor = exports.LoggerService = exports.LoggerModule = void 0;
|
|
18
|
+
// Core
|
|
19
|
+
var logger_module_1 = require("./core/logger.module");
|
|
20
|
+
Object.defineProperty(exports, "LoggerModule", { enumerable: true, get: function () { return logger_module_1.LoggerModule; } });
|
|
21
|
+
var logger_service_1 = require("./core/logger.service");
|
|
22
|
+
Object.defineProperty(exports, "LoggerService", { enumerable: true, get: function () { return logger_service_1.LoggerService; } });
|
|
23
|
+
var http_logger_interceptor_1 = require("./core/http-logger.interceptor");
|
|
24
|
+
Object.defineProperty(exports, "HttpLoggerInterceptor", { enumerable: true, get: function () { return http_logger_interceptor_1.HttpLoggerInterceptor; } });
|
|
25
|
+
var decorators_1 = require("./decorators");
|
|
26
|
+
Object.defineProperty(exports, "LogContext", { enumerable: true, get: function () { return decorators_1.LogContext; } });
|
|
27
|
+
Object.defineProperty(exports, "LogMetadata", { enumerable: true, get: function () { return decorators_1.LogMetadata; } });
|
|
28
|
+
// Types
|
|
29
|
+
__exportStar(require("./types"), exports);
|
|
30
|
+
// Contracts
|
|
31
|
+
__exportStar(require("./contracts"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { HttpLoggerInterceptor } from "../core/http-logger.interceptor";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpLoggerInterceptor = void 0;
|
|
4
|
+
var http_logger_interceptor_1 = require("../core/http-logger.interceptor");
|
|
5
|
+
Object.defineProperty(exports, "HttpLoggerInterceptor", { enumerable: true, get: function () { return http_logger_interceptor_1.HttpLoggerInterceptor; } });
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export interface LoggerOptions {
|
|
2
|
+
level?: "error" | "warn" | "log" | "debug" | "verbose";
|
|
3
|
+
timestamp?: boolean;
|
|
4
|
+
colors?: boolean;
|
|
5
|
+
context?: string;
|
|
6
|
+
format?: "json" | "text" | "pino";
|
|
7
|
+
transports?: LoggerTransport[];
|
|
8
|
+
pino?: PinoOptions;
|
|
9
|
+
}
|
|
10
|
+
export interface PinoOptions {
|
|
11
|
+
level?: string;
|
|
12
|
+
timestamp?: boolean;
|
|
13
|
+
base?: boolean;
|
|
14
|
+
name?: string;
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface LoggerTransport {
|
|
18
|
+
name: string;
|
|
19
|
+
level?: string;
|
|
20
|
+
format?: any;
|
|
21
|
+
filename?: string;
|
|
22
|
+
dirname?: string;
|
|
23
|
+
maxsize?: number;
|
|
24
|
+
maxFiles?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface LogContext {
|
|
27
|
+
timestamp?: string;
|
|
28
|
+
level: string;
|
|
29
|
+
message: string;
|
|
30
|
+
context?: string;
|
|
31
|
+
trace?: string;
|
|
32
|
+
metadata?: Record<string, any>;
|
|
33
|
+
}
|
|
34
|
+
export interface LoggerMetadata {
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
}
|
|
37
|
+
export interface RequestLogData {
|
|
38
|
+
req: {
|
|
39
|
+
id: number;
|
|
40
|
+
method: string;
|
|
41
|
+
url: string;
|
|
42
|
+
query: Record<string, any>;
|
|
43
|
+
params: Record<string, any>;
|
|
44
|
+
headers: Record<string, any>;
|
|
45
|
+
remoteAddress: string;
|
|
46
|
+
remotePort?: number;
|
|
47
|
+
body?: any;
|
|
48
|
+
};
|
|
49
|
+
res: {
|
|
50
|
+
statusCode: number;
|
|
51
|
+
headers: Record<string, any>;
|
|
52
|
+
};
|
|
53
|
+
responseTime: number;
|
|
54
|
+
msg: string;
|
|
55
|
+
level: number;
|
|
56
|
+
time: number;
|
|
57
|
+
pid: number;
|
|
58
|
+
hostname: string;
|
|
59
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type LogLevel = "error" | "warn" | "info" | "debug" | "verbose";
|
|
2
|
+
export type LogFormat = "json" | "text" | "pino";
|
|
3
|
+
export declare const LOG_LEVELS: Record<LogLevel, number>;
|
|
4
|
+
export declare const PINO_LEVELS: Record<number, string>;
|
|
5
|
+
export interface LogEntry {
|
|
6
|
+
readonly level: LogLevel;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
readonly timestamp: Date;
|
|
9
|
+
readonly context?: string;
|
|
10
|
+
readonly metadata?: Record<string, unknown>;
|
|
11
|
+
readonly trace?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface HttpRequestLogEntry {
|
|
14
|
+
readonly level: number;
|
|
15
|
+
readonly time: number;
|
|
16
|
+
readonly pid: number;
|
|
17
|
+
readonly hostname: string;
|
|
18
|
+
readonly req: HttpRequest;
|
|
19
|
+
readonly res: HttpResponse;
|
|
20
|
+
readonly responseTime: number;
|
|
21
|
+
readonly msg: string;
|
|
22
|
+
}
|
|
23
|
+
export interface HttpRequest {
|
|
24
|
+
readonly id: string;
|
|
25
|
+
readonly method: string;
|
|
26
|
+
readonly url: string;
|
|
27
|
+
readonly query: Record<string, unknown>;
|
|
28
|
+
readonly params: Record<string, unknown>;
|
|
29
|
+
readonly headers: Record<string, string>;
|
|
30
|
+
readonly remoteAddress: string;
|
|
31
|
+
readonly remotePort?: number;
|
|
32
|
+
readonly body?: unknown;
|
|
33
|
+
}
|
|
34
|
+
export interface HttpResponse {
|
|
35
|
+
readonly statusCode: number;
|
|
36
|
+
readonly headers: Record<string, string>;
|
|
37
|
+
}
|
|
38
|
+
export interface LoggerConfiguration {
|
|
39
|
+
readonly level: LogLevel;
|
|
40
|
+
readonly timestamp: boolean;
|
|
41
|
+
readonly colors: boolean;
|
|
42
|
+
readonly context?: string;
|
|
43
|
+
readonly format: LogFormat;
|
|
44
|
+
readonly sensitiveFields: readonly string[];
|
|
45
|
+
}
|
|
46
|
+
export interface FormatterOptions {
|
|
47
|
+
readonly colors: boolean;
|
|
48
|
+
readonly timestamp: boolean;
|
|
49
|
+
readonly context?: string;
|
|
50
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PINO_LEVELS = exports.LOG_LEVELS = void 0;
|
|
4
|
+
exports.LOG_LEVELS = {
|
|
5
|
+
error: 50,
|
|
6
|
+
warn: 40,
|
|
7
|
+
info: 30,
|
|
8
|
+
debug: 20,
|
|
9
|
+
verbose: 10,
|
|
10
|
+
};
|
|
11
|
+
exports.PINO_LEVELS = {
|
|
12
|
+
60: "FATAL",
|
|
13
|
+
50: "ERROR",
|
|
14
|
+
40: "WARN",
|
|
15
|
+
30: "INFO",
|
|
16
|
+
20: "DEBUG",
|
|
17
|
+
10: "TRACE",
|
|
18
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ContextResolver = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
let ContextResolver = class ContextResolver {
|
|
12
|
+
resolve() {
|
|
13
|
+
const stack = new Error().stack;
|
|
14
|
+
if (!stack)
|
|
15
|
+
return "Unknown";
|
|
16
|
+
const lines = stack.split("\n");
|
|
17
|
+
for (let i = 3; i < lines.length; i++) {
|
|
18
|
+
const line = lines[i].trim();
|
|
19
|
+
if (this.shouldSkipLine(line))
|
|
20
|
+
continue;
|
|
21
|
+
const className = this.extractClassName(line);
|
|
22
|
+
if (className)
|
|
23
|
+
return className;
|
|
24
|
+
}
|
|
25
|
+
return "Unknown";
|
|
26
|
+
}
|
|
27
|
+
shouldSkipLine(line) {
|
|
28
|
+
const skipPatterns = [
|
|
29
|
+
"ContextResolver",
|
|
30
|
+
"LoggerService",
|
|
31
|
+
"Object.writeLog",
|
|
32
|
+
"Object.log",
|
|
33
|
+
"Object.error",
|
|
34
|
+
"Object.warn",
|
|
35
|
+
"Object.debug",
|
|
36
|
+
"Object.verbose",
|
|
37
|
+
"at async",
|
|
38
|
+
"at processTicksAndRejections",
|
|
39
|
+
];
|
|
40
|
+
return skipPatterns.some((pattern) => line.includes(pattern));
|
|
41
|
+
}
|
|
42
|
+
extractClassName(line) {
|
|
43
|
+
// Пытаемся найти имя класса в различных форматах
|
|
44
|
+
const patterns = [
|
|
45
|
+
/at\s+(\w+)\./, // at ClassName.method
|
|
46
|
+
/at\s+.*\.(\w+)\s+\(/, // at path.ClassName (
|
|
47
|
+
/(\w+)\..*\s+\(/, // ClassName.method (
|
|
48
|
+
];
|
|
49
|
+
for (const pattern of patterns) {
|
|
50
|
+
const match = line.match(pattern);
|
|
51
|
+
if (match && match[1] && this.isValidClassName(match[1])) {
|
|
52
|
+
return match[1];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
isValidClassName(name) {
|
|
58
|
+
// Проверяем, что это валидное имя класса (начинается с заглавной буквы)
|
|
59
|
+
return (/^[A-Z][a-zA-Z0-9]*$/.test(name) &&
|
|
60
|
+
name !== "Object" &&
|
|
61
|
+
name !== "Function" &&
|
|
62
|
+
name !== "AsyncFunction");
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.ContextResolver = ContextResolver;
|
|
66
|
+
exports.ContextResolver = ContextResolver = __decorate([
|
|
67
|
+
(0, common_1.Injectable)()
|
|
68
|
+
], ContextResolver);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IDataSanitizer } from "../contracts";
|
|
2
|
+
export declare class DataSanitizer implements IDataSanitizer {
|
|
3
|
+
private readonly sensitiveFields;
|
|
4
|
+
private readonly redactedValue;
|
|
5
|
+
constructor(sensitiveFields: readonly string[]);
|
|
6
|
+
sanitize(data: unknown): unknown;
|
|
7
|
+
private sanitizeObject;
|
|
8
|
+
private isSensitiveField;
|
|
9
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DataSanitizer = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
let DataSanitizer = class DataSanitizer {
|
|
15
|
+
constructor(sensitiveFields) {
|
|
16
|
+
this.sensitiveFields = sensitiveFields;
|
|
17
|
+
this.redactedValue = "[REDACTED]";
|
|
18
|
+
}
|
|
19
|
+
sanitize(data) {
|
|
20
|
+
if (data === null || data === undefined)
|
|
21
|
+
return data;
|
|
22
|
+
if (typeof data === "string" ||
|
|
23
|
+
typeof data === "number" ||
|
|
24
|
+
typeof data === "boolean") {
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(data)) {
|
|
28
|
+
return data.map((item) => this.sanitize(item));
|
|
29
|
+
}
|
|
30
|
+
if (typeof data === "object") {
|
|
31
|
+
return this.sanitizeObject(data);
|
|
32
|
+
}
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
sanitizeObject(obj) {
|
|
36
|
+
const sanitized = {};
|
|
37
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
38
|
+
if (this.isSensitiveField(key)) {
|
|
39
|
+
sanitized[key] = this.redactedValue;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
sanitized[key] = this.sanitize(value);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return sanitized;
|
|
46
|
+
}
|
|
47
|
+
isSensitiveField(fieldName) {
|
|
48
|
+
const lowerFieldName = fieldName.toLowerCase();
|
|
49
|
+
return this.sensitiveFields.some((sensitive) => lowerFieldName.includes(sensitive.toLowerCase()));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.DataSanitizer = DataSanitizer;
|
|
53
|
+
exports.DataSanitizer = DataSanitizer = __decorate([
|
|
54
|
+
(0, common_1.Injectable)(),
|
|
55
|
+
__metadata("design:paramtypes", [Array])
|
|
56
|
+
], DataSanitizer);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RequestIdGenerator = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const crypto_1 = require("crypto");
|
|
15
|
+
let RequestIdGenerator = class RequestIdGenerator {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.counter = 0;
|
|
18
|
+
this.machineId = this.generateMachineId();
|
|
19
|
+
}
|
|
20
|
+
generate() {
|
|
21
|
+
const timestamp = Date.now().toString(36);
|
|
22
|
+
const counter = (++this.counter).toString(36);
|
|
23
|
+
const random = (0, crypto_1.randomBytes)(2).toString("hex");
|
|
24
|
+
return `${timestamp}-${this.machineId}-${counter}-${random}`;
|
|
25
|
+
}
|
|
26
|
+
generateMachineId() {
|
|
27
|
+
return (0, crypto_1.randomBytes)(3).toString("hex");
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.RequestIdGenerator = RequestIdGenerator;
|
|
31
|
+
exports.RequestIdGenerator = RequestIdGenerator = __decorate([
|
|
32
|
+
(0, common_1.Injectable)(),
|
|
33
|
+
__metadata("design:paramtypes", [])
|
|
34
|
+
], RequestIdGenerator);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ConsoleWriter = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
let ConsoleWriter = class ConsoleWriter {
|
|
12
|
+
write(formattedLog) {
|
|
13
|
+
console.log(formattedLog);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
exports.ConsoleWriter = ConsoleWriter;
|
|
17
|
+
exports.ConsoleWriter = ConsoleWriter = __decorate([
|
|
18
|
+
(0, common_1.Injectable)()
|
|
19
|
+
], ConsoleWriter);
|