Как исключить категорию 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.

Другие вопросы по тегам