chore(backend): Loki configureren

De meeste console statements vervangen door Loki
This commit is contained in:
Tibo De Peuter 2025-02-23 17:29:11 +01:00
parent 0f8bd3df6a
commit 7fd6305fd9
Signed by: tdpeuter
GPG key ID: 38297DE43F75FFE2
8 changed files with 767 additions and 40 deletions

View file

@ -18,12 +18,16 @@
"@mikro-orm/postgresql": "^6.4.6",
"@mikro-orm/reflection": "^6.4.6",
"dotenv": "^16.4.7",
"express": "^5.0.1"
"express": "^5.0.1",
"response-time": "^2.3.3",
"winston": "^3.17.0",
"winston-loki": "^6.1.3"
},
"devDependencies": {
"@mikro-orm/cli": "^6.4.6",
"@types/express": "^5.0.0",
"@types/node": "^22.13.4",
"@types/response-time": "^2.3.8",
"globals": "^15.15.0",
"ts-node": "^10.9.2",
"tsx": "^4.19.3",

View file

@ -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();

View 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;
}

View 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',
},
});
}

View file

@ -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);
}