UNPKG

simpl-loggar

Version:
77 lines (76 loc) 3.11 kB
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, }); } }