윈스턴은 모든 전송이 의미
기록되었을 때 실행되는 콜백에 전달할 수 있습니다 당신은 예, 콘솔과 파일 (하나 이상의 전송을 처리하는 로거가있는 경우), 콜백은 메시지가 모두 (이 경우에는 콘솔과 파일 모두에) 로깅 된 후에 만 실행됩니다.
파일에 대한 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 대 콜백 비교를 가지고 있습니다. 당신이 로그 이벤트 콜백이 필요 왜 그때는 아마 로그 이벤트 콜백을하지 않아도, 모르는 경우
내가 말할 것)
희망이 도움이되었다. –