2014-03-03 44 views
3

我正在使用node-log4js。 (它是log4JS,而不是log4J!) 我認爲記錄器的類別就像你把Log4J放到記錄器的構造函數中的字符串(通常你把你的fqn類名稱放在那裏),這樣log4j可以把將事情記錄在正確的位置。如何排除log4js類別被記錄到默認appenders

我得到了以下配置:

{ 
    "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之外的所有類別」類別?怎麼樣?

非常感謝你提前

回答

5

我有類似的要求。我想從控制檯記錄器中排除一大堆類別。

我寫了一些基於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 
} 

我會對你的想法感興趣。

+0

請提出請求 - 它是Log4 *的非常基本的功能,Log4js真的應該支持它! – LeeGee

+1

它似乎已經在那裏了。 「排除」條目可以是單個字符串或字符串數​​組。見https://github.com/nomiddlename/log4js-node/blob/master/lib/appenders/categoryFilter.js – John

+0

謝謝約翰。對於未來的Google,這是現在[列入log4js(https://github.com/nomiddlename/log4js-node/blob/master/lib/appenders/categoryFilter.js),並且你可以通過下面的約翰的配置使用文件的例子,或在看[此其他示例](https://github.com/nomiddlename/log4js-node/blob/master/test/with-categoryFilter.json)。 'categoryFilter'包裝你的appender。 –

0

剛分配前兩名的appender到不同的類別比「app.access」,並使用該類別中getLogger。

+2

我知道我可以做到這一點。但是,我會失去給每個節點模塊自己的類別的可能性。例如。如果我有一個用戶註冊和一個用戶登錄模塊,我分別給他們分類app.user.registration和app.user.login,從而導致我需要在log4js配置中顯式命名每個類別的問題。這是不適合的,因爲我到現在爲止已經有40個並且正在增加模塊 – Mitja

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中也有以下appender。json文件:

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

希望得到這個幫助! :)