@nest-yalc-2/logger 1.0.0 → 2.1.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/package.json +1 -1
- package/src/__tests__/logger.factory.spec.ts +9 -9
- package/src/__tests__/logger.helper.spec.ts +1 -1
- package/src/index.d.ts +7 -7
- package/src/index.js +13 -24
- package/src/index.js.map +1 -1
- package/src/index.ts +7 -7
- package/src/logger-nest.service.d.ts +4 -4
- package/src/logger-nest.service.js +6 -6
- package/src/logger-nest.service.js.map +1 -1
- package/src/logger-nest.service.ts +4 -3
- package/src/logger.factory.d.ts +1 -1
- package/src/logger.factory.js +14 -46
- package/src/logger.factory.js.map +1 -1
- package/src/logger.factory.ts +5 -5
- package/src/logger.service.d.ts +1 -1
- package/src/logger.service.js +2 -2
- package/src/logger.service.js.map +1 -1
- package/src/logger.service.ts +3 -2
- package/src/typeorm-logger.d.ts +1 -1
- package/src/typeorm-logger.js +9 -9
- package/src/typeorm-logger.js.map +1 -1
- package/src/typeorm-logger.ts +2 -2
- package/src/__tests__/logger-console.service.spec.ts +0 -136
- package/src/__tests__/logger-pino.service.spec.ts +0 -149
- package/src/logger-abstract.service.d.ts +0 -65
- package/src/logger-abstract.service.js +0 -91
- package/src/logger-abstract.service.js.map +0 -1
- package/src/logger-abstract.service.ts +0 -210
- package/src/logger-console.service.d.ts +0 -5
- package/src/logger-console.service.js +0 -23
- package/src/logger-console.service.js.map +0 -1
- package/src/logger-console.service.ts +0 -80
- package/src/logger-pino.service.d.ts +0 -10
- package/src/logger-pino.service.js +0 -89
- package/src/logger-pino.service.js.map +0 -1
- package/src/logger-pino.service.ts +0 -161
- package/src/logger.enum.d.ts +0 -17
- package/src/logger.enum.js +0 -35
- package/src/logger.enum.js.map +0 -1
- package/src/logger.enum.ts +0 -32
- package/src/logger.event.d.ts +0 -11
- package/src/logger.event.js +0 -16
- package/src/logger.event.js.map +0 -1
- package/src/logger.event.ts +0 -11
- package/src/logger.helper.d.ts +0 -4
- package/src/logger.helper.js +0 -36
- package/src/logger.helper.js.map +0 -1
- package/src/logger.helper.ts +0 -40
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger-console.service.js","sourceRoot":"","sources":["logger-console.service.ts"],"names":[],"mappings":";;;AAEA,6EAGsC;AACtC,yDAAsD;AAEtD,MAAM,cAAc,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;IACxC,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,OAAO;QAClC,OAAO,OAAO,KAAK,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAa,aAAc,SAAQ,kDAAqB;IACtD,YACE,OAAe,EACf,SAAiC,EACjC,UAAkC,EAAE;QAEpC,KAAK,CACH,OAAO,EACP,SAAS,EACT;YACE,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CACjC,OAAO,CAAC,GAAG,CACT,GAAG,cAAc,CACf,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,GAAG,EAClC,OAAO,EACP,IAAA,mCAAgB,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAC/D,OAAO,EAAE,MAAM,EACf,GAAG,IAAI,CACR,CACF;YACH,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAC1C,OAAO,CAAC,KAAK,CACX,GAAG,cAAc,CACf,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,GAAG,EAClC,OAAO,EACP,KAAK,EACL,IAAA,mCAAgB,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAC/C,OAAO,EAAE,MAAM,EACf,GAAG,IAAI,CACR,CACF;YACH,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CACnC,OAAO,CAAC,KAAK,CACX,GAAG,cAAc,CACf,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,GAAG,EAClC,OAAO,EACP,IAAA,mCAAgB,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAC/D,OAAO,EAAE,MAAM,EACf,GAAG,IAAI,CACR,CACF;YACH,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAClC,OAAO,CAAC,IAAI,CACV,GAAG,cAAc,CACf,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,GAAG,EAClC,OAAO,EACP,IAAA,mCAAgB,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAC/D,OAAO,EAAE,MAAM,EACf,GAAG,IAAI,CACR,CACF;YACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CACrC,OAAO,CAAC,IAAI,CACV,GAAG,cAAc,CACf,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,GAAG,EAClC,OAAO,EACP,IAAA,mCAAgB,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAC/D,OAAO,EAAE,MAAM,EACf,GAAG,IAAI,CACR,CACF;SACJ,EACD,OAAO,CACR,CAAC;IACJ,CAAC;CACF;AAjED,sCAiEC"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import { LogLevel } from '@nestjs/common';
|
|
3
|
-
import {
|
|
4
|
-
IImprovedLoggerOptions,
|
|
5
|
-
LoggerAbstractService,
|
|
6
|
-
} from './logger-abstract.service.js';
|
|
7
|
-
import { maskDataInObject } from './logger.helper.js';
|
|
8
|
-
|
|
9
|
-
const logOnlyDefined = (...args: any[]) => {
|
|
10
|
-
return args.filter(function (element) {
|
|
11
|
-
return element !== undefined;
|
|
12
|
-
});
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export class ConsoleLogger extends LoggerAbstractService {
|
|
16
|
-
constructor(
|
|
17
|
-
context: string,
|
|
18
|
-
logLevels: LogLevel[] | undefined,
|
|
19
|
-
options: IImprovedLoggerOptions = {},
|
|
20
|
-
) {
|
|
21
|
-
super(
|
|
22
|
-
context,
|
|
23
|
-
logLevels,
|
|
24
|
-
{
|
|
25
|
-
log: (message, options, ...rest) =>
|
|
26
|
-
console.log(
|
|
27
|
-
...logOnlyDefined(
|
|
28
|
-
`[${options?.context ?? context}]`,
|
|
29
|
-
message,
|
|
30
|
-
maskDataInObject(options?.data, options?.masks, options?.stack),
|
|
31
|
-
options?.config,
|
|
32
|
-
...rest,
|
|
33
|
-
),
|
|
34
|
-
),
|
|
35
|
-
error: (message, trace, options, ...rest) =>
|
|
36
|
-
console.error(
|
|
37
|
-
...logOnlyDefined(
|
|
38
|
-
`[${options?.context ?? context}]`,
|
|
39
|
-
message,
|
|
40
|
-
trace,
|
|
41
|
-
maskDataInObject(options?.data, options?.masks),
|
|
42
|
-
options?.config,
|
|
43
|
-
...rest,
|
|
44
|
-
),
|
|
45
|
-
),
|
|
46
|
-
debug: (message, options, ...rest) =>
|
|
47
|
-
console.debug(
|
|
48
|
-
...logOnlyDefined(
|
|
49
|
-
`[${options?.context ?? context}]`,
|
|
50
|
-
message,
|
|
51
|
-
maskDataInObject(options?.data, options?.masks, options?.stack),
|
|
52
|
-
options?.config,
|
|
53
|
-
...rest,
|
|
54
|
-
),
|
|
55
|
-
),
|
|
56
|
-
warn: (message, options, ...rest) =>
|
|
57
|
-
console.warn(
|
|
58
|
-
...logOnlyDefined(
|
|
59
|
-
`[${options?.context ?? context}]`,
|
|
60
|
-
message,
|
|
61
|
-
maskDataInObject(options?.data, options?.masks, options?.stack),
|
|
62
|
-
options?.config,
|
|
63
|
-
...rest,
|
|
64
|
-
),
|
|
65
|
-
),
|
|
66
|
-
verbose: (message, options, ...rest) =>
|
|
67
|
-
console.info(
|
|
68
|
-
...logOnlyDefined(
|
|
69
|
-
`[${options?.context ?? context}]`,
|
|
70
|
-
message,
|
|
71
|
-
maskDataInObject(options?.data, options?.masks, options?.stack),
|
|
72
|
-
options?.config,
|
|
73
|
-
...rest,
|
|
74
|
-
),
|
|
75
|
-
),
|
|
76
|
-
},
|
|
77
|
-
options,
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { LogLevel, OnApplicationShutdown } from '@nestjs/common';
|
|
2
|
-
import { type Logger } from 'pino';
|
|
3
|
-
import { type IImprovedLoggerOptions, LoggerAbstractService } from './logger-abstract.service.js';
|
|
4
|
-
export declare const FLUSH_INTERVAL = 10000;
|
|
5
|
-
export declare class PinoLogger extends LoggerAbstractService implements OnApplicationShutdown {
|
|
6
|
-
getLogger(): Logger;
|
|
7
|
-
constructor(context: string, logLevels: LogLevel[], options?: IImprovedLoggerOptions);
|
|
8
|
-
onApplicationShutdown(): Promise<void>;
|
|
9
|
-
}
|
|
10
|
-
export declare function flush(): Promise<unknown>;
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.PinoLogger = exports.FLUSH_INTERVAL = void 0;
|
|
7
|
-
exports.flush = flush;
|
|
8
|
-
const pino_1 = __importDefault(require("pino"));
|
|
9
|
-
const logger_abstract_service_js_1 = require("./logger-abstract.service.js");
|
|
10
|
-
const logger_helper_js_1 = require("./logger.helper.js");
|
|
11
|
-
const promise_helper_js_1 = require("@nest-yalc-2/utils/promise.helper.js");
|
|
12
|
-
let logger;
|
|
13
|
-
let destination;
|
|
14
|
-
exports.FLUSH_INTERVAL = 10000;
|
|
15
|
-
class PinoLogger extends logger_abstract_service_js_1.LoggerAbstractService {
|
|
16
|
-
getLogger() {
|
|
17
|
-
return logger;
|
|
18
|
-
}
|
|
19
|
-
constructor(context, logLevels, options = {}) {
|
|
20
|
-
super(context, logLevels, {
|
|
21
|
-
log: (message, options) => logger.info({
|
|
22
|
-
context: options?.context ?? context,
|
|
23
|
-
...(0, logger_helper_js_1.maskDataInObject)(options?.data, options?.masks),
|
|
24
|
-
config: options?.config,
|
|
25
|
-
trace: options?.stack,
|
|
26
|
-
}, message),
|
|
27
|
-
error: (message, trace, options) => {
|
|
28
|
-
logger.error({
|
|
29
|
-
context: options?.context ?? context,
|
|
30
|
-
...(0, logger_helper_js_1.maskDataInObject)(options?.data, options?.masks),
|
|
31
|
-
config: options?.config,
|
|
32
|
-
trace,
|
|
33
|
-
}, message);
|
|
34
|
-
},
|
|
35
|
-
debug: (message, options) => logger.debug({
|
|
36
|
-
context: options?.context ?? context,
|
|
37
|
-
...(0, logger_helper_js_1.maskDataInObject)(options?.data, options?.masks),
|
|
38
|
-
config: options?.config,
|
|
39
|
-
trace: options?.stack,
|
|
40
|
-
}, message),
|
|
41
|
-
warn: (message, options) => logger.warn({
|
|
42
|
-
context: options?.context ?? context,
|
|
43
|
-
...(0, logger_helper_js_1.maskDataInObject)(options?.data, options?.masks),
|
|
44
|
-
config: options?.config,
|
|
45
|
-
trace: options?.stack,
|
|
46
|
-
}, message),
|
|
47
|
-
verbose: (message, options) => logger.trace({
|
|
48
|
-
context: options?.context ?? context,
|
|
49
|
-
...(0, logger_helper_js_1.maskDataInObject)(options?.data, options?.masks),
|
|
50
|
-
config: options?.config,
|
|
51
|
-
trace: options?.stack,
|
|
52
|
-
}, message),
|
|
53
|
-
}, options);
|
|
54
|
-
if (!logger) {
|
|
55
|
-
destination = pino_1.default.destination({ sync: false });
|
|
56
|
-
logger = (0, pino_1.default)({
|
|
57
|
-
formatters: {
|
|
58
|
-
level: (label) => {
|
|
59
|
-
return { level: label };
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
timestamp: () => `,"timestamp":"${new Date().toISOString()}"`,
|
|
63
|
-
}, destination);
|
|
64
|
-
}
|
|
65
|
-
logger.level = 'trace';
|
|
66
|
-
setInterval(function () {
|
|
67
|
-
logger.flush();
|
|
68
|
-
}, exports.FLUSH_INTERVAL).unref();
|
|
69
|
-
promise_helper_js_1.globalPromiseTracker.addDeferred(flush);
|
|
70
|
-
}
|
|
71
|
-
async onApplicationShutdown() {
|
|
72
|
-
await flush();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
exports.PinoLogger = PinoLogger;
|
|
76
|
-
function flush() {
|
|
77
|
-
destination?.flushSync();
|
|
78
|
-
return new Promise((resolve, reject) => {
|
|
79
|
-
logger.flush((err) => {
|
|
80
|
-
if (err) {
|
|
81
|
-
reject(err);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
resolve('Logger flushed successfully');
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=logger-pino.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger-pino.service.js","sourceRoot":"","sources":["logger-pino.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { LogLevel, OnApplicationShutdown } from '@nestjs/common';
|
|
2
|
-
import pino, { type Logger } from 'pino';
|
|
3
|
-
import {
|
|
4
|
-
type IImprovedLoggerOptions,
|
|
5
|
-
LoggerAbstractService,
|
|
6
|
-
} from './logger-abstract.service.js';
|
|
7
|
-
import { maskDataInObject } from './logger.helper.js';
|
|
8
|
-
import { globalPromiseTracker } from '@nest-yalc-2/utils/promise.helper.js';
|
|
9
|
-
import { SonicBoom } from 'sonic-boom';
|
|
10
|
-
|
|
11
|
-
let logger: Logger;
|
|
12
|
-
let destination: SonicBoom;
|
|
13
|
-
|
|
14
|
-
export const FLUSH_INTERVAL = 10000;
|
|
15
|
-
|
|
16
|
-
export class PinoLogger
|
|
17
|
-
extends LoggerAbstractService
|
|
18
|
-
implements OnApplicationShutdown
|
|
19
|
-
{
|
|
20
|
-
getLogger(): Logger {
|
|
21
|
-
return logger;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
constructor(
|
|
25
|
-
context: string,
|
|
26
|
-
logLevels: LogLevel[],
|
|
27
|
-
options: IImprovedLoggerOptions = {},
|
|
28
|
-
) {
|
|
29
|
-
super(
|
|
30
|
-
context,
|
|
31
|
-
logLevels,
|
|
32
|
-
{
|
|
33
|
-
log: (message, options) =>
|
|
34
|
-
logger.info(
|
|
35
|
-
{
|
|
36
|
-
context: options?.context ?? context,
|
|
37
|
-
...maskDataInObject(options?.data, options?.masks),
|
|
38
|
-
config: options?.config,
|
|
39
|
-
trace: options?.stack,
|
|
40
|
-
},
|
|
41
|
-
message,
|
|
42
|
-
),
|
|
43
|
-
error: (message, trace, options) => {
|
|
44
|
-
logger.error(
|
|
45
|
-
{
|
|
46
|
-
context: options?.context ?? context,
|
|
47
|
-
...maskDataInObject(options?.data, options?.masks),
|
|
48
|
-
config: options?.config,
|
|
49
|
-
trace,
|
|
50
|
-
},
|
|
51
|
-
message,
|
|
52
|
-
);
|
|
53
|
-
},
|
|
54
|
-
debug: (message, options) =>
|
|
55
|
-
logger.debug(
|
|
56
|
-
{
|
|
57
|
-
context: options?.context ?? context,
|
|
58
|
-
...maskDataInObject(options?.data, options?.masks),
|
|
59
|
-
config: options?.config,
|
|
60
|
-
trace: options?.stack,
|
|
61
|
-
},
|
|
62
|
-
message,
|
|
63
|
-
),
|
|
64
|
-
warn: (message, options) =>
|
|
65
|
-
logger.warn(
|
|
66
|
-
{
|
|
67
|
-
context: options?.context ?? context,
|
|
68
|
-
...maskDataInObject(options?.data, options?.masks),
|
|
69
|
-
config: options?.config,
|
|
70
|
-
trace: options?.stack,
|
|
71
|
-
},
|
|
72
|
-
message,
|
|
73
|
-
),
|
|
74
|
-
verbose: (message, options) =>
|
|
75
|
-
logger.trace(
|
|
76
|
-
{
|
|
77
|
-
context: options?.context ?? context,
|
|
78
|
-
...maskDataInObject(options?.data, options?.masks),
|
|
79
|
-
config: options?.config,
|
|
80
|
-
trace: options?.stack,
|
|
81
|
-
},
|
|
82
|
-
message,
|
|
83
|
-
),
|
|
84
|
-
},
|
|
85
|
-
options,
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
if (!logger) {
|
|
89
|
-
destination = pino.destination({ sync: false });
|
|
90
|
-
logger = pino(
|
|
91
|
-
{
|
|
92
|
-
// base: {
|
|
93
|
-
// memorySize: process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE,
|
|
94
|
-
// region: process.env.AWS_REGION,
|
|
95
|
-
// runtime: process.env.AWS_EXECUTION_ENV,
|
|
96
|
-
// version: process.env.AWS_LAMBDA_FUNCTION_VERSION,
|
|
97
|
-
// },
|
|
98
|
-
// name: process.env.AWS_LAMBDA_FUNCTION_NAME,
|
|
99
|
-
// level: process.env.LOG_LEVEL || 'info',
|
|
100
|
-
formatters: {
|
|
101
|
-
level: (label: string) => {
|
|
102
|
-
return { level: label };
|
|
103
|
-
},
|
|
104
|
-
},
|
|
105
|
-
timestamp: () => `,"timestamp":"${new Date().toISOString()}"`,
|
|
106
|
-
},
|
|
107
|
-
destination,
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
logger.level = 'trace'; // enable all. Levels are handled by the Service.
|
|
112
|
-
|
|
113
|
-
// asynchronously flush every 10 seconds to keep the buffer empty
|
|
114
|
-
// in periods of low activity
|
|
115
|
-
setInterval(function () {
|
|
116
|
-
logger.flush();
|
|
117
|
-
}, FLUSH_INTERVAL).unref();
|
|
118
|
-
|
|
119
|
-
// TODO: remove it if it's not needed anymore (https://github.com/pinojs/pino/pull/1240/files)
|
|
120
|
-
// use pino.final to create a special logger that
|
|
121
|
-
// guarantees final tick writes
|
|
122
|
-
// const handler = pino.destination(
|
|
123
|
-
// logger,
|
|
124
|
-
// (err: String, finalLogger: Logger, evt: String) => {
|
|
125
|
-
// finalLogger.info(`${evt} caught`);
|
|
126
|
-
// if (err) finalLogger.error(err, 'error caused exit');
|
|
127
|
-
// process.exit(err ? 1 : 0);
|
|
128
|
-
// },
|
|
129
|
-
// );
|
|
130
|
-
// // catch all the ways node might exit
|
|
131
|
-
// process.on('beforeExit', () => handler(null, 'beforeExit'));
|
|
132
|
-
// process.on('exit', () => handler(null, 'exit'));
|
|
133
|
-
// process.on('uncaughtException', (err) => handler(err, 'uncaughtException'));
|
|
134
|
-
// process.on('SIGINT', () => handler(null, 'SIGINT'));
|
|
135
|
-
// process.on('SIGQUIT', () => handler(null, 'SIGQUIT'));
|
|
136
|
-
// process.on('SIGTERM', () => handler(null, 'SIGTERM'));
|
|
137
|
-
|
|
138
|
-
globalPromiseTracker.addDeferred(flush);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
async onApplicationShutdown() {
|
|
142
|
-
await flush();
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* We keep this function outside of the class such that we do not rely
|
|
148
|
-
* on the class instance that might be destroyed before the flush is called.
|
|
149
|
-
*/
|
|
150
|
-
export function flush() {
|
|
151
|
-
destination?.flushSync();
|
|
152
|
-
return new Promise((resolve, reject) => {
|
|
153
|
-
logger.flush((err) => {
|
|
154
|
-
if (err) {
|
|
155
|
-
reject(err);
|
|
156
|
-
} else {
|
|
157
|
-
resolve('Logger flushed successfully');
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
}
|
package/src/logger.enum.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export declare enum LogLevelEnum {
|
|
2
|
-
LOG = "log",
|
|
3
|
-
ERROR = "error",
|
|
4
|
-
WARN = "warn",
|
|
5
|
-
DEBUG = "debug",
|
|
6
|
-
VERBOSE = "verbose"
|
|
7
|
-
}
|
|
8
|
-
export declare const LOG_LEVEL_DEFAULT: LogLevelEnum[];
|
|
9
|
-
export declare const LOG_LEVEL_ALL: LogLevelEnum[];
|
|
10
|
-
export declare enum LoggerTypeEnum {
|
|
11
|
-
CONSOLE = "console",
|
|
12
|
-
PINO = "pino",
|
|
13
|
-
NEST = "nest-logger"
|
|
14
|
-
}
|
|
15
|
-
export declare enum LoggerDefContext {
|
|
16
|
-
NEST_SYSTEM = "system"
|
|
17
|
-
}
|
package/src/logger.enum.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LoggerDefContext = exports.LoggerTypeEnum = exports.LOG_LEVEL_ALL = exports.LOG_LEVEL_DEFAULT = exports.LogLevelEnum = void 0;
|
|
4
|
-
var LogLevelEnum;
|
|
5
|
-
(function (LogLevelEnum) {
|
|
6
|
-
LogLevelEnum["LOG"] = "log";
|
|
7
|
-
LogLevelEnum["ERROR"] = "error";
|
|
8
|
-
LogLevelEnum["WARN"] = "warn";
|
|
9
|
-
LogLevelEnum["DEBUG"] = "debug";
|
|
10
|
-
LogLevelEnum["VERBOSE"] = "verbose";
|
|
11
|
-
})(LogLevelEnum || (exports.LogLevelEnum = LogLevelEnum = {}));
|
|
12
|
-
exports.LOG_LEVEL_DEFAULT = [
|
|
13
|
-
LogLevelEnum.DEBUG,
|
|
14
|
-
LogLevelEnum.ERROR,
|
|
15
|
-
LogLevelEnum.LOG,
|
|
16
|
-
LogLevelEnum.WARN,
|
|
17
|
-
];
|
|
18
|
-
exports.LOG_LEVEL_ALL = [
|
|
19
|
-
LogLevelEnum.DEBUG,
|
|
20
|
-
LogLevelEnum.ERROR,
|
|
21
|
-
LogLevelEnum.LOG,
|
|
22
|
-
LogLevelEnum.VERBOSE,
|
|
23
|
-
LogLevelEnum.WARN,
|
|
24
|
-
];
|
|
25
|
-
var LoggerTypeEnum;
|
|
26
|
-
(function (LoggerTypeEnum) {
|
|
27
|
-
LoggerTypeEnum["CONSOLE"] = "console";
|
|
28
|
-
LoggerTypeEnum["PINO"] = "pino";
|
|
29
|
-
LoggerTypeEnum["NEST"] = "nest-logger";
|
|
30
|
-
})(LoggerTypeEnum || (exports.LoggerTypeEnum = LoggerTypeEnum = {}));
|
|
31
|
-
var LoggerDefContext;
|
|
32
|
-
(function (LoggerDefContext) {
|
|
33
|
-
LoggerDefContext["NEST_SYSTEM"] = "system";
|
|
34
|
-
})(LoggerDefContext || (exports.LoggerDefContext = LoggerDefContext = {}));
|
|
35
|
-
//# sourceMappingURL=logger.enum.js.map
|
package/src/logger.enum.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.enum.js","sourceRoot":"","sources":["logger.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,2BAAW,CAAA;IACX,+BAAe,CAAA;IACf,6BAAa,CAAA;IACb,+BAAe,CAAA;IACf,mCAAmB,CAAA;AACrB,CAAC,EANW,YAAY,4BAAZ,YAAY,QAMvB;AAEY,QAAA,iBAAiB,GAAG;IAC/B,YAAY,CAAC,KAAK;IAClB,YAAY,CAAC,KAAK;IAClB,YAAY,CAAC,GAAG;IAChB,YAAY,CAAC,IAAI;CAClB,CAAC;AAEW,QAAA,aAAa,GAAG;IAC3B,YAAY,CAAC,KAAK;IAClB,YAAY,CAAC,KAAK;IAClB,YAAY,CAAC,GAAG;IAChB,YAAY,CAAC,OAAO;IACpB,YAAY,CAAC,IAAI;CAClB,CAAC;AAEF,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,qCAAmB,CAAA;IACnB,+BAAa,CAAA;IACb,sCAAoB,CAAA;AACtB,CAAC,EAJW,cAAc,8BAAd,cAAc,QAIzB;AAED,IAAY,gBAEX;AAFD,WAAY,gBAAgB;IAC1B,0CAAsB,CAAA;AACxB,CAAC,EAFW,gBAAgB,gCAAhB,gBAAgB,QAE3B"}
|
package/src/logger.enum.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export enum LogLevelEnum {
|
|
2
|
-
LOG = 'log',
|
|
3
|
-
ERROR = 'error',
|
|
4
|
-
WARN = 'warn',
|
|
5
|
-
DEBUG = 'debug',
|
|
6
|
-
VERBOSE = 'verbose',
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const LOG_LEVEL_DEFAULT = [
|
|
10
|
-
LogLevelEnum.DEBUG,
|
|
11
|
-
LogLevelEnum.ERROR,
|
|
12
|
-
LogLevelEnum.LOG,
|
|
13
|
-
LogLevelEnum.WARN,
|
|
14
|
-
];
|
|
15
|
-
|
|
16
|
-
export const LOG_LEVEL_ALL = [
|
|
17
|
-
LogLevelEnum.DEBUG,
|
|
18
|
-
LogLevelEnum.ERROR,
|
|
19
|
-
LogLevelEnum.LOG,
|
|
20
|
-
LogLevelEnum.VERBOSE,
|
|
21
|
-
LogLevelEnum.WARN,
|
|
22
|
-
];
|
|
23
|
-
|
|
24
|
-
export enum LoggerTypeEnum {
|
|
25
|
-
CONSOLE = 'console',
|
|
26
|
-
PINO = 'pino',
|
|
27
|
-
NEST = 'nest-logger',
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export enum LoggerDefContext {
|
|
31
|
-
NEST_SYSTEM = 'system',
|
|
32
|
-
}
|
package/src/logger.event.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare enum LoggerEvent {
|
|
2
|
-
QUERY_ERROR = "logger.query_error",
|
|
3
|
-
QUERY_LOG = "logger.query_log",
|
|
4
|
-
QUERY_SLOW = "logger.query_slow",
|
|
5
|
-
ERROR = "logger.error",
|
|
6
|
-
SCHEMA_BUILD = "logger.schema_build",
|
|
7
|
-
WARN = "logger.warn",
|
|
8
|
-
INFO = "logger.info",
|
|
9
|
-
DEBUG = "logger.debug",
|
|
10
|
-
LOG = "logger.log"
|
|
11
|
-
}
|
package/src/logger.event.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LoggerEvent = void 0;
|
|
4
|
-
var LoggerEvent;
|
|
5
|
-
(function (LoggerEvent) {
|
|
6
|
-
LoggerEvent["QUERY_ERROR"] = "logger.query_error";
|
|
7
|
-
LoggerEvent["QUERY_LOG"] = "logger.query_log";
|
|
8
|
-
LoggerEvent["QUERY_SLOW"] = "logger.query_slow";
|
|
9
|
-
LoggerEvent["ERROR"] = "logger.error";
|
|
10
|
-
LoggerEvent["SCHEMA_BUILD"] = "logger.schema_build";
|
|
11
|
-
LoggerEvent["WARN"] = "logger.warn";
|
|
12
|
-
LoggerEvent["INFO"] = "logger.info";
|
|
13
|
-
LoggerEvent["DEBUG"] = "logger.debug";
|
|
14
|
-
LoggerEvent["LOG"] = "logger.log";
|
|
15
|
-
})(LoggerEvent || (exports.LoggerEvent = LoggerEvent = {}));
|
|
16
|
-
//# sourceMappingURL=logger.event.js.map
|
package/src/logger.event.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.event.js","sourceRoot":"","sources":["logger.event.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAUX;AAVD,WAAY,WAAW;IACrB,iDAAkC,CAAA;IAClC,6CAA8B,CAAA;IAC9B,+CAAgC,CAAA;IAChC,qCAAsB,CAAA;IACtB,mDAAoC,CAAA;IACpC,mCAAoB,CAAA;IACpB,mCAAoB,CAAA;IACpB,qCAAsB,CAAA;IACtB,iCAAkB,CAAA;AACpB,CAAC,EAVW,WAAW,2BAAX,WAAW,QAUtB"}
|
package/src/logger.event.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export enum LoggerEvent {
|
|
2
|
-
QUERY_ERROR = 'logger.query_error',
|
|
3
|
-
QUERY_LOG = 'logger.query_log',
|
|
4
|
-
QUERY_SLOW = 'logger.query_slow',
|
|
5
|
-
ERROR = 'logger.error',
|
|
6
|
-
SCHEMA_BUILD = 'logger.schema_build',
|
|
7
|
-
WARN = 'logger.warn',
|
|
8
|
-
INFO = 'logger.info',
|
|
9
|
-
DEBUG = 'logger.debug',
|
|
10
|
-
LOG = 'logger.log',
|
|
11
|
-
}
|
package/src/logger.helper.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { LogLevel } from '@nestjs/common';
|
|
2
|
-
export declare function maskDataInObject(data?: any, paths?: string[], trace?: any): any;
|
|
3
|
-
export declare const getEnvLoggerLevelsByContext: (context: string) => LogLevel[];
|
|
4
|
-
export declare const getEnvLoggerLevels: (context?: string, def?: LogLevel[]) => LogLevel[];
|
package/src/logger.helper.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getEnvLoggerLevels = exports.getEnvLoggerLevelsByContext = void 0;
|
|
7
|
-
exports.maskDataInObject = maskDataInObject;
|
|
8
|
-
const env_helper_js_1 = require("@nest-yalc-2/utils/env.helper.js");
|
|
9
|
-
const fast_redact_1 = __importDefault(require("fast-redact"));
|
|
10
|
-
const lodash_es_1 = require("lodash-es");
|
|
11
|
-
const logger_enum_js_1 = require("./logger.enum.js");
|
|
12
|
-
function maskDataInObject(data, paths, trace) {
|
|
13
|
-
if (typeof data === 'string')
|
|
14
|
-
data = { message: data };
|
|
15
|
-
if (!paths || !data || (0, lodash_es_1.isEmpty)(paths) || (0, lodash_es_1.isEmpty)(data)) {
|
|
16
|
-
if (trace)
|
|
17
|
-
data ? (data.trace = trace) : (data = { trace });
|
|
18
|
-
return data;
|
|
19
|
-
}
|
|
20
|
-
const redact = (0, fast_redact_1.default)({
|
|
21
|
-
paths,
|
|
22
|
-
});
|
|
23
|
-
return { ...JSON.parse(redact(data)), trace };
|
|
24
|
-
}
|
|
25
|
-
const getEnvLoggerLevelsByContext = (context) => {
|
|
26
|
-
return (0, env_helper_js_1.envToArray)(`NEST_LOGGER_LEVELS_${context.toUpperCase()}`);
|
|
27
|
-
};
|
|
28
|
-
exports.getEnvLoggerLevelsByContext = getEnvLoggerLevelsByContext;
|
|
29
|
-
const getEnvLoggerLevels = (context, def = logger_enum_js_1.LOG_LEVEL_ALL) => {
|
|
30
|
-
let levels = (0, exports.getEnvLoggerLevelsByContext)(context ?? logger_enum_js_1.LoggerDefContext.NEST_SYSTEM);
|
|
31
|
-
if (!levels.length)
|
|
32
|
-
levels = (0, env_helper_js_1.envToArray)('NEST_LOGGER_LEVELS');
|
|
33
|
-
return levels.length ? levels : def;
|
|
34
|
-
};
|
|
35
|
-
exports.getEnvLoggerLevels = getEnvLoggerLevels;
|
|
36
|
-
//# sourceMappingURL=logger.helper.js.map
|
package/src/logger.helper.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.helper.js","sourceRoot":"","sources":["logger.helper.ts"],"names":[],"mappings":";;;;;;AAQA,4CAcC;AAtBD,oEAA8D;AAI9D,8DAAqC;AACrC,yCAAoC;AACpC,qDAAmE;AAEnE,SAAgB,gBAAgB,CAAC,IAAU,EAAE,KAAgB,EAAE,KAAW;IACxE,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEvD,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAA,mBAAO,EAAC,KAAK,CAAC,IAAI,IAAA,mBAAO,EAAC,IAAI,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK;YAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,qBAAU,EAAC;QACxB,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAEM,MAAM,2BAA2B,GAAG,CAAC,OAAe,EAAc,EAAE;IACzE,OAAO,IAAA,0BAAU,EAAW,sBAAsB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC,CAAC;AAFW,QAAA,2BAA2B,+BAEtC;AAEK,MAAM,kBAAkB,GAAG,CAChC,OAAgB,EAChB,MAAkB,8BAAa,EACnB,EAAE;IACd,IAAI,MAAM,GAAG,IAAA,mCAA2B,EACtC,OAAO,IAAI,iCAAgB,CAAC,WAAW,CACxC,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,GAAG,IAAA,0BAAU,EAAW,oBAAoB,CAAC,CAAC;IAExE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B"}
|
package/src/logger.helper.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { envToArray } from '@nest-yalc-2/utils/env.helper.js';
|
|
2
|
-
import { LogLevel } from '@nestjs/common';
|
|
3
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
4
|
-
// @ts-ignore
|
|
5
|
-
import fastRedact from 'fast-redact';
|
|
6
|
-
import { isEmpty } from 'lodash-es';
|
|
7
|
-
import { LOG_LEVEL_ALL, LoggerDefContext } from './logger.enum.js';
|
|
8
|
-
|
|
9
|
-
export function maskDataInObject(data?: any, paths?: string[], trace?: any) {
|
|
10
|
-
if (typeof data === 'string') data = { message: data };
|
|
11
|
-
|
|
12
|
-
if (!paths || !data || isEmpty(paths) || isEmpty(data)) {
|
|
13
|
-
if (trace) data ? (data.trace = trace) : (data = { trace });
|
|
14
|
-
|
|
15
|
-
return data;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const redact = fastRedact({
|
|
19
|
-
paths,
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
return { ...JSON.parse(redact(data)), trace };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const getEnvLoggerLevelsByContext = (context: string): LogLevel[] => {
|
|
26
|
-
return envToArray<LogLevel>(`NEST_LOGGER_LEVELS_${context.toUpperCase()}`);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export const getEnvLoggerLevels = (
|
|
30
|
-
context?: string,
|
|
31
|
-
def: LogLevel[] = LOG_LEVEL_ALL,
|
|
32
|
-
): LogLevel[] => {
|
|
33
|
-
let levels = getEnvLoggerLevelsByContext(
|
|
34
|
-
context ?? LoggerDefContext.NEST_SYSTEM,
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
if (!levels.length) levels = envToArray<LogLevel>('NEST_LOGGER_LEVELS');
|
|
38
|
-
|
|
39
|
-
return levels.length ? levels : def;
|
|
40
|
-
};
|