2016-08-06 33 views
0

編輯:找到答案,併爲未來的讀者發佈完整的答案。溫斯頓全定製文件輸出


我在Node.js的掌握了winston logging的基礎知識,並希望自定義我的記錄多一點。以下是我迄今爲止:

var winston = require('winston');   
 

 
winston.remove(winston.transports.Console); 
 
winston.add(winston.transports.Console, {'colorize': true}); 
 
winston.add(winston.transports.File, 
 
    { 
 
    'filename': 'testlog.log', 
 
    'timestamp': function() {return Date.now();}, 
 
    } 
 
); 
 

 
// let's say I only want to log 'info' or 'error' 
 
function loginfo(arg) {return winston.info(arg);} 
 
function logerror(arg) {return winston.error(arg);}

輸出文件將是這樣的:

{"level":"info","message":"someinfo","timestamp":1470515515807} 
 
{"level":"error","message":"someerror","timestamp":1470515515808}

我明白一個事實,即一個JSON格式標準日誌記錄很重要,因此我想保持幾乎標準的文件傳輸就這樣。

但因爲我確實讀這些日誌的每一行,我想開第三輸送到另一個文件,以提供完全定製格式只有我的眼睛,如:

1470515515807 info "someinfo" 
 
1470515515808 error "someerror" 
 
1470515519532 error HERE_GOES_SOME_COMPLEX_ERROR_MESSAGE_OR_OBJECT_ 
 
I_WANT_TO_SEE_AS_PRETTY_POSSIBLE_DESPITE_THE_FACT_IT_IS_VERY_COMPLEX

我已使some researchit seems there is no such functionnality直接可用在溫斯頓。我已經注意到了fancy bunyan CLI tool,但我想「看起來」更簡單。

問題:

1)有沒有內置的自定義輸出這將滿足我的要求記錄庫格式? [不能相信]

2)如果我必須自己對它進行硬編碼,可以給我一些指導(最佳做法是按照我想要的方式處理stdout而不會超載應用程序本身),特別是當它出現時複雜的對象返回的一些錯誤?

回答

2

[回答我的問題]

溫斯頓有一個自定義格式選項是簡單而有效的,與在GitHub readme的最底部提供了一個示例。

用我的例子中,最小的代碼不檢查每個參數的存在將是:

var log = new (winston.Logger)({ 
 

 
    transports: [ 
 

 
     new (winston.transports.File)({ 
 
      name: 'info_normal', 
 
      filename: './log_info.log', 
 
      level: 'info', 
 
      timestamp: function(){return Date.now();} 
 
     }), 
 

 
     new (winston.transports.File)({ 
 
      name: 'info_custom', 
 
      filename: './log_info_custom.log', 
 
      level: 'info', 
 
      timestamp: function(){return Date.now();}, 
 
      formatter: function(options) { 
 
       // Returned string will be passed to the logger 
 
       return options.timestamp() + ' ' + options.level + ' ' + 
 
       options.message + ' ' + JSON.stringify(options.meta); 
 
      }, 
 
      json: false //don't forget it !!!!!!!!!!! 
 
     }) 
 
    ] 
 
});

從那裏,提高定製是很容易的。寒冷,溫斯頓!