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
|
@ -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",
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue