chore(backend): Loki configureren
De meeste console statements vervangen door Loki
This commit is contained in:
		
							parent
							
								
									0f8bd3df6a
								
							
						
					
					
						commit
						7fd6305fd9
					
				
					 8 changed files with 767 additions and 40 deletions
				
			
		|  | @ -1,11 +1,21 @@ | |||
| import express, { Express, Response } from 'express'; | ||||
| import initORM from './orm.js'; | ||||
| import { getLogger } from './logging/initalize.js'; | ||||
| import { responseTimeLogger } from './logging/responseTimeLogger.js'; | ||||
| import responseTime from 'response-time'; | ||||
| import { Logger } from 'winston'; | ||||
| 
 | ||||
| const logger: Logger = getLogger(); | ||||
| 
 | ||||
| const app: Express = express(); | ||||
| const port: string | number = process.env.PORT || 3000; | ||||
| 
 | ||||
| app.use(express.json()); | ||||
| app.use(responseTime(responseTimeLogger)); | ||||
| 
 | ||||
| // TODO Replace with Express routes
 | ||||
| app.get('/', (_, res: Response) => { | ||||
|     logger.debug('GET /'); | ||||
|     res.json({ | ||||
|         message: 'Hello Dwengo!', | ||||
|     }); | ||||
|  | @ -15,35 +25,8 @@ async function startServer() { | |||
|     await initORM(); | ||||
| 
 | ||||
|     app.listen(port, () => { | ||||
|         console.log(`Server is running at http://localhost:${port}`); | ||||
|         logger.info(`Server is running at http://localhost:${port}`); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| import { LokiClient, LogError, LokiLabels, LogInfo } from 'loki-logger-ts'; | ||||
| 
 | ||||
| const HostData = { | ||||
|     url: "http://localhost:3100/loki/api/v1/push", | ||||
| }; | ||||
| 
 | ||||
| const labels: LokiLabels = { | ||||
|     source: "Test", | ||||
|     job: "TestJob", | ||||
|     host: "localhost", | ||||
| }; | ||||
| 
 | ||||
| async function main() { | ||||
|     const client = new LokiClient(HostData.url); | ||||
| 
 | ||||
|     const msg = 'Hello World'; | ||||
|     await LogError(client, msg, labels); | ||||
|     await LogInfo(client, 'Dit is een goed bericht', labels); | ||||
| 
 | ||||
|     console.log(client.showMetrics()); | ||||
| 
 | ||||
|     console.log(client.getMetrics()); | ||||
| } | ||||
| 
 | ||||
| main(); | ||||
| 
 | ||||
| // startServer();
 | ||||
| startServer(); | ||||
|  |  | |||
							
								
								
									
										47
									
								
								backend/src/logging/initalize.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								backend/src/logging/initalize.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | |||
| import { createLogger, format, Logger, transports } from 'winston'; | ||||
| import LokiTransport from 'winston-loki'; | ||||
| import { LokiLabels } from 'loki-logger-ts'; | ||||
| 
 | ||||
| const LoggingLevel = 'development' === process.env.NODE_ENV ? 'debug' : 'info'; | ||||
| const Host = 'http://localhost:3102'; | ||||
| const Labels: LokiLabels = { | ||||
|     source: 'Dwengo-Backend', | ||||
|     job: 'Dwengo-Backend', | ||||
|     host: 'localhost', | ||||
| }; | ||||
| 
 | ||||
| let logger: Logger; | ||||
| 
 | ||||
| function initializeLogger() { | ||||
|     if (logger !== undefined) { | ||||
|         return logger; | ||||
|     } | ||||
| 
 | ||||
|     const lokiTransport: LokiTransport = new LokiTransport({ | ||||
|         host: Host, | ||||
|         labels: Labels, | ||||
|         level: LoggingLevel, | ||||
|         json: true, | ||||
|         format: format.combine(format.timestamp(), format.json()), | ||||
|         onConnectionError: (err) => { | ||||
|             console.error(`Connection error: ${err}`); | ||||
|         }, | ||||
|     }); | ||||
| 
 | ||||
|     const consoleTransport = new transports.Console({ | ||||
|         level: LoggingLevel, | ||||
|         format: format.combine(format.simple(), format.colorize()), | ||||
|     }); | ||||
| 
 | ||||
|     logger = createLogger({ | ||||
|         transports: [lokiTransport, consoleTransport], | ||||
|     }); | ||||
| 
 | ||||
|     logger.debug('Logger initialized'); | ||||
|     return logger; | ||||
| } | ||||
| 
 | ||||
| export function getLogger(): Logger { | ||||
|     logger ||= initializeLogger(); | ||||
|     return logger; | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/src/logging/responseTimeLogger.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/src/logging/responseTimeLogger.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| import { getLogger } from './initalize.js'; | ||||
| import { Logger } from 'winston'; | ||||
| import { Request, Response } from 'express'; | ||||
| 
 | ||||
| export function responseTimeLogger(req: Request, res: Response, time: number) { | ||||
|     const logger: Logger = getLogger(); | ||||
| 
 | ||||
|     const method = req.method; | ||||
|     const url = req.url; | ||||
|     const status = res.statusCode; | ||||
| 
 | ||||
|     logger.info({ | ||||
|         message: 'Request completed', | ||||
|         method: method, | ||||
|         url: url, | ||||
|         status: status, | ||||
|         responseTime: Number(time), | ||||
|         labels: { | ||||
|             origin: 'api', | ||||
|             type: 'responseTime', | ||||
|         }, | ||||
|     }); | ||||
| } | ||||
|  | @ -1,6 +1,13 @@ | |||
| import { MikroORM } from '@mikro-orm/core'; | ||||
| import config from './mikro-orm.config.js'; | ||||
| import { getLogger } from './logging/initalize.js'; | ||||
| import { Logger } from 'winston'; | ||||
| 
 | ||||
| export default async function initORM() { | ||||
|     const logger: Logger = getLogger(); | ||||
| 
 | ||||
|     logger.info('Initializing ORM'); | ||||
|     logger.debug('MikroORM config is', config); | ||||
| 
 | ||||
|     await MikroORM.init(config); | ||||
| } | ||||
|  |  | |||
		Reference in a new issue