2016-09-27 3 views
0

나는 노드 js의 초보자이며 누군가 나를 도울 수 있는지 궁금해하고 있었다.윈스턴 콜백은 실제로 무엇을 의미합니까?

Winston은 모든 전송이 기록 될 때 실행되는 콜백을 전달할 수 있습니다. 누군가 콜백과 Winston의 컨텍스트에서 약간 분실됨에 따라 이것이 무엇을 의미하는지 설명 할 수 있습니까?

내가 콜백에 무엇을 넣을까요
logger.info('CHILL WINSTON!', { seriously: true }, function (err, level, msg, meta) { 
    // [msg] and [meta] have now been logged at [level] to **every** transport. 
    }); 

대 ... 그러나 나는 내 프로그램에서 여러 logger.info을했고, 궁금 해서요 :

https://www.npmjs.com/package/winston#events-and-callbacks-in-winston에서

I은 ​​다음과 같습니다 예를 보여입니까? 또한 모든 logger.info에 대해이 작업을 수행해야합니까? 아니면 모든 로그를 하나의 기능에 넣을 수 있습니까?

모든 로그 호출을 배열에 추가 한 다음 async.parallel을 사용하여 모두 동시에 기록됩니다. 좋은 아이디어 또는 나쁜 아이디어?

주요 목표는 내 프로그램이 다른 작업을 계속하기 전에 모든 것을 기록하는 것입니다.

콜백 및 윈스톤 컨텍스트에서 위 코드를 설명하면 크게 감사하겠습니다!

+2

내가 말할 것)

희망이 도움이되었다. –

답변

0

윈스턴은 모든 전송이 의미

기록되었을 때 실행되는 콜백에 전달할 수 있습니다 당신은 예, 콘솔과 파일 (하나 이상의 전송을 처리하는 로거가있는 경우), 콜백은 메시지가 모두 (이 경우에는 콘솔과 파일 모두에) 로깅 된 후에 만 ​​실행됩니다.

파일에 대한 I/O 작업은 콘솔에서 메시지를 출력하는 것보다 항상 오래 걸립니다. Winston은 콜백이 첫 번째 전송 로깅의 끝이 아니라 마지막 하나 (즉, 가장 오래 걸리는 것)의 끝에 트리거되도록합니다.

당신은 모든 logger.info에 대한 콜백을 사용할 필요가 없습니다,하지만이 경우에 당신이 있는지 모든 다른 작업을 계속하기 전에 기록 된 내릴 수 있습니다 :

var winston = require('winston'); 
winston.add(winston.transports.File, { filename: './somefile.log' }); 
winston.level = 'debug'; 

const tasks = [x => {console.log('task1');x();},x => {console.log('task2');x();},x => {console.log('task3');x()}]; 

let taskID = 0; 
let complete = 0; 
tasks.forEach(task => { 
    task(() => winston.debug('CHILL WINSTON!', `logging task${++taskID}`, waitForIt)); 
}); 

function waitForIt() { 
    // Executed every time a logger has logged all of its transports 
    if (++complete===tasks.length) nowGo(); 
}; 

function nowGo() { 
    // Now all loggers have logged all of its transports 
    winston.log('debug', 'All tasks complete. Moving on!'); 
} 

물론 ... 당신에게 그런 방식으로 작업을 정의하지는 않겠지 만 모든 작업을 병렬로 실행하고 모든 작업이 다른 작업을 계속하기 위해 기록 될 때까지 기다릴 수있는 한 가지 방법을 보여 주기만하면됩니다. 제중인 작업이 간단 console.log('task1');은 그 실행이 경우 수행

const tasks 각 하나가 매개로서 기능 x을 허용 함수의 배열은 :

것만 코드 예를 설명 함수 x();

배열 이러한 기능 각각을 매개 변수로 전달 된 함수 () => winston.debug('CHILL WINSTON!',`logging task${++taskID}`, waitForIt)

waitForIt이 012에서 세번째 파라미터, 파라미터로서 수신호출은 실제 콜백입니다 (윈스턴 콜백에 대해 문의 한 내용).

이제 taskID은 실행 된 작업을 계산하고 complete은 로깅을 완료 한 로거를 계산합니다.

비동기이므로 1, 2, 3으로 시작할 수 있지만 로거는 1, 3, 2 시퀀스로 끝낼 수 있습니다. 그러나 일단 완료되면 waitForIt 콜백을 트리거 할 것이므로, 완료된 횟수를 계산 한 다음 모두 완료되면 nowGo 함수를 호출하십시오.

nowGo가 콜백 될 것이다이 경우

var winston = require('winston'); 
var logger = new winston.Logger({ 
    level:'debug', 
    transports: [ 
     new (winston.transports.Console)(), 
     new (winston.transports.File)({filename: './somefile.log'}) 
    ] 
}); 

const tasks = [x => {console.log("task1");x();},x => {console.log("task2");x();},x => {console.log("task3");x()}]; 

let taskID = 0; 
let complete = 0; 
tasks.forEach(task => { 
    task(() => logger.debug('CHILL WINSTON!', `logging task${++taskID}`, (taskID===tasks.length)? nowGo : null)); 
}); 

logger.on('logging',() => console.log(`# of complete loggers: ${++complete}`)); 

function nowGo() { 
    // Stop listening to the logging event 
    logger.removeAllListeners('logging'); 
    // Now all loggers have logged all of its transports 
    logger.debug('All tasks complete. Moving on!'); 
} 

에 비교하고 그것은 단지 세 번째 logger.debug 통화에 추가 될 것이다. 그러나 두 번째 로거가 세 번째 로거보다 늦게 끝나면 두 번째 로거가 로깅을 마칠 때까지 기다리지 않고 계속 진행했을 것입니다.

이렇게 간단한 예제에서는 모두 다 똑같이 빨리 끝나기 때문에 차이가 없습니다.하지만 개념을 충분히 얻길 바랍니다.

그 동안 고급 고급 비동기 흐름 시퀀싱 패턴에 대해서는 Node.js Design Patterns by Mario Casciaro 책을 권하고 싶습니다. 그것은 또한 훌륭한 EventEmitter 대 콜백 비교를 가지고 있습니다. 당신이 로그 이벤트 콜백이 필요 왜 그때는 아마 로그 이벤트 콜백을하지 않아도, 모르는 경우

관련 문제