如何排除log4js类别不被记录到默认的appender

时间:2014-03-03 14:54:01

标签: javascript node.js logging log4js-node

我正在使用node-log4js。 (它是log4JS,而不是log4J!) 我认为记录器的类别就像你把Log4中的字符串放入记录器的构造函数中一样(通常你把你的fqn类名放在那里),这样log4j就可以将记录的东西放到正确的位置。

我得到了以下配置:

{
    "appenders": [
        {
            "type": "console",
        },
        {
            "type": "file",
            "absolute": true,
            "filename": "/tmp/app.log",
            "maxLogSize": 20480,
            "backups": 10     
        },
        {
            "type": "console",
            "category": "app.access"
        }
    ]
}

所需的行为是所有“app.access”内容只会转到最后一个appender(现在也是控制台,但将来可能会改变)。目前,所有带有“app.access”类别的记录都将记录两次到控制台,一次记录到文件。

有没有办法给那些其他两个appender一个“除app.access”以外的所有类别?怎么样?

非常感谢您提前

3 个答案:

答案 0 :(得分:6)

我有类似的要求。我想从控制台记录器中排除一堆类别。

我根据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
}

我对你的想法感兴趣。

答案 1 :(得分:1)

我遇到了类似的问题,这是我如何解决它 - 使用关卡。 使用以下配置文件:

{
    "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

我用它来突出显示控制台中的不同情况。让它看起来完全不同对我来说很重要,所以我会注意到这些事件。但是当它记录到文件中时,我不介意它是否有时间戳(因为它在回顾时确实有帮助)。因此我在log4js.json文件中也有以下appender:

{
    "type": "file",
    "filename": "app.log",
    "maxLogSize": 1048576,
    "backups": 10,
    "layout": {
        "type": "pattern",
        "pattern": "[%d] %-5p <%c> %m"
    }
}

希望这有帮助! :)

答案 2 :(得分:0)

只需将前两个appender分配到与&#34; app.access&#34;不同的类别。并在getLogger中使用该类别。