2016-10-19 5 views
2

시스템에서 발생하는 여러 가지 이벤트가 하나의 파일에 기록되고 다른 이벤트는 다른 파일에 기록되기를 원합니다. 예를 들어Winston과 다른 전송 장치로 로그를 보내는 방법은 무엇입니까?

: '시작'와 같은

  • 서버 이벤트, 운송라는 이름의 'ServerLogger'와 'server.log에'에에 갈 것 '정지'.
  • UsersLogger를 사용하여 'login.log', 'logout', 'register'를 'users.log'에 넣습니다.
  • '지불 됨', '거부 됨'과 ​​같은 지불 이벤트는 PaymentsLogger가있는 'payments.log' . 시스템에서

내가 좋아하는 실행됩니다 :

logger.log(ServerLogger, 'start'); 
logger.log(UsersLogger, 'login','john'); 
logger.log(PaymentsLogger, 'paid','100', 'john'); 

어떻게 일부 특정 로거에 기록 할 때, 그것이 사용되는 그래서 나는,이 같은 일을해야합니까?

각 로거를 새 윈스턴 인스턴스로 등록해야합니까?

const serverLogger = new winston.Logger() 
const usersLogger = new winston.Logger() 
const paymentsLogger = new winston.Logger() 
+0

내가 아는 한, 네, 다른 로거가 필요합니다. 또는 해킹 된 해결책은 winston에서 자신 만의 로거를 만들고, 가능한 모든 로거를 선언하고, 다른 전송에 인쇄하는 편리한 방법을 만드는 것입니다. – DrakaSAN

답변

0

완벽한 솔루션이 아닐지 몰라도 비슷한 상황이되었습니다. 앱의 다른 부분을 관리하는 활성 파일 일 수도 있고 아닐 수도있는 파일이 있습니다.

내 솔루션은 winston을 기준으로 내 "자체"로거를 만드는 것이 었습니다.

log.js :

각 소스 코드 파일이 하나의 differents 파일에 기록 로거, 그리고 "일반적인"파일을 필요로 이었기 때문에, 내가 직접 윈스턴을 요구하는 대신에 부르는 "발전기"를 만들어

'use strict'; 

const util = require('util'), 
    winston = require('winston'), 
    config = require('./config.json'); 

//If I don't want to log in files and only in console 
let testMode = (config.log.mode === 'test'); 

//"Common" log file 
const fileTransport = new (winston.transports.File)({ 
     timestamp: true, 
     name: config.log.all.file, 
     filename: config.log.all.file, 
     level: config.log.all.level 
    }), 
//"Common" error log file 
    errorTransport = new (winston.transports.File)({ 
     timestamp: true, 
     name: config.log.error.file, 
     filename: config.log.error.file, 
     level: 'error' 
    }); 

//Logs are also sent in mongoDB, with the same schema as in the files 
let mongoTransport = {}, 
    mongoErrorTransport = {}; 

if(!testMode) { 
    //Add winston.transport.MongoDB 
    require('winston-mongodb'); 

    mongoTransport = new (winston.transports.MongoDB)({ 
     name: 'all', 
     host: config.log.db.host, 
     safe: config.log.db.safe, 
     collection: 'all', 
     level: config.log.all.level, 
     db: config.log.db.db 
    }); 
    mongoErrorTransport = new (winston.transports.MongoDB)({ 
     name: 'error', 
     host: config.log.db.host, 
     safe: config.log.db.safe, 
     collection: 'error', 
     level: 'error', 
     db: config.log.db.db 
    }); 
} 

function getTransports(file) { 
    let transports = []; 

//Log in the console 
    transports.push(new (winston.transports.Console)({ 
     timestamp: true, 
     level: config.log.all.level, 
     formatter: (args) => { 
      let d = new Date(); 
      return d.getFullYear() + 
        '/' + d.getMonth(), + 
        '/' + d.getDate(), + 
        ' ' + d.getHours(), + 
        ':' + d.getMinutes(), + 
        ':' + d.getSeconds(), + 
        ':' + d.getMilliseconds(), + 
        ' - ' + file + 
        ' - ' + args.level + 
        ' -\t' + args.message + 
        '\t' + util.inspect(args.meta); 
     } 
    })); 

    if(testMode) { 
     return transports; 
    } 

    let name, 
     level, 
     filename; 

    transports.push(fileTransport); 
    transports.push(errorTransport); 
    transports.push(mongoTransport); 
    transports.push(mongoErrorTransport); 

//Module specific logs 

    if(config.log[file] && config.log[file].file) { 
     name = config.log[file].file; 
    } else { 
     name = file; 
    } 
    if(config.log[file] && config.log[file].level) { 
     level = config.log[file].level; 
    } else if(config.log.default && config.log.default.level) { 
     level = config.log.default.level; 
    } else { 
     level = 'info'; 
    } 
    if(config.log[file] && config.log[file].file) { 
     filename = config.log[file].file; 
    } else if(config.log.default && config.log.default.file) { 
     filename = config.log.default.path + file + '.log'; 
    } else if(config.log.default && config.log.default.path) { 
     filename = config.log.default.file; 
    } else { 
     filename = './log/' + file + '.log'; 
    } 

//Module specific log file 

    transports.push(new (winston.transports.File)(
     { 
      timestamp: true, 
      name: name, 
      level: level, 
      filename: filename 
     } 
    )); 

//Module specific Mongo collection for logs 

    transports.push(new (winston.transports.MongoDB)({ 
     name: 'mongo' + file, 
     host: config.log.db.host, 
     safe: config.log.db.safe, 
     collection: file, 
     level: level, 
     db: config.log.db.db 
    })); 

    return transports; 
} 

//Generator 
module.exports = (file) => { 
    let transports = getTransports(file); 
    return new (winston.Logger)({ 
     rewriters: [ 
      (level, msg, meta) => { 
       meta.app = file + '.js'; 
       return meta; 
      } 
     ], 
     transports: transports 
    }); 
}; 
같이 호출 할 : 그것은 완벽한 해결책에서 멀리 있지만

'use strict'; 

const Logger = require('./log.js'), 
    logger = Logger('myModule'); 

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

하고 특정 문제에 적용되지 않을 수 있습니다, 비슷한 수동으로 모든 로거를 만드는 것보다 청소기 수 있습니다.