65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import { createLogger, format, Logger as WinstonLogger, transports } from 'winston';
|
|
import LokiTransport from 'winston-loki';
|
|
import { LokiLabels } from 'loki-logger-ts';
|
|
import { envVars, getEnvVar } from '../util/envVars.js';
|
|
|
|
export class Logger extends WinstonLogger {
|
|
constructor() {
|
|
super();
|
|
}
|
|
}
|
|
|
|
const lokiLabels: LokiLabels = {
|
|
source: 'Dwengo-Backend',
|
|
service: 'API',
|
|
host: 'localhost',
|
|
};
|
|
|
|
let logger: Logger;
|
|
|
|
function initializeLogger(): Logger {
|
|
if (logger !== undefined) {
|
|
return logger;
|
|
}
|
|
|
|
const logLevel = getEnvVar(envVars.LogLevel);
|
|
|
|
const consoleTransport = new transports.Console({
|
|
level: getEnvVar(envVars.LogLevel),
|
|
format: format.combine(format.cli(), format.simple()),
|
|
});
|
|
|
|
if (getEnvVar(envVars.RunMode) === 'dev') {
|
|
logger = createLogger({
|
|
transports: [consoleTransport],
|
|
});
|
|
logger.debug(`Logger initialized with level ${logLevel} to console`);
|
|
return logger;
|
|
}
|
|
|
|
const lokiHost = getEnvVar(envVars.LokiHost);
|
|
|
|
const lokiTransport: LokiTransport = new LokiTransport({
|
|
host: lokiHost,
|
|
labels: lokiLabels,
|
|
level: logLevel,
|
|
json: true,
|
|
format: format.combine(format.timestamp(), format.json()),
|
|
onConnectionError: (err): void => {
|
|
// eslint-disable-next-line no-console
|
|
console.error(`Connection error: ${err}`);
|
|
},
|
|
});
|
|
|
|
logger = createLogger({
|
|
transports: [lokiTransport, consoleTransport],
|
|
});
|
|
|
|
logger.debug(`Logger initialized with level ${logLevel} to Loki host ${lokiHost}`);
|
|
return logger;
|
|
}
|
|
|
|
export function getLogger(): Logger {
|
|
logger ||= initializeLogger();
|
|
return logger;
|
|
}
|