@infineit/winston-logger 1.0.4 → 1.0.6
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 +23 -24
- package/src/config/domain/services/configService.ts +57 -0
- package/src/config/infrastructure/nestjs/configModule.ts +16 -0
- package/src/context/domain/interfaces/contextStorageService.ts +8 -0
- package/src/context/infrastructure/nestjs/contextModule.ts +29 -0
- package/src/context/infrastructure/nestjs-cls/nestjsClsContextStorageService.ts +26 -0
- package/src/logger/domain/log.ts +25 -0
- package/src/logger/domain/logger.ts +20 -0
- package/src/logger/domain/loggerService.ts +90 -0
- package/src/logger/infrastructure/nestjs/loggerModule.ts +88 -0
- package/src/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter.ts +38 -0
- package/src/logger/infrastructure/winston/transports/consoleTransport.ts +70 -0
- package/src/logger/infrastructure/winston/transports/fileTransport.ts +14 -0
- package/src/logger/infrastructure/winston/transports/postgres-transport.ts +37 -0
- package/src/logger/infrastructure/winston/transports/slackTransport.ts +53 -0
- package/src/logger/infrastructure/winston/winstonLogger.ts +112 -0
- package/tsconfig.lib.json +13 -0
- package/config/domain/services/configService.d.ts +0 -10
- package/config/domain/services/configService.js +0 -59
- package/config/domain/services/configService.js.map +0 -1
- package/config/infrastructure/nestjs/configModule.d.ts +0 -2
- package/config/infrastructure/nestjs/configModule.js +0 -29
- package/config/infrastructure/nestjs/configModule.js.map +0 -1
- package/context/domain/interfaces/contextStorageService.d.ts +0 -7
- package/context/domain/interfaces/contextStorageService.js +0 -5
- package/context/domain/interfaces/contextStorageService.js.map +0 -1
- package/context/infrastructure/nestjs/contextModule.d.ts +0 -2
- package/context/infrastructure/nestjs/contextModule.js +0 -44
- package/context/infrastructure/nestjs/contextModule.js.map +0 -1
- package/context/infrastructure/nestjs-cls/nestjsClsContextStorageService.d.ts +0 -10
- package/context/infrastructure/nestjs-cls/nestjsClsContextStorageService.js +0 -37
- package/context/infrastructure/nestjs-cls/nestjsClsContextStorageService.js.map +0 -1
- package/logger/domain/log.d.ts +0 -24
- package/logger/domain/log.js +0 -13
- package/logger/domain/log.js.map +0 -1
- package/logger/domain/logger.d.ts +0 -13
- package/logger/domain/logger.js +0 -6
- package/logger/domain/logger.js.map +0 -1
- package/logger/domain/loggerService.d.ts +0 -22
- package/logger/domain/loggerService.js +0 -78
- package/logger/domain/loggerService.js.map +0 -1
- package/logger/infrastructure/nestjs/loggerModule.d.ts +0 -9
- package/logger/infrastructure/nestjs/loggerModule.js +0 -114
- package/logger/infrastructure/nestjs/loggerModule.js.map +0 -1
- package/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter.d.ts +0 -13
- package/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter.js +0 -32
- package/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter.js.map +0 -1
- package/logger/infrastructure/winston/transports/consoleTransport.d.ts +0 -6
- package/logger/infrastructure/winston/transports/consoleTransport.js +0 -79
- package/logger/infrastructure/winston/transports/consoleTransport.js.map +0 -1
- package/logger/infrastructure/winston/transports/fileTransport.d.ts +0 -4
- package/logger/infrastructure/winston/transports/fileTransport.js +0 -17
- package/logger/infrastructure/winston/transports/fileTransport.js.map +0 -1
- package/logger/infrastructure/winston/transports/slackTransport.d.ts +0 -4
- package/logger/infrastructure/winston/transports/slackTransport.js +0 -57
- package/logger/infrastructure/winston/transports/slackTransport.js.map +0 -1
- package/logger/infrastructure/winston/winstonLogger.d.ts +0 -17
- package/logger/infrastructure/winston/winstonLogger.js +0 -118
- package/logger/infrastructure/winston/winstonLogger.js.map +0 -1
- package/test/some.service.d.ts +0 -7
- package/test/some.service.js +0 -31
- package/test/some.service.js.map +0 -1
- package/tsconfig.lib.tsbuildinfo +0 -1
package/package.json
CHANGED
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
2
|
+
"name": "@infineit/winston-logger",
|
|
3
|
+
"version": "1.0.6",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"types": "dist/index.d.ts",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc -p tsconfig.lib.json && npm run copy-package-json",
|
|
8
|
+
"copy-package-json": "cp package.json ../../dist/libs/nestjs/"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"morgan": "^1.10.0",
|
|
12
|
+
"nestjs-cls": "^3.6.0",
|
|
13
|
+
"reflect-metadata": "^0.1.13",
|
|
14
|
+
"rxjs": "^7.2.0",
|
|
15
|
+
"uuid": "^9.0.1",
|
|
16
|
+
"winston": "^3.11.0",
|
|
17
|
+
"winston-daily-rotate-file": "^4.7.1",
|
|
18
|
+
"winston-slack-webhook-transport": "^2.3.2"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/morgan": "^1.9.7",
|
|
22
|
+
"@types/uuid": "^9.0.6",
|
|
23
|
+
"@types/winston": "^2.4.4"
|
|
25
24
|
}
|
|
26
|
-
|
|
25
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { ConfigService as NestConfigService } from '@nestjs/config';
|
|
3
|
+
|
|
4
|
+
@Injectable()
|
|
5
|
+
export class ConfigService {
|
|
6
|
+
constructor(private configService: NestConfigService) {}
|
|
7
|
+
|
|
8
|
+
get isProduction(): boolean {
|
|
9
|
+
return this.environment.nodeEnv === 'production';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
get isDevelopment(): boolean {
|
|
13
|
+
return this.environment.nodeEnv === 'development';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
get isTest(): boolean {
|
|
17
|
+
return this.environment.nodeEnv === 'test';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
get slackWebhookUrl(): string {
|
|
21
|
+
return this.environment.slack_webhook;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private get environment(): any {
|
|
25
|
+
return this.configService.getOrThrow('logger', {
|
|
26
|
+
infer: true,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// import { Injectable } from '@nestjs/common';
|
|
32
|
+
// import { ConfigService as NestConfigService } from '@nestjs/config';
|
|
33
|
+
|
|
34
|
+
// @Injectable()
|
|
35
|
+
// export class ConfigService {
|
|
36
|
+
// constructor(private configService: NestConfigService) {}
|
|
37
|
+
|
|
38
|
+
// get isProduction(): boolean {
|
|
39
|
+
// return this.environment === 'production';
|
|
40
|
+
// }
|
|
41
|
+
|
|
42
|
+
// get isDevelopment(): boolean {
|
|
43
|
+
// return this.environment === 'development';
|
|
44
|
+
// }
|
|
45
|
+
|
|
46
|
+
// get isTest(): boolean {
|
|
47
|
+
// return this.environment === 'test';
|
|
48
|
+
// }
|
|
49
|
+
|
|
50
|
+
// get slackWebhookUrl(): string {
|
|
51
|
+
// return this.configService.get<string>('SLACK_INC_WEBHOOK_URL');
|
|
52
|
+
// }
|
|
53
|
+
|
|
54
|
+
// private get environment(): string {
|
|
55
|
+
// return this.configService.get<string>('NODE_ENV');
|
|
56
|
+
// }
|
|
57
|
+
// }
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Global, Module } from '@nestjs/common';
|
|
2
|
+
import { ConfigModule as NestConfigModule } from '@nestjs/config';
|
|
3
|
+
import { ConfigService } from '@infineit/winston-logger/config/domain/services/configService';
|
|
4
|
+
|
|
5
|
+
@Global()
|
|
6
|
+
@Module({
|
|
7
|
+
imports: [
|
|
8
|
+
NestConfigModule.forRoot({
|
|
9
|
+
isGlobal: true,
|
|
10
|
+
}),
|
|
11
|
+
],
|
|
12
|
+
controllers: [],
|
|
13
|
+
providers: [ConfigService],
|
|
14
|
+
exports: [ConfigService],
|
|
15
|
+
})
|
|
16
|
+
export class ConfigModule {}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Global, Module } from '@nestjs/common';
|
|
2
|
+
import { v4 } from 'uuid';
|
|
3
|
+
import { ClsModule } from 'nestjs-cls';
|
|
4
|
+
|
|
5
|
+
import { ContextStorageServiceKey } from '@infineit/winston-logger/context/domain/interfaces/contextStorageService';
|
|
6
|
+
import NestjsClsContextStorageService from '@infineit/winston-logger/context/infrastructure/nestjs-cls/nestjsClsContextStorageService';
|
|
7
|
+
|
|
8
|
+
@Global()
|
|
9
|
+
@Module({
|
|
10
|
+
imports: [
|
|
11
|
+
ClsModule.forRoot({
|
|
12
|
+
global: true,
|
|
13
|
+
middleware: {
|
|
14
|
+
mount: true,
|
|
15
|
+
generateId: true,
|
|
16
|
+
idGenerator: (req: Request) => req.headers['x-correlation-id'] ?? v4(),
|
|
17
|
+
},
|
|
18
|
+
}),
|
|
19
|
+
],
|
|
20
|
+
controllers: [],
|
|
21
|
+
providers: [
|
|
22
|
+
{
|
|
23
|
+
provide: ContextStorageServiceKey,
|
|
24
|
+
useClass: NestjsClsContextStorageService,
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
exports: [ContextStorageServiceKey],
|
|
28
|
+
})
|
|
29
|
+
export class ContextModule {}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import ContextStorageService from '@infineit/winston-logger/context/domain/interfaces/contextStorageService';
|
|
2
|
+
import { CLS_ID, ClsService } from 'nestjs-cls';
|
|
3
|
+
import { Injectable } from '@nestjs/common';
|
|
4
|
+
|
|
5
|
+
@Injectable()
|
|
6
|
+
export default class NestjsClsContextStorageService
|
|
7
|
+
implements ContextStorageService
|
|
8
|
+
{
|
|
9
|
+
constructor(private readonly cls: ClsService) {}
|
|
10
|
+
|
|
11
|
+
public get<T>(key: string): T | undefined {
|
|
12
|
+
return this.cls.get(key);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public setContextId(id: string) {
|
|
16
|
+
this.cls.set(CLS_ID, id);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public getContextId(): string | undefined {
|
|
20
|
+
return this.cls.getId();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public set<T>(key: string, value: T): void {
|
|
24
|
+
this.cls.set(key, value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export enum LogLevel {
|
|
2
|
+
Emergency = 'emergency', // One or more systems are unusable.
|
|
3
|
+
Fatal = 'fatal', // A person must take an action immediately
|
|
4
|
+
Error = 'error', // Error events are likely to cause problems
|
|
5
|
+
Warn = 'warn', // Warning events might cause problems in the future and deserve eyes
|
|
6
|
+
Info = 'info', // Routine information, such as ongoing status or performance
|
|
7
|
+
Debug = 'debug', // Debug or trace information
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface Log {
|
|
11
|
+
timestamp: number; // Unix timestamp
|
|
12
|
+
level: LogLevel; // Log level
|
|
13
|
+
message: string; // Log message
|
|
14
|
+
data: LogData; // Log data
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface LogData {
|
|
18
|
+
organisation?: string; // Organization or project name
|
|
19
|
+
context?: string; // Bounded Context name
|
|
20
|
+
app?: string; // Application or Microservice name
|
|
21
|
+
sourceClass?: string; // Classname of the source
|
|
22
|
+
correlationId?: string; // Correlation ID
|
|
23
|
+
error?: Error; // Error object
|
|
24
|
+
props?: NodeJS.Dict<any>; // Additional custom properties
|
|
25
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { LogData, LogLevel } from '@infineit/winston-logger/logger/domain/log';
|
|
2
|
+
|
|
3
|
+
export const LoggerBaseKey = Symbol();
|
|
4
|
+
export const LoggerKey = Symbol();
|
|
5
|
+
|
|
6
|
+
export default interface Logger {
|
|
7
|
+
log(
|
|
8
|
+
level: LogLevel,
|
|
9
|
+
message: string | Error,
|
|
10
|
+
data?: LogData,
|
|
11
|
+
profile?: string,
|
|
12
|
+
): void;
|
|
13
|
+
debug(message: string, data?: LogData, profile?: string): void;
|
|
14
|
+
info(message: string, data?: LogData, profile?: string): void;
|
|
15
|
+
warn(message: string | Error, data?: LogData, profile?: string): void;
|
|
16
|
+
error(message: string | Error, data?: LogData, profile?: string): void;
|
|
17
|
+
fatal(message: string | Error, data?: LogData, profile?: string): void;
|
|
18
|
+
emergency(message: string | Error, data?: LogData, profile?: string): void;
|
|
19
|
+
startProfile(id: string): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Inject, Injectable, Scope } from '@nestjs/common';
|
|
2
|
+
import { INQUIRER } from '@nestjs/core';
|
|
3
|
+
import Logger, {
|
|
4
|
+
LoggerBaseKey,
|
|
5
|
+
} from '@infineit/winston-logger/logger/domain/logger';
|
|
6
|
+
import { LogData, LogLevel } from '@infineit/winston-logger/logger/domain/log';
|
|
7
|
+
import { ConfigService } from '@nestjs/config';
|
|
8
|
+
import ContextStorageService, {
|
|
9
|
+
ContextStorageServiceKey,
|
|
10
|
+
} from '@infineit/winston-logger/context/domain/interfaces/contextStorageService';
|
|
11
|
+
|
|
12
|
+
@Injectable({ scope: Scope.TRANSIENT })
|
|
13
|
+
export default class LoggerService implements Logger {
|
|
14
|
+
private sourceClass: string;
|
|
15
|
+
private organisation: string;
|
|
16
|
+
private context: string;
|
|
17
|
+
private app: string;
|
|
18
|
+
|
|
19
|
+
public constructor(
|
|
20
|
+
@Inject(LoggerBaseKey) private logger: Logger,
|
|
21
|
+
configService: ConfigService,
|
|
22
|
+
@Inject(INQUIRER) parentClass: object,
|
|
23
|
+
@Inject(ContextStorageServiceKey)
|
|
24
|
+
private contextStorageService: ContextStorageService,
|
|
25
|
+
) {
|
|
26
|
+
// Set the source class from the parent class
|
|
27
|
+
this.sourceClass = parentClass?.constructor?.name;
|
|
28
|
+
|
|
29
|
+
const config = configService.getOrThrow('logger', {
|
|
30
|
+
infer: true,
|
|
31
|
+
}) as any;
|
|
32
|
+
|
|
33
|
+
// Set the organization, context and app from the environment variables
|
|
34
|
+
// this.organisation = configService.get<string>('ORGANIZATION');
|
|
35
|
+
// this.context = configService.get<string>('CONTEXT');
|
|
36
|
+
// this.app = configService.get<string>('APP');
|
|
37
|
+
this.organisation = config.organisation;
|
|
38
|
+
this.context = config.context;
|
|
39
|
+
this.app = config.app;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public log(
|
|
43
|
+
level: LogLevel,
|
|
44
|
+
message: string | Error,
|
|
45
|
+
data?: LogData,
|
|
46
|
+
profile?: string,
|
|
47
|
+
) {
|
|
48
|
+
return this.logger.log(level, message, this.getLogData(data), profile);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public debug(message: string, data?: LogData, profile?: string) {
|
|
52
|
+
return this.logger.debug(message, this.getLogData(data), profile);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public info(message: string, data?: LogData, profile?: string) {
|
|
56
|
+
return this.logger.info(message, this.getLogData(data), profile);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public warn(message: string | Error, data?: LogData, profile?: string) {
|
|
60
|
+
return this.logger.warn(message, this.getLogData(data), profile);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public error(message: string | Error, data?: LogData, profile?: string) {
|
|
64
|
+
return this.logger.error(message, this.getLogData(data), profile);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public fatal(message: string | Error, data?: LogData, profile?: string) {
|
|
68
|
+
return this.logger.fatal(message, this.getLogData(data), profile);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public emergency(message: string | Error, data?: LogData, profile?: string) {
|
|
72
|
+
return this.logger.emergency(message, this.getLogData(data), profile);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private getLogData(data?: LogData): LogData {
|
|
76
|
+
return {
|
|
77
|
+
...data,
|
|
78
|
+
organisation: data?.organisation || this.organisation,
|
|
79
|
+
context: data?.context || this.context,
|
|
80
|
+
app: data?.app || this.app,
|
|
81
|
+
sourceClass: data?.sourceClass || this.sourceClass,
|
|
82
|
+
correlationId:
|
|
83
|
+
data?.correlationId || this.contextStorageService.getContextId(),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public startProfile(id: string) {
|
|
88
|
+
this.logger.startProfile(id);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Global,
|
|
3
|
+
Inject,
|
|
4
|
+
MiddlewareConsumer,
|
|
5
|
+
Module,
|
|
6
|
+
NestModule,
|
|
7
|
+
} from '@nestjs/common';
|
|
8
|
+
|
|
9
|
+
import WinstonLogger, {
|
|
10
|
+
WinstonLoggerTransportsKey,
|
|
11
|
+
} from '@infineit/winston-logger/logger/infrastructure/winston/winstonLogger';
|
|
12
|
+
import Logger, {
|
|
13
|
+
LoggerBaseKey,
|
|
14
|
+
LoggerKey,
|
|
15
|
+
} from '@infineit/winston-logger/logger/domain/logger';
|
|
16
|
+
import NestjsLoggerServiceAdapter from '@infineit/winston-logger/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter';
|
|
17
|
+
import SlackTransport from '@infineit/winston-logger/logger/infrastructure/winston/transports/slackTransport';
|
|
18
|
+
import ConsoleTransport from '@infineit/winston-logger/logger/infrastructure/winston/transports/consoleTransport';
|
|
19
|
+
import morgan from 'morgan';
|
|
20
|
+
import FileTransport from '@infineit/winston-logger/logger/infrastructure/winston/transports/fileTransport';
|
|
21
|
+
import { ConfigService } from '@infineit/winston-logger/config/domain/services/configService';
|
|
22
|
+
import LoggerService from '@infineit/winston-logger/logger/domain/loggerService';
|
|
23
|
+
|
|
24
|
+
@Global()
|
|
25
|
+
@Module({
|
|
26
|
+
imports: [],
|
|
27
|
+
controllers: [],
|
|
28
|
+
providers: [
|
|
29
|
+
{
|
|
30
|
+
provide: LoggerBaseKey,
|
|
31
|
+
useClass: WinstonLogger,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
provide: LoggerKey,
|
|
35
|
+
useClass: LoggerService,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
provide: NestjsLoggerServiceAdapter,
|
|
39
|
+
useFactory: (logger: Logger) => new NestjsLoggerServiceAdapter(logger),
|
|
40
|
+
inject: [LoggerKey],
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
{
|
|
44
|
+
provide: WinstonLoggerTransportsKey,
|
|
45
|
+
useFactory: (configService: ConfigService) => {
|
|
46
|
+
const transports = [];
|
|
47
|
+
|
|
48
|
+
transports.push(ConsoleTransport.createColorize());
|
|
49
|
+
|
|
50
|
+
transports.push(FileTransport.create());
|
|
51
|
+
|
|
52
|
+
if (configService.isProduction) {
|
|
53
|
+
if (configService.slackWebhookUrl) {
|
|
54
|
+
transports.push(
|
|
55
|
+
SlackTransport.create(configService.slackWebhookUrl),
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return transports;
|
|
61
|
+
},
|
|
62
|
+
inject: [ConfigService],
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
exports: [LoggerKey, NestjsLoggerServiceAdapter],
|
|
66
|
+
})
|
|
67
|
+
export class LoggerModule implements NestModule {
|
|
68
|
+
public constructor(
|
|
69
|
+
@Inject(LoggerKey) private logger: Logger,
|
|
70
|
+
private configService: ConfigService,
|
|
71
|
+
) {}
|
|
72
|
+
|
|
73
|
+
public configure(consumer: MiddlewareConsumer): void {
|
|
74
|
+
consumer
|
|
75
|
+
.apply(
|
|
76
|
+
morgan(this.configService.isProduction ? 'combined' : 'dev', {
|
|
77
|
+
stream: {
|
|
78
|
+
write: (message: string) => {
|
|
79
|
+
this.logger.debug(message, {
|
|
80
|
+
sourceClass: 'RequestLogger',
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
85
|
+
)
|
|
86
|
+
.forRoutes('*');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ConsoleLogger } from '@nestjs/common';
|
|
2
|
+
import Logger from '@infineit/winston-logger/logger/domain/logger';
|
|
3
|
+
import { LoggerService } from '@nestjs/common/services/logger.service';
|
|
4
|
+
|
|
5
|
+
export default class NestjsLoggerServiceAdapter
|
|
6
|
+
extends ConsoleLogger
|
|
7
|
+
implements LoggerService
|
|
8
|
+
{
|
|
9
|
+
public constructor(private logger: Logger) {
|
|
10
|
+
super();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public log(message: any, ...optionalParams: any[]) {
|
|
14
|
+
return this.logger.info(message, this.getLogData(optionalParams));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public error(message: any, ...optionalParams: any[]) {
|
|
18
|
+
return this.logger.error(message, this.getLogData(optionalParams));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public warn(message: any, ...optionalParams: any[]) {
|
|
22
|
+
return this.logger.warn(message, this.getLogData(optionalParams));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public debug(message: any, ...optionalParams: any[]) {
|
|
26
|
+
return this.logger.debug(message, this.getLogData(optionalParams));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public verbose(message: any, ...optionalParams: any[]) {
|
|
30
|
+
return this.logger.info(message, this.getLogData(optionalParams));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private getLogData(...optionalParams: any[]) {
|
|
34
|
+
return {
|
|
35
|
+
sourceClass: optionalParams[0] ? optionalParams[0] : undefined,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as winston from 'winston';
|
|
2
|
+
import { LogLevel } from '@infineit/winston-logger/logger/domain/log';
|
|
3
|
+
|
|
4
|
+
enum LogColors {
|
|
5
|
+
red = '\x1b[31m',
|
|
6
|
+
green = '\x1b[32m',
|
|
7
|
+
yellow = '\x1b[33m',
|
|
8
|
+
blue = '\x1b[34m',
|
|
9
|
+
magenta = '\x1b[35m',
|
|
10
|
+
cyan = '\x1b[36m',
|
|
11
|
+
pink = '\x1b[38;5;206m',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default class ConsoleTransport {
|
|
15
|
+
public static createColorize() {
|
|
16
|
+
return new winston.transports.Console({
|
|
17
|
+
format: winston.format.combine(
|
|
18
|
+
winston.format.printf((log) => {
|
|
19
|
+
const color = this.mapLogLevelColor(log.level as LogLevel);
|
|
20
|
+
const prefix = `${log.data.label ? `[${log.data.label}]` : ''}`;
|
|
21
|
+
return `${this.colorize(color, prefix + ' -')} ${log.timestamp} ${
|
|
22
|
+
log.data.correlationId
|
|
23
|
+
? `(${this.colorize(LogColors.cyan, log.data.correlationId)})`
|
|
24
|
+
: ''
|
|
25
|
+
} ${this.colorize(color, log.level.toUpperCase())} ${
|
|
26
|
+
log.data.sourceClass
|
|
27
|
+
? `${this.colorize(LogColors.cyan, `[${log.data.sourceClass}]`)}`
|
|
28
|
+
: ''
|
|
29
|
+
} ${this.colorize(
|
|
30
|
+
color,
|
|
31
|
+
log.message + ' - ' + (log.data.error ? log.data.error : ''),
|
|
32
|
+
)}${
|
|
33
|
+
log.data.durationMs !== undefined
|
|
34
|
+
? this.colorize(color, ' +' + log.data.durationMs + 'ms')
|
|
35
|
+
: ''
|
|
36
|
+
}${
|
|
37
|
+
log.data.stack ? this.colorize(color, ` - ${log.data.stack}`) : ''
|
|
38
|
+
}${
|
|
39
|
+
log.data.props
|
|
40
|
+
? `\n - Props: ${JSON.stringify(log.data.props, null, 4)}`
|
|
41
|
+
: ''
|
|
42
|
+
}`;
|
|
43
|
+
}),
|
|
44
|
+
),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private static colorize(color: LogColors, message: string): string {
|
|
49
|
+
return `${color}${message}\x1b[0m`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private static mapLogLevelColor(level: LogLevel): LogColors {
|
|
53
|
+
switch (level) {
|
|
54
|
+
case LogLevel.Debug:
|
|
55
|
+
return LogColors.blue;
|
|
56
|
+
case LogLevel.Info:
|
|
57
|
+
return LogColors.green;
|
|
58
|
+
case LogLevel.Warn:
|
|
59
|
+
return LogColors.yellow;
|
|
60
|
+
case LogLevel.Error:
|
|
61
|
+
return LogColors.red;
|
|
62
|
+
case LogLevel.Fatal:
|
|
63
|
+
return LogColors.magenta;
|
|
64
|
+
case LogLevel.Emergency:
|
|
65
|
+
return LogColors.pink;
|
|
66
|
+
default:
|
|
67
|
+
return LogColors.cyan;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import DailyRotateFile = require('winston-daily-rotate-file');
|
|
2
|
+
|
|
3
|
+
export default class FileTransport {
|
|
4
|
+
public static create() {
|
|
5
|
+
return new DailyRotateFile({
|
|
6
|
+
dirname: 'logs',
|
|
7
|
+
filename: 'log-%DATE%.log',
|
|
8
|
+
datePattern: 'YYYY-MM-DD-HH',
|
|
9
|
+
zippedArchive: true,
|
|
10
|
+
maxSize: '20m',
|
|
11
|
+
maxFiles: '14d',
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* eslint-disable prettier/prettier */
|
|
2
|
+
import TransportStreamOptions from 'winston-transport';
|
|
3
|
+
import TransportStream from 'winston-transport';
|
|
4
|
+
import { PrismaClient } from '@prisma/client';
|
|
5
|
+
|
|
6
|
+
interface PrismaTransportOptions extends TransportStreamOptions {
|
|
7
|
+
prisma: PrismaClient;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export class PrismaTransport extends TransportStream {
|
|
12
|
+
private prisma: PrismaClient;
|
|
13
|
+
|
|
14
|
+
constructor(options: PrismaTransportOptions) {
|
|
15
|
+
super(options);
|
|
16
|
+
this.prisma = options.prisma;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
log(info: any, callback: () => void) {
|
|
20
|
+
setImmediate(() => this.emit('logged', info));
|
|
21
|
+
|
|
22
|
+
console.log("PRISMA A NA LOG AA AANVIYU", this.prisma)
|
|
23
|
+
|
|
24
|
+
this.prisma.log.create({
|
|
25
|
+
data: {
|
|
26
|
+
level: info.level,
|
|
27
|
+
message: info.message,
|
|
28
|
+
meta: info.meta ? JSON.stringify(info.meta) : null,
|
|
29
|
+
},
|
|
30
|
+
}).then(() => callback())
|
|
31
|
+
.catch((err: any) => {
|
|
32
|
+
console.error('Error logging to PostgreSQL:', err);
|
|
33
|
+
callback();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import SlackHook from 'winston-slack-webhook-transport';
|
|
2
|
+
import { LogLevel } from '@infineit/winston-logger/logger/domain/log';
|
|
3
|
+
|
|
4
|
+
export default class SlackTransport {
|
|
5
|
+
public static create(webhookUrl: string) {
|
|
6
|
+
return new SlackHook({
|
|
7
|
+
level: LogLevel.Fatal,
|
|
8
|
+
webhookUrl: webhookUrl,
|
|
9
|
+
formatter: (info) => {
|
|
10
|
+
const title =
|
|
11
|
+
'[' +
|
|
12
|
+
info.timestamp +
|
|
13
|
+
'] Fatal error registered [' +
|
|
14
|
+
info.data.label +
|
|
15
|
+
']';
|
|
16
|
+
return {
|
|
17
|
+
text: title,
|
|
18
|
+
blocks: [
|
|
19
|
+
{
|
|
20
|
+
type: 'section',
|
|
21
|
+
fields: [
|
|
22
|
+
{
|
|
23
|
+
type: 'mrkdwn',
|
|
24
|
+
text: '*' + title + '*',
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: 'section',
|
|
30
|
+
text: {
|
|
31
|
+
type: 'mrkdwn',
|
|
32
|
+
text: '*[' + info.data.sourceClass + ']* ' + info.message,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
attachments: [
|
|
37
|
+
{
|
|
38
|
+
type: 'mrkdwn',
|
|
39
|
+
text:
|
|
40
|
+
info.data && info.data.error
|
|
41
|
+
? '*Stack:* ' + info.data.error.stack
|
|
42
|
+
: undefined,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
type: 'mrkdwn',
|
|
46
|
+
text: '*Payload:* ' + JSON.stringify(info, null, 4),
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|