3

我正在使用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”之外的所有类别?如何?

非常感谢您提前

4

3 回答 3

6

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

我基于 logLevelFilter 写了一些东西,我称之为 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
}

我会对你的想法感兴趣。

于 2014-08-05T12:02:42.143 回答
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 文件中也有以下附加程序:

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

希望这有帮助!:)

于 2015-01-13T22:43:03.060 回答
0

只需将前两个附加程序分配给与“app.access”不同的类别,然后在 getLogger 中使用该类别。

于 2014-04-07T01:37:09.823 回答