winstonjs / winston-daily-rotate-file

A transport for winston which logs to a rotating file each day.
MIT License
889 stars 151 forks source link

How do I skip writing log? level ignored? #394

Open pquerner opened 1 month ago

pquerner commented 1 month ago

My error level on winston is error. I have transport for console, and 2 dailyRotation logs. 1 for debug. 1 for error.

The debug log is still written, ignoring the minimum level.

import winston from "winston";
import DailyRotateFile from 'winston-daily-rotate-file';
import fs from "fs";

export class Logger {
    private static logger: winston.Logger;

    public static getLogger() {
        try {
            if (typeof this.logger !== "undefined") {
                return this.logger;
            }
            const logger = Logger.buildLogger();
            this.logger = logger;
            return this.logger;
        } catch (error) {
            console.error(error);
        }
        return false;
    }

    public static log(level: string, msg: any) {
        if (this.getLogger() instanceof winston.Logger) {
            this.logger.log(level, msg);
            return;
        }
        console.log(msg);
    }

    private static getDirName() {
        const curDate = new Date();
        const curMonth = ("0" + (curDate.getMonth() + 1)).slice(-2);
        const curYYYYMM = curDate.getFullYear() + "-" + curMonth;
        return curYYYYMM;
    }

    private static getLogDir() {
        return `/var/log/myapp/123/`;
    }

    private static getRotationLogger(level: string) {
        const logsDirectory = Logger.getLogDir();
        const colorizer = Logger.getLoggerColorizer();
        let rotatingLog: DailyRotateFile = new DailyRotateFile({
            dirname: logsDirectory + Logger.getDirName(),
            filename: `%DATE%_${level}.log`,
            datePattern: 'YYYY-MM-DD',
            level: level,
            zippedArchive: true,
            maxSize: '20m',
            maxFiles: '14d',
            createSymlink: true,
            symlinkName: `current_${level}.log`,
            json: false,
            format: Logger.getLoggerFormat(colorizer)
        });

        rotatingLog.on('rotate', function () {
            if (!fs.existsSync(logsDirectory + Logger.getDirName() + '/')) {
                rotatingLog = new winston.transports.DailyRotateFile({
                    dirname: logsDirectory + Logger.getDirName(),
                    filename: `%DATE%_${level}.log`,
                    datePattern: 'YYYY-MM-DD',
                    level: level,
                });

            }
        });
        return rotatingLog;
    }

    private static buildLogger() {
        const colorizer = this.getLoggerColorizer();
        const logLevel = process.env.LOG_LEVEL || 'debug';
        const logger = winston.createLogger({
            level: logLevel,
            format: this.getLoggerFormat(colorizer),
            transports: [
                new (winston.transports.Console)(),
                Logger.getRotationLogger('error'),
                Logger.getRotationLogger('debug'),
            ],
        });
        return logger;
    }

    private static getLoggerColorizer() {
        const colorsConfig = {
            error: 'red',
            warn: 'yellow',
            info: 'green',
            debug: 'cyan'
        };

        const colorizer = winston.format.colorize({all: true, colors: colorsConfig});
        return colorizer;
    }

    private static getLoggerFormat(colorizer: winston.Logform.Colorizer) {
        return winston.format.combine(
            winston.format.timestamp(),
            winston.format.printf((meta: any) => {
                const {level, message, timestamp, namespace, stack, ...restMeta} = meta;
                let _message = message;
                if (meta.isSequelize) {
                    _message = 'Sequelize logging message:';
                    delete restMeta.isSequelize;
                }
                const _level = level || 'debug'
                const coloredLevel = colorizer.colorize(_level, `[${_level.toUpperCase()}]`);
                const displayNamespace = namespace ? `[${namespace}] -` : '';
                const stackMessage = stack ? `\n${stack}` : '';
                const otherMetaMessage = Object.keys(restMeta).length > 0 ? `\n${JSON.stringify(restMeta)}` : '';
                return `${timestamp} ${displayNamespace} ${coloredLevel}: ${_message} ${otherMetaMessage}${stackMessage}`;
            })
        );
    }
}

Call:

Logger.log('debug', 'foobar');. I do not see the debug log in the console, but the file is written to %DATE%_debug.log (and symlinked to current_debug.log).

I expected the file not to be written at all, because my level doesnt match.