Я ищу способ, как я могу опубликовать только уровень «INFO» (для пользователя) на консоль и уровень «DEBUG» в файл. В настоящее время я нашел только одно рабочее решение - с использованием нескольких функций "получить регистратор()". Например:
где каждый параметр функции является отдельной категорией конфигурации из функции configure(). но мне это не нравится и я предполагаю, что есть вариант получше с одной функцией получить регистратор(). Последнее, что я пробовал, было:
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". В случае, если я добавлю в приложение - уровень "ВСЕ" - я увижу в консоли все уровни, и то же самое будет в файле



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


log4js предоставил специальное добавление типа categoryFilter и logLevelFilter, см. Log4js — аппендеры, шаг, как показано ниже.
logLevelFilter, указывающий на связанное приложение;config.categories.default.appenders, используя приложения на шаге 2;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.info(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.info);
})();