From e8a41ec27ab5009df78e54da8a65679b3919871c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Tue, 30 May 2023 16:09:59 +0200
Subject: [PATCH] Add logger based on winston library

---
 logging/WinstonLogger.ts | 61 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)
 create mode 100644 logging/WinstonLogger.ts

diff --git a/logging/WinstonLogger.ts b/logging/WinstonLogger.ts
new file mode 100644
index 0000000..e63dc52
--- /dev/null
+++ b/logging/WinstonLogger.ts
@@ -0,0 +1,61 @@
+import winston        from 'winston';
+import SharedConfig   from '../config/SharedConfig';
+import * as Transport from 'winston-transport';
+
+
+const levels = {
+    error: 0,
+    warn : 1,
+    info : 2,
+    http : 3,
+    debug: 4
+};
+
+const colors = {
+    error: 'red',
+    warn : 'yellow',
+    info : 'green',
+    http : 'magenta',
+    debug: 'white'
+};
+winston.addColors(colors);
+
+const format = winston.format.combine(winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }), SharedConfig.production ? winston.format.uncolorize() : winston.format.colorize({ all: true }), winston.format.printf((info) => `${ info.timestamp } [${ process.pid }] ${ info.level }: ${ info.message }`));
+
+const commonTransportOptions = {
+    handleRejections: true,
+    handleExceptions: true
+};
+
+let transports: Array<Transport> = [ new winston.transports.Console({
+                                                                        ...commonTransportOptions,
+                                                                        level: 'debug'
+                                                                    }) ];
+
+if ( SharedConfig.production ) {
+    const commonFileOptions = {
+        ...commonTransportOptions,
+        maxsize : 5242880, // 5MB
+        maxFiles: 100,
+        tailable: true
+    };
+
+    transports = transports.concat([ new winston.transports.File({
+                                                                     ...commonFileOptions,
+                                                                     filename: `${ SharedConfig.logsFolder }/error.log`,
+                                                                     level   : 'error'
+                                                                 }), new winston.transports.File({
+                                                                                                     ...commonFileOptions,
+                                                                                                     filename: `${ SharedConfig.logsFolder }/all.log`,
+                                                                                                     level   : 'debug'
+                                                                                                 }) ]);
+}
+
+const logger = winston.createLogger({
+                                        levels,
+                                        format,
+                                        transports,
+                                        exitOnError: false
+                                    });
+
+export default logger;
-- 
GitLab