Отдельные уровни журнала

Я ищу способ, как я могу опубликовать только уровень «INFO» (для пользователя) на консоль и уровень «DEBUG» в файл. В настоящее время я нашел только одно рабочее решение — использование нескольких функций "getLogger()". Например:

  • log4js.getLogger('отладка');
  • log4js.getLogger('информация');

где каждый параметр функции является отдельной категорией конфигурации из функции configure(). но мне это не нравится, и я предполагаю, что есть лучший вариант с одной функцией getLogger(). Последнее, что я пробовал, было:

    log4js.configure({
    appenders: {
        everything:{ type: 'stdout' },
        file_log: { type: 'file' ,filename: 'all-the-logs.log' },
        logLevelFilter: {  type:'logLevelFilter',level: 'debug', appender: 'file_log' }
    },
    categories: {
       default: {
           appenders: [ 'logLevelFilter','everything'], level: 'info'},
    }
});

В консоли вижу - только уровень "INFO", но и в файле вижу только уровень "INFO". В случае, если я добавлю в приложение - уровень "ВСЕ" - я увижу в консоли все уровни, и то же самое будет в файле


person tavkiev    schedule 27.01.2019    source источник


Ответы (1)


log4js предоставил специальное добавление, типизированное categoryFilter и logLevelFilter, см. шаг, как показано ниже

  1. Добавить приложение и категорию на основе каждого уровня журнала;
  2. Добавьте дополнительный добавленный тип logLevelFilter, указывающий на связанный добавление;
  3. Измените config.categories.default.appenders, используя добавления на шаге 2;
  4. Наконец, используйте log4js.getLogger() создание регистратора и ведение журнала везде, файл журнала разделен по уровню любви

Написано машинописным шрифтом

import {Appender, Configuration, LogLevelFilterAppender} from "log4js";

const fs = require('fs');
const path = require('path');

let levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
let conf: Configuration = {
    appenders : {
        default: {
            type  : "console",
            layout: {
                type   : "colored",
                pattern: "%m"
            },
        }
    },
    categories: {
        default: {
            appenders: levels,
            level    : 'all'
        }
    },
};

let logs = path.join(__dirname, 'logs');
if (!fs.existsSync(logs)) {
    fs.mkdirSync(logs);
}

for (let level of levels) {
    let appender: Appender = {
        type      : "file",
        filename  : path.join(logs, level + '.log'),
        maxLogSize: 65536,
        backups   : 10,
        layout    : {
            type   : "pattern",
            pattern: "%d{dd/MM hh:mm} %-5p %m"
        }
    };
    conf.appenders[level] = appender;
    conf.categories[level] = {
        appenders: [level],
        level    : level.toUpperCase(),
    }
}

let prefix = 'only-';
for (let level of levels) {
    let appender: LogLevelFilterAppender = {
        type    : "logLevelFilter",
        appender: level,
        level   : level,
        maxLevel: level,
    };
    let name = prefix + level;
    conf.appenders[name] = appender;
    conf.categories[name] = {
        appenders: [level],
        level    : level.toUpperCase(),
    }
}
conf.categories.default.appenders = levels.map(x => prefix + x);
//console.log(JSON.stringify(conf, null, 2));
export default conf;

образец использования

// const log4js = require('log4js');
import * as log4js from 'log4js';
import log4jsConfig from './log4js.config';

log4js.configure(log4jsConfig );

(function () {
    const logger = log4js.getLogger();
    logger.trace('Entering cheese testing');
    logger.debug('Got cheese.');
    logger.info('Cheese is Gouda.');
    logger.warn('Cheese is quite smelly.');
    logger.error('Cheese is too ripe!');
    logger.fatal('Cheese was breeding ground for listeria.');

    log4js.shutdown(console.log);
})();
person Jusfrw Nil    schedule 18.06.2019