simpl-loggar
Version:
Simple node.js logger
77 lines (76 loc) • 3.11 kB
JavaScript
import { ecsFormat } from '@elastic/ecs-winston-format';
import * as winston from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';
import LokiTransport from 'winston-loki';
export default class Logger {
static _config = {};
static get config() {
return Logger._config;
}
static set config(val) {
Logger._config = val;
}
static getLogger(prefix, config) {
if (!Logger.instance || Logger?.config.addons?.loki !== config?.addons?.loki) {
if (config)
Logger.config = config;
Logger.createInstance(prefix, config);
}
return Logger.instance;
}
static #instance_accessor_storage = undefined;
static get instance() { return Logger.#instance_accessor_storage; }
static set instance(value) { Logger.#instance_accessor_storage = value; }
static createInstance(prefix, config) {
if (Logger.instance) {
Logger.instance.clear();
Logger.instance.close();
Logger.instance = undefined;
}
let path = process.env[process.platform === 'win32' ? 'USERPROFILE' : 'HOME'];
const cache = process.platform === 'win32' ? 'AppData/Roaming/' : '.cache';
const name = process.env.APP_NAME ?? process.env.npm_package_name ?? 'unnamed';
path += `/${cache}`;
if (prefix)
path += `/${prefix}`;
path += `/${name}/`;
if (!name) {
console.warn('Logger', "Missing 'name' field in package.json. Defaulting log files to 'unnamed'");
}
const levels = process.env.NODE_ENV === 'production'
? ['error', 'warn', 'info', 'verbose']
: ['error', 'warn', 'info', 'debug', 'verbose'];
const transports = [
...levels.map((l) => {
return new DailyRotateFile({
level: l,
filename: `${path}logs/errors-%DATE%.log`,
json: true,
format: winston.format.combine(winston.format.timestamp(), winston.format.align(), winston.format.printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)),
datePattern: 'yyyy-MM-DD',
maxFiles: 30,
handleExceptions: true,
handleRejections: true,
});
}),
];
if (config?.addons?.loki) {
transports.push(new LokiTransport({
host: config.addons.loki,
labels: { app: name },
json: true,
format: winston.format.json(),
replaceTimestamp: true,
onConnectionError: (err) => {
console.info('Simple logger. Loki connector threw an error');
console.info(err);
},
}));
}
Logger.instance = winston.createLogger(config?.winston ?? {
level: process.env.NODE_ENV === 'production' ? 'verbose' : 'debug',
format: ecsFormat(),
transports,
});
}
}