@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.
Files changed (63) hide show
  1. package/package.json +23 -24
  2. package/src/config/domain/services/configService.ts +57 -0
  3. package/src/config/infrastructure/nestjs/configModule.ts +16 -0
  4. package/src/context/domain/interfaces/contextStorageService.ts +8 -0
  5. package/src/context/infrastructure/nestjs/contextModule.ts +29 -0
  6. package/src/context/infrastructure/nestjs-cls/nestjsClsContextStorageService.ts +26 -0
  7. package/src/logger/domain/log.ts +25 -0
  8. package/src/logger/domain/logger.ts +20 -0
  9. package/src/logger/domain/loggerService.ts +90 -0
  10. package/src/logger/infrastructure/nestjs/loggerModule.ts +88 -0
  11. package/src/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter.ts +38 -0
  12. package/src/logger/infrastructure/winston/transports/consoleTransport.ts +70 -0
  13. package/src/logger/infrastructure/winston/transports/fileTransport.ts +14 -0
  14. package/src/logger/infrastructure/winston/transports/postgres-transport.ts +37 -0
  15. package/src/logger/infrastructure/winston/transports/slackTransport.ts +53 -0
  16. package/src/logger/infrastructure/winston/winstonLogger.ts +112 -0
  17. package/tsconfig.lib.json +13 -0
  18. package/config/domain/services/configService.d.ts +0 -10
  19. package/config/domain/services/configService.js +0 -59
  20. package/config/domain/services/configService.js.map +0 -1
  21. package/config/infrastructure/nestjs/configModule.d.ts +0 -2
  22. package/config/infrastructure/nestjs/configModule.js +0 -29
  23. package/config/infrastructure/nestjs/configModule.js.map +0 -1
  24. package/context/domain/interfaces/contextStorageService.d.ts +0 -7
  25. package/context/domain/interfaces/contextStorageService.js +0 -5
  26. package/context/domain/interfaces/contextStorageService.js.map +0 -1
  27. package/context/infrastructure/nestjs/contextModule.d.ts +0 -2
  28. package/context/infrastructure/nestjs/contextModule.js +0 -44
  29. package/context/infrastructure/nestjs/contextModule.js.map +0 -1
  30. package/context/infrastructure/nestjs-cls/nestjsClsContextStorageService.d.ts +0 -10
  31. package/context/infrastructure/nestjs-cls/nestjsClsContextStorageService.js +0 -37
  32. package/context/infrastructure/nestjs-cls/nestjsClsContextStorageService.js.map +0 -1
  33. package/logger/domain/log.d.ts +0 -24
  34. package/logger/domain/log.js +0 -13
  35. package/logger/domain/log.js.map +0 -1
  36. package/logger/domain/logger.d.ts +0 -13
  37. package/logger/domain/logger.js +0 -6
  38. package/logger/domain/logger.js.map +0 -1
  39. package/logger/domain/loggerService.d.ts +0 -22
  40. package/logger/domain/loggerService.js +0 -78
  41. package/logger/domain/loggerService.js.map +0 -1
  42. package/logger/infrastructure/nestjs/loggerModule.d.ts +0 -9
  43. package/logger/infrastructure/nestjs/loggerModule.js +0 -114
  44. package/logger/infrastructure/nestjs/loggerModule.js.map +0 -1
  45. package/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter.d.ts +0 -13
  46. package/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter.js +0 -32
  47. package/logger/infrastructure/nestjs/nestjsLoggerServiceAdapter.js.map +0 -1
  48. package/logger/infrastructure/winston/transports/consoleTransport.d.ts +0 -6
  49. package/logger/infrastructure/winston/transports/consoleTransport.js +0 -79
  50. package/logger/infrastructure/winston/transports/consoleTransport.js.map +0 -1
  51. package/logger/infrastructure/winston/transports/fileTransport.d.ts +0 -4
  52. package/logger/infrastructure/winston/transports/fileTransport.js +0 -17
  53. package/logger/infrastructure/winston/transports/fileTransport.js.map +0 -1
  54. package/logger/infrastructure/winston/transports/slackTransport.d.ts +0 -4
  55. package/logger/infrastructure/winston/transports/slackTransport.js +0 -57
  56. package/logger/infrastructure/winston/transports/slackTransport.js.map +0 -1
  57. package/logger/infrastructure/winston/winstonLogger.d.ts +0 -17
  58. package/logger/infrastructure/winston/winstonLogger.js +0 -118
  59. package/logger/infrastructure/winston/winstonLogger.js.map +0 -1
  60. package/test/some.service.d.ts +0 -7
  61. package/test/some.service.js +0 -31
  62. package/test/some.service.js.map +0 -1
  63. package/tsconfig.lib.tsbuildinfo +0 -1
package/package.json CHANGED
@@ -1,26 +1,25 @@
1
1
  {
2
- "name": "@infineit/winston-logger",
3
- "version": "1.0.4",
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"
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,8 @@
1
+ export const ContextStorageServiceKey = Symbol();
2
+
3
+ export default interface ContextStorageService {
4
+ setContextId(contextId: string): void;
5
+ getContextId(): string;
6
+ get<T>(key: string): T | undefined;
7
+ set<T>(key: string, value: T): void;
8
+ }
@@ -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
+ }