2017-11-24 17 views
0

노드 Js 로깅 라이브러리에서 일하고 있습니다. 나는 이것에 대해 winston을 사용하고 있습니다. 로그 파일을 만들었지 만 두 개의 로그 파일을 만들려고 할 때 붙어 있습니다. 모든 로그와 오류 로그 파일을 모두 만들어야 만합니다. 오류 로그 만 포함되어 있습니다.하지만 여기에 붙어 있습니다 :다른 파일을 사용하여 둘 이상의 로거를 추가하는 방법은 무엇입니까?

if (!fs.existsSync(logDir)) { 
    fs.mkdirSync(logDir); 
} 
const tsFormat =() => (new Date()).toLocaleTimeString(); 
let logger = new(winston.Logger)({ 
    transports: [ 
     new(winston.transports.Console)({ 
      level: 'debug', 
      timestamp: tsFormat, 
      handleExceptions: true, 
      colorize: true, 
      json: false 
     }), 
     new(winston.transports.File)({ 
      name: 'all-file', 
      handleExceptions: true, 
      filename: `${logDir}/all-file.log`, 
      level: 'debug', 
      maxsize: 100000000, 
      json: true 
     }), 
     new(winston.transports.File)({ 
      name: 'error-file', 
      handleExceptions: true, 
      filename: `${logDir}/error-file.log`, 
      level: 'error', 
      maxsize: 100000000, 
      json: false 
     }) 
    ] 
}); 

디버그 콘솔보다 다른 유형의 콘솔을 표시하고 싶습니다. 기본적으로 디버그 중 하나만 취하고 있습니다. 어떻게하면 두 파일에 대한 콘솔 설정을 수동으로 추가 할 수 있습니까? 다른 transport.console을 추가하려고하면 오류가 표시됩니다.

Transport already attached: console, assign a different name 

답변

0
var winston = require('winston'); 
let consoleLogger = function(options){ 
    return new (winston.Logger)({ 
    transports: [ 
    new (winston.transports.Console)(options), 
    ] 
}); 
} 

// the CustomTransport is to prevent error log show multiple times 
class CustomTransport extends winston.Transport { 
    constructor(options) { 
    super(options); 
    this.options = options; 
    this.levels = options && options.levels || [this.level]; 
    } 

    log(level, msg, meta, callback) { 
    if(this.levels.indexOf(level) > -1){ 
     consoleLogger(this.options)[level](msg, meta); 
    } 
    callback(null, true); 
    } 
} 

winston.transports.CustomTransport = CustomTransport; 

const tsFormat =() => (new Date()).toLocaleTimeString(); 
var logger = new (winston.Logger)({ 
    transports: [ 
    // add name attribute to prevent Transport already attached error 
    // no error log for this transport 
     new (winston.transports.CustomTransport)(
     { 
      name: 'info-console', 
      level: 'debug', 
      levels : ['debug', 'verbose', 'info', 'warn'], 
      timestamp: tsFormat, 
      handleExceptions: true, 
      colorize: true, 
      json: false 
     } 
    ), 
     // only error log for this transport, modify the configuration as you need 
     new (winston.transports.CustomTransport)(
     { 
      name: 'error-console', 
      level: 'error', 
      timestamp: tsFormat, 
      handleExceptions: true, 
      colorize: true, 
      json: false 
     } 
    ), 
     new (winston.transports.File)(
      { 
       name: 'info-file', 
       filename: 'info.log', 
       timestamp: true, 
       maxsize: 1024000, 
       level: 'info' 
      }), 
     new (winston.transports.File)(
      { 
       name: 'error-file', 
       filename: 'error.txt', 
       timestamp: true, 
       maxsize: 1024000, 
       level: 'error' 
      }) 
    ]}); 

사용 :

logger.debug('debug'); 
logger.error('error');