Как исключить категорию log4js из списка зарегистрированных по умолчанию
Я использую node-log4js. (это log4JS, а не log4J!) Я думал, что "категории" логгеров похожи на строки, которые вы помещаете в Log4J в конструктор логгера (обычно вы помещаете туда имя вашего класса fqn), так что log4j может помещать записанные вещи в нужное место.
Я получил следующий конфиг:
{
"appenders": [
{
"type": "console",
},
{
"type": "file",
"absolute": true,
"filename": "/tmp/app.log",
"maxLogSize": 20480,
"backups": 10
},
{
"type": "console",
"category": "app.access"
}
]
}
Желаемым поведением было бы то, что все содержимое "app.access" отправляется только последнему аппендиату (который на данный момент тоже консоль, но может измениться в будущем). В настоящий момент все записи в журнале с категорией "app.access" будут регистрироваться дважды в консоли и один раз в файле.
Есть ли способ дать этим двум другим добавителям категорию "все, кроме app.access"? Как?
заранее большое спасибо
3 ответа
У меня было похожее требование. Я хотел исключить кучу категорий из консольного логгера.
Я написал что-то на основе logLevelFilter, который я назвал categoryFilter.
categoryFilter.js:
"use strict";
var log4js = require('log4js');
function categoryFilter (excludeCategories, appender) {
return function(logEvent) {
if (excludeCategories.every(function(x){return (x!=logEvent.category);})) {
appender(logEvent);
}
};
}
function configure(config) {
log4js.loadAppender(config.appender.type);
var appender = log4js.appenderMakers[config.appender.type](config.appender);
return categoryFilter(config.exclude, appender);
}
exports.appender = categoryFilter;
exports.configure = configure;
Чтобы использовать его, у меня есть этот фрагмент в начале моего приложения:
var log4js = require('log4js');
log4js.loadAppender('categoryFilter',require('./src/categoryFilter'));
log4js.configure('log4js-conf.js');
Мой файл конфигурации имеет следующее:
{
"appenders": [
{
"type": "file",
"filename": "logs/logfile.log",
"maxLogSize": 20480,
"backups": 3
},
{
"type": "categoryFilter",
"exclude":["results"],
"appender":{
"type": "console"
}
},
],
"replaceConsole":true
}
Мне было бы интересно ваши мысли.
Я столкнулся с подобной проблемой, и вот как я решил ее - используя уровни. Использовал следующий файл конфигурации:
{
"appenders": [
{
"type": "logLevelFilter",
"level": "INFO",
"appender": {
"type": "console",
"layout": {
"type": "colored",
"pattern": "[%d] %-5p <%c> %m"
}
}
},
{
"type": "console",
"layout": {
"type": "messagePassThrough"
},
"category": "raw"
}
]
}
Используйте 2 разных экземпляра log4js следующим образом:
var path = require('path');
var log4js = require('log4js');
log4js.configure('log4js.json');
var log = log4js.getLogger(path.basename(__filename));
var raw = log4js.getLogger('raw');
В вашем коде используйте log.info()
, log.warn()
, log.error()
или же log.fatal()
иметь стандартные журналы, такие как:
[2015-01-12 19:37:19.931] [INFO] app.js - app started
[2015-01-12 19:38:52.484] [ERROR] other.js - Error. failed to open file
Же журналы выше будет выглядеть так, используя raw.trace()
:
app started
Error. failed to open file
Я использую его для подсветки различных ситуаций в консоли. Для меня важно, чтобы это выглядело совершенно иначе, поэтому я буду замечать эти события. Но когда он записывается в файл, я не возражаю, если у него есть временная метка (так как это действительно помогает при взгляде назад во времени). Поэтому у меня также есть следующий appender в файле log4js.json:
{
"type": "file",
"filename": "app.log",
"maxLogSize": 1048576,
"backups": 10,
"layout": {
"type": "pattern",
"pattern": "[%d] %-5p <%c> %m"
}
}
Надеюсь, это поможет!:)
Просто назначьте два верхних приложения для другой категории, отличной от "app.access", и используйте эту категорию в getLogger.