winstonããã¡ã€ã«ã«ãã°ãèšé²ããããã«æ§æãããŠããŠãã³ãŒãã§process.exitïŒ0ïŒãåŒã³åºããšãwinstonããã°ãã¡ã€ã«ãäœæããŠãã°ã¡ãã»ãŒãžããã¡ã€ã«ã«è¿œå ããããšã¯ãããŸããã
å®ç§ãªäžçã§ã¯ãwinstonã¯ãã®ãšããžã±ãŒã¹ãåé¡ãªãåŠçããŠãã¡ã€ã«ã«æžã蟌ã¿ãŸãããæåã§ãã¡ã€ã«ã«ãã©ãã·ã¥ã匷å¶ããããã«ãã¬ãŒã€ã³ã¹ã¿ã³ã¹ã§flushãåŒã³åºãããšãã§ããã°åé¡ãããŸããã
çŸæç¹ã§ã¯æåã§ããã©ãã·ã¥ãããæ¹æ³ããããããããŸããããããã¯ææžåãããŠããããå®éã«ãã°ã«ãªãæ¹æ³ã§ãã¬ãŒã€ã³ã¹ã¿ã³ã¹ãŸãã¯ãã®å éšã¹ããªãŒã ãæåã§éãã/çµäº/ç Žæ£ããéããããŸããã§ãããã¡ã€ã«ã«æžãåºãããŠããŸãã
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'winston.log' })
]
});
logger.info('info logged');
logger.error('error logged');
process.exit(0);
// the two logs get written out to console, but not to the winston.log file/
ããŒãã§ã¯ãconsoleã*ã¡ãœãããéåæãæžã蟌ãã§ããããã¡ã€ã«ãã©ã³ã¹ããŒãã¯éââåæã§ãã ããŒããããŒã¿ãæžã蟌ãåã«ãããã»ã¹ãéããŠããŸãã
2013幎3æ25æ¥æææ¥19ïŒ45ãYuriZapuchlakã¯æ¬¡ã®ããã«æžããŠããŸãã
winstonããã¡ã€ã«ã«ãã°ãèšé²ããããã«æ§æãããŠããŠãã³ãŒãã§process.exitïŒ0ïŒãåŒã³åºããšãwinstonããã°ãã¡ã€ã«ãäœæããŠãã°ã¡ãã»ãŒãžããã¡ã€ã«ã«è¿œå ããããšã¯ãããŸããã
å®ç§ãªäžçã§ã¯ãwinstonã¯ãã®ãšããžã±ãŒã¹ãåé¡ãªãåŠçããŠãã¡ã€ã«ã«æžã蟌ã¿ãŸãããæåã§ãã¡ã€ã«ã«ãã©ãã·ã¥ã匷å¶ããããã«ãã¬ãŒã€ã³ã¹ã¿ã³ã¹ã§flushãåŒã³åºãããšãã§ããã°åé¡ãããŸããã
çŸæç¹ã§ã¯æåã§ããã©ãã·ã¥ãããæ¹æ³ããããããããŸããããããã¯ææžåãããŠããããå®éã«ãã°ã«ãªãæ¹æ³ã§ãã¬ãŒã€ã³ã¹ã¿ã³ã¹ãŸãã¯ãã®å éšã¹ããªãŒã ãæåã§éãã/çµäº/ç Žæ£ããéããããŸããã§ãããã¡ã€ã«ã«æžãåºãããŠããŸãã
var winston = requireïŒ 'winston'ïŒ; var logger = newïŒwinston.LoggerïŒïŒ{transportsïŒ[newïŒwinston.transports.ConsoleïŒïŒïŒãnewïŒwinston.transports.FileïŒïŒ{filenameïŒ 'winston.log'}ïŒ]}ïŒ; logger.infoïŒ 'æ å ±ãã°'ïŒ; logger.errorïŒ 'ãšã©ãŒãã°'ïŒ; process.exitïŒ0ïŒ; // 2ã€ã®ãã°ã¯ã³ã³ãœãŒã«ã«æžãåºãããŸãããwinston.logãã¡ã€ã«ã«ã¯æžãåºãããŸãã/â
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubïŒhttps://github.com/flatiron/winston/issues/228ïŒã§è¡šç€ºããŠãã ããã
ããŒãã ãã®å ŽåãããŒãããã»ã¹ã匷å¶çµäºããå¿ èŠããããã匷å¶çµäºããçŽåã«æ å ±ããã°ã«èšé²ããå¿ èŠãããå Žåã¯ãprocess.exitïŒïŒãååã«é·ãæéã§setTimeoutïŒïŒå ã«é 眮ããããšã§ã確å®ã«å®è¡ã§ããå¯äžã®æ¹æ³ã§ãããã®ãŠã£ã³ã¹ãã³ã¯å®éã«ãã°ãã¡ã€ã«ã«ã¡ãã»ãŒãžãæžã蟌ã¿ãŸããïŒ
ããããããããããã«ã console.log
ãšãã®åéã¯åæããŠããŸãã
@yzapuchlakç§ã¯å®éã«ãã¹ãããŠããŸãããããããç§ãè¡ã£ãŠããããšã§ãã
@yzapuchlak setTimeoutã¯_ãããã_åé¡ãªãæ©èœããŸããã代ããã«ãªãã·ã§ã³ã®ã³ãŒã«ããã¯ãã©ã¡ãŒã¿ã䜿çšããã®ãè³¢æã ãšæããŸãã
2000ãŸãã¯5000ã®setTimeoutã¯ãç§ã®åçŽãªãã¹ãã¹ã¯ãªããã§ã¯æ©èœããŸãããå®éã®ã³ãŒãã§äœ¿çšããããšãããšæ©èœããŸããã ã ãããç§ã¯ãã®æœåšçãªä¿®æ£ãã©ãã»ã©ä¿¡é Œã§ãããããããŸããã ãªãã·ã§ã³ã®ã³ãŒã«ããã¯ããã³ãã«éããªãå Žåã¯ãåŸã§ãã®åé¡ãæãäžããŸãã
@dtexãªãã·ã§ã³ã®ã³ãŒã«ããã¯ïŒæ¬¡ã®ãµã³ãã«ã³ãŒããåç §ïŒã䜿çšããããšããŸããããããã§ããã°ããã¡ã€ã«ã«æžã蟌ãŸããŸããã ãã®å Žåããã¡ã€ã«ã¯å®éã«äœæãããŸããããã°ã¯æžã蟌ãŸããŸããã
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'winston.log' })
]
});
logger.info('winston - info logged');
logger.error('winston - error logged');
logger.info('winston - exiting now', { seriously: true }, function(err, level, msg, meta) {
console.log('console - CALLING PROCESS EXIT');
process.exit(0);
});
logger.warn('winston - I probably should only appear in console, not the log file?');
@yzaouchiak奜å¥å¿ã
åãåé¡ãçºçããŠãããããããã»ã¹ãçµäºããŠãã°ãã¡ã€ã«ã«èšé²ããå¿ èŠããããŸãã ã¡ãã»ãŒãžãæžã蟌ãŸããåŸã«ã®ã¿ããã»ã¹ãçµäºããããã«äœ¿çšã§ããã³ãŒã«ããã¯ãªãã·ã§ã³ããããšäŸ¿å©ã§ãã ãŸãã¯å€åããã¯ãã§ã«ååšããŠããŸããïŒ
Winston0.7.2ã§ãåãåé¡ãçºçããŠããŸãã
setTimeoutãšã³ãŒã«ããã¯ã®åé¿çããã¹ãããŸãããæåããŸããã§ããã
ããã¯ïŒ288ãšåãåé¡ã§ãããlog4js-nodeã®åé¡ïŒhttps://github.com/nomiddlename/log4js-node/issues/148ïŒã§ããããŸãã åé¡ã¯ãprocess.exitã³ãŒã«ããã¯ãçµäºãããšã€ãã³ãã«ãŒããå®è¡ãããªãããšã ãšæããŸãããã®ãããä¿çäžã®éåæåŒã³åºãïŒãã¡ã€ã«ã®æžã蟌ã¿ãªã©ïŒã¯å®è¡ãããŸããã 誰ããç§ãééã£ãŠãããšèšŒæããŠãä¿®æ£ãæãä»ãããšãã§ããã°ãç§ã¯ãšãŠã幞ãã§ãã
解決çãèãåºãããšãã§ããã°ããããä¿®æ£ããããã«æéãå²ããŠãããããšæããŸãã éèŠãªåé¡ã¯ãWritableStreamsãprocess.exitïŒïŒãŸãã¯æªåŠçã®äŸå€ã§ã®ãã©ãã·ã¥ãä¿èšŒããªãããšã§ããããã«æãããŸãã 代æ¿ãœãªã¥ãŒã·ã§ã³ã調æ»ãããŸãããïŒ WritableStreamããªããªããŸã§ããã°ãã¡ã¢ãªã«ãã£ãã·ã¥ã§ããããã§ãã 次ã«ãprocess.exitãŸãã¯ãã£ãããããªãäŸå€ãçºçããå Žåããã¬ã€ã³ãããŠããªããã°ãåæçã«æžã蟌ãããšãã§ããŸãã ããã«ããããã°ãéè€ããå¯èœæ§ããããŸãããå°ãªããšããã°ã®æ倱ã¯é²æ¢ãããŸãã äœããæèŠã¯ïŒ
ïŒ288ã«é¢é£ã
ããã«æŽæ°ã¯ãããŸããïŒ ããã§ã~ 0.9.0
倱æããŸã
ãããç§ã¯ãŸã @yzapuchlakã«ãã£ãŠä»¥åã«èšåãããsetTimeoutïŒïŒããã¯ã䜿çšããŠããŸã:(
ãšã«ãããããããŠã£ã³ã¹ãã³ã®ãã°ãšã¯æã£ãŠããŸããã ã³ãŒãã«process.exit
ãå
¥ãããšãåŠçäžã«ãŸã å®è¡ãããŠãããã¹ãŠã®ãã®ãå®å
šã«åŒ·å¶çµäºããããšã«ãªããŸãã ãŸã å®è¡äžã®HTTPãªã¯ãšã¹ããããå Žåãããããè¿ä¿¡ããããšã¯æããªãã®ã§ããªããã°ã¡ãã»ãŒãžããã°ã«èšé²ããããšæ³å®ããã®ã§ããããã ããã¯ãããŒããã©ã®ããã«æ©èœããããšããçç±ã§éåæã§ãã ã³ãŒã«ããã¯ãŸãã¯setTimeoutã¢ãããŒãã䜿çšããå ŽåãsetTimeoutãå®äºããããã³ãŒã«ããã¯ãåŒã³åºãããçŽåã«ãã¢ããªã±ãŒã·ã§ã³ãå¥ã®è¡ããã°ã«èšé²ããããšã劚ãããã®ã¯äœããããŸããã
ãããåé¿ããå¯äžã®æ¹æ³ã¯ãåæãã®ã³ã°ã䜿çšããããšã§ãããèŠæ±ãåŠçãããšãã«ãéåæã·ã¹ãã ãåçŽãªãã°ã¹ããŒãã¡ã³ããšããŠäœ¿çšãããšããç®çå šäœãç¡å¹ã«ããŸãã
ã ããç§ãææ¡ããŠããã®ã¯ããã®åé¡ãä¿®æ£ããã«éããããšã§ãã ãã°ã¡ãã»ãŒãžãèŠéããããªãå Žåã¯ãprocess.exitãåŒã³åºãåã«ãã¢ããªã±ãŒã·ã§ã³ãæ£ããã¯ãªãŒã³ã¢ããããŠã·ã£ããããŠã³ããããã«ããŠãã ããã
ç·šéãŸãããã¹ãŠã®setTimeoutããã¯ã«ã¯æ¬ é¥ãããããã¹ãŠã®ããŒã¿ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«æžã蟌ãŸãããŸã§ã«ãããæéãšããã£ã¹ã¯ãŸãã¯SSDãããŒã¿ãåŠçããé床ãããããªããããåé¡ã¯ä¿®æ£ãããŸããã ããã§ã®å¯äžã®é©åãªè§£æ±ºçã¯ãã¹ããªãŒã ã®drain
ã€ãã³ãããªãã¹ã³ããããã»ã¹ãçµäºããããšã§ãã ãã ããã¢ããªã±ãŒã·ã§ã³ãç¶ç¶çã«ãã°ãèšé²ããŠããå Žåãããã¯é·æéåŒã³åºãããªãå¯èœæ§ããããŸããçµäºããåã«ã¢ããªã±ãŒã·ã§ã³ãé©åã«ã·ã£ããããŠã³ããªãã£ããããããã¯åãªãå¥ã®ããã¯ã«ãªããŸãã
çŸåšã®ãšããããã°ããã©ãã·ã¥ãããã®ãåŸ
ã€æ¹æ³ïŒã³ãŒã«ããã¯/çŽæ/ãã®ä»ïŒã¯ãããŸããã ãŸããåæãã°ã匷å¶ãããšã process.on('exit')
ãã°ãè¿œå ã§ããããã«ãªããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®åç¶æéäžã«éåæãã°ãäœæããprocess.exitäžã«åæãã°ãäœæããå Žåã¯ãåææžã蟌ã¿ãè¡ãã«ã¹ã¿ã ãã¡ã€ã«å®è£ ã䜿çšããŠæ°ããwinstonã€ã³ã¹ã¿ã³ã¹ãäœæããå¿ èŠããããŸãã ãŸãããã€ãã©ãã·ã¥ãããããç¥ãããå Žåã¯ãã¹ããªãŒã ã®ãã¬ã€ã³ã€ãã³ãããªãã¹ã³ããå¿ èŠããããŸãã
ãã£ãŠã¿ãŸããããããšãïŒ
ãã®äŸ¡å€ã«ã€ããŠã¯ã setTimeout
ã®äœ¿çšãåé¿ã§ããŸãããåºã«ãªã_stream
ãååŸããå¿
èŠããããŸãã
// log then exit(1)
logger.error("The thing to log", function(err) {
var numFlushes = 0;
var numFlushed = 0;
Object.keys(logger.transports).forEach(function(k) {
if (logger.transports[k]._stream) {
numFlushes += 1;
logger.transports[k]._stream.once("finish", function() {
numFlushed += 1;
if (numFlushes === numFlushed) {
process.exit(1);
}
});
logger.transports[k]._stream.end();
}
});
if (numFlushes === 0) {
process.exit(1);
}
});
äžèšã®ããã«ãã³ãŒã«ããã¯é¢æ°ãåç¬ã§äœ¿çšããã ãã§ã¯ããã¡ã€ã«ã«æ£ãããã©ãã·ã¥ããã®ã«_ååã§ã¯ãããŸãã_ã ããã¯ç§ã«ã¯ãã°ã®ããã«æããŸãã
ç§ã¯å®éã«finish
ã€ãã³ãããªãã¹ã³ããŠããããšã«æ³šæããŠãã ããïŒwinstonã®flush
ãŸãã¯closed
ã€ãã³ãã䜿çšããã®ã§ã¯ãªãã https ïŒ//nodejs.org/api/stream.html#stream_event_finishãããæ£ãããã°ã«èšé²ããã«ã¯äžååã ããã§ãïŒ/
ãããè©ŠããŠãã ããã ç§ã®å Žåã¯ããªãããŸããããŸãã process.exit
çŽæ¥åŒã³åºã代ããã«ããã°ããã©ãã·ã¥ãããåŸããã¬ãŒã«process.exit
åŒã³åºãããŸãã
logger.jsïŒ
var winston = require('winston');
winston.loggers.add('my-logger', {
console: {
level: 'debug',
colorize: true,
timestamp: true,
handleExceptions: true
},
file: {
level: 'info',
colorize: false,
timestamp: true,
filename: 'file.log',
handleExceptions: true
}
});
var logger = winston.loggers.get('my-logger');
/* ******* *
* EXPORTS
* ******* */
exports.exitAfterFlush = function(code) {
logger.transports.file.on('flush', function() {
process.exit(code);
});
};
exports.info = function() {
logger.info.apply(this, arguments);
};
exports.warn = function() {
logger.info.apply(this, arguments);
};
exports.error = function() {
logger.info.apply(this, arguments);
};
ããªãã®ã³ãŒãã§ïŒ
var logger = require('./logger.js');
logger.exitAfterFlush(0);
logger.info('Done!');
NodeJSv4.1.2ããã³winston1.1.0ã§ãã¹ãæžã¿
@ da-mkayã«äŒŒããã®ã䜿çšããŠããŸãã
function closeAllLoggersAndDisconnect() {
"use strict";
let openCount = 0;
Object.keys(loggerInstance.transports).forEach((key) => {
let transportInstance = loggerInstance.transports[key];
if (typeof transportInstance.close === "function") {
transportInstance.close();
openCount++;
}
transportInstance.on("closed", () => {
openCount--;
});
setInterval(() => {
if (openCount === 0) {
if (process.connected) {
process.disconnect();
}
}
}, 100);
});
}
ããªãã®ã³ãŒãã§ïŒ
winston.error("Error Occured", err, () => {
closeAllLoggersAndDisconnect();
});
çæ³çã«ã¯ã loggerInstance
ã§close
ã¡ãœãããåŒã³åºãããšãã§ããã°ããã®ã§ããããããclose
åŒã³åºããçµäºãããšããã«ã closed
ã€ãã³ããçºè¡ããããã§ããåºã«ãªããã©ã³ã¹ããŒãã®close
ã¡ãœããã¯ãå®éã«éããåŸã§ã¯ãªããæ©èœããŸããã åºã«ãªããã©ã³ã¹ããŒããå®å
šã«éããã«ãã¬ãŒãéããããšãã§ããã®ã¯ãã°ã®ããã§ãã
@Kegsayã䜿çšãããšãã¹ããããšãã°ããã¡ã€ã«ã«æžã蟌ãŸããŸãã
ãŸãã @ Kegsayã®ã¹ãããã䜿çšããŠæåããŸãã...èªåã®é¢æ°ã«ã©ãããããŠããŸãã
ããŒãžã§ã³2.2.0
ãã®åé¡ãçºçããŸãã
ããã¯ãŸã å®è£ ãããŠããŸãããïŒ 3æ³ä»¥äžã ããã»ã¹åºå£ã䜿ããããªãã
ããã¯åé¡ã§ã¯ãªãããšãç解ããŠããŸããããã¡ã€ã«ãžã®ãã¹ãŠã®æžã蟌ã¿ãçµäºããéããŠãããã®ããã¹ãŠéããŠãããã»ã¹ãæ瀺çã«åŒã³åºããªããŠãããã»ã¹ãèªåçã«çµäºã§ããããã«ããé¢æ°ã確å®ã«å¿ èŠã§ãã å®åã·ã¹ãã ã§ãã®ãããªãã®ã䜿çšããã®ã¯ãšãŠãé£ããã§ãã
ããã«ã¯æ¬åœã«ãŠã£ã³ã¹ãã³åŽã®è§£æ±ºçãå¿ èŠã ãšåé¿ããŸãã ãããåæãã¡ã€ã«ãã©ã³ã¹ããŒããæäŸããã®ããWinstonããå®å šã«ãéããããã®ã·ã£ããããŠã³ããã¯ãæäŸããã®ãã«é¢ããããç§ã¯æ¬åœã«æ°ã«ããŸãããã©ã¡ããç§ã«ãšã£ãŠæºè¶³ã®ãã解決çã§ãã ããããäœããªããšããã°ãæžã蟌ãã§ããçµäºããå®éã«æžã蟌ãŸããããšãä¿èšŒãããŸãã
åæãã©ã³ã¹ããŒãã®å ŽåãIOãå®äºãããŸã§ã³ãŒãã®å®è¡ããããã¯ããããããããã©ãŒãã³ã¹ãå¶éãããŸãã éåææžã蟌ã¿ãããããã³ã°æžã蟌ã¿ã«å€æããæ¹æ³ã¯ãããŸãããã€ãŸãããã°ã«éåææžã蟌ã¿ãè¡ããšãNodeJSãããã«è¿ã¥ããŸã§åŸ ã€å¿ èŠãããããã®éã«ä»ã®JSã³ãŒããå®è¡ãããå¯èœæ§ããããŸãã
äžæ¹ãpromiseã¯åæçã«ãã£ã³ã»ã«ã§ããã¿ã€ã ã¢ãŠãã¯åæçã«ã¯ãªã¢ã§ãããã¡ã€ã«ãšããŒã¿ããŒã¹ã®æ¥ç¶ã¯åæçã«éããããšãã§ããããããã£ã³ã»ã«/ã¯ãªã¢/ããå¿
èŠããããã®ã远跡ããããšã§ãããè¯ãïŒããããã©ãŒãã³ã¹ã®é«ãïŒãœãªã¥ãŒã·ã§ã³ãåŸãããå¯èœæ§ããããŸãã winston.log_and_exit()
ãåŒã³åºãäŸå€ãã³ãã©ãŒããŸãã¯winston.log_and_exit()
ãžã®ãªãã·ã§ã³ã®ã³ãŒã«ããã¯ã§ããããéããŠéããŸãã
確ãã«ãWinstonããšã©ãŒãçºçããå Žåã«éããå¿ èŠã®ãããã¹ãŠã®ãã®ã远跡ããŠããã°ããã®ã§ããããã®ãããªã¿ã¹ã¯ãããŒãžã£ãŒã¯ããèªäœã§ãããã䟿å©ã§ãããããããå¥ã®ãã¬ãŒã ã¯ãŒã¯ã«å€ããŸãïŒãåç §ïŒãã«ãŒãªãŒã®æ³åïŒã
ããã§ã¯ãããã©ãŒãã³ã¹ãã©ã®ããã«åœ±é¿ãããããããŸããã ããã»ã¹ã¯éããªãçµäºããŸããwinstonã¯æçµãã°è¡ã§ç°¿èšãè¡ãã ãã§ããããã®éIMOãåé¡ãªããããã¯ã§ããŸãã
ãã®åé¡ãã©ãã»ã©å€ããããããŠããã«å¯Ÿããåé¿çããããšããäºå®ãèãããšãç§ã¯ãŠã£ã³ã¹ãã³ã§ããã«å¯ŸåŠãã人ãããã«æ£ç¢ºã«å·®ãæ§ããŠããããã§ã¯ãããŸããã
ããªããšç§ã¯ç®çãè¶ ããŠè©±ããŠããïŒæžããŠããïŒããã§ãã æçµçãªã¡ãã»ãŒãžããã¡ã€ã«ã«åæçã«æžã蟌ãããšã«é¢å¿ãããããã§ãããç§ã®æžå¿µã¯ããšã©ãŒã®çŽåã«éåæã«æžã蟌ãŸãããã°ããã¡ã€ã«ã«æžã蟌ãŸããããã«ããããšã§ããã
ãšã©ãŒã®çŽåã«çºçããã¡ãã»ãŒãžããã¡ã€ã«ã«åæçã«æžã蟌ãã«ã¯ããã¹ãŠã®ã¡ãã»ãŒãžãåæçã«æžã蟌ãå¿ èŠãããããããããã©ãŒãã³ã¹ã®åé¡ã§ãã
ä»ã®äººã¯ããšã©ãŒã®åŸãæåŸã®ãã°ããã¡ã€ã«ã«æžã蟌ãŸããåã«ãä»ã®JSã³ãŒãã®å®è¡ãåæ¢ããããšãæžå¿µããŠããŸãã
ãã¹ãŠã®äººã®ããŒãºãæºããå¯èœæ§ã®ãããªãã·ã§ã³ã¯ãéåæã§æžã蟌ã¿ããã¡ã€ã«ãžã®æžã蟌ã¿ïŒãã©ãã·ã¥ïŒãšããŠãŸã 確èªãããŠããªãã¡ãã»ãŒãžã®ãããã¡ãŒãä¿æããã«ã¹ã¿ã ãã©ã³ã¹ããŒããäœæããããšã§ããããã¯ããšã©ãŒæã«åæçã«ãã¡ã€ã«ã«æžã蟌ãŸããå¯èœæ§ããããŸãïŒã¡ãã»ãŒãžãéè€ãããªã¹ã¯ããããŸãïŒ ãNodeJSããã§ã«ãã¡ã€ã«ãžã®æžã蟌ã¿ãçµäºãããããã©ãã·ã¥ãããã€ãã³ãããŸã åŠçãããŠããªãå Žå...ïŒã
ã³ãŒã«ããã¯ãè¿ããåŒã³åºãåã«ããã¹ãŠããã©ãã·ã¥ããããŸã§åŸ æ©ããã·ã£ããããŠã³ããã¯ãåŒã³åºãããšã¯å®éã«ã¯å°é£ã§ããïŒ ããã«ãããã»ãŒãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã解決ãããŸãã
ããããåæãã°ãæ°ã«ããªãçç±ã§ããç§ã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠã説æããŸãã ãã¹ãã ãã¹ãã®å®è¡ã«1ã2ç§é·ãããããã©ããã¯é¢ä¿ãããŸããã ãã°ã決å®è«çã§ãªããã©ããã¯æ°ã«ãªããŸããããŒããã·ã£ããããŠã³ã決å®ããæ£ç¢ºãªéãã«å¿ããŠããã°ãæžãåºãããå Žåãšæžãåºãããªãå Žåãããããã§ãã ããã¯æªãã§ãã éåæãããã©ã«ãã§ããã¹ãã ãšããããšã«å¿ããåæããŸãã ç¹ã«ããŒãèªäœã®å éšã®ãããªåé¡ã«ç §ãããŠããããå¯äžã®ãªãã·ã§ã³ã§ããã¹ãã ãšããããšã«åæããŸããã
@mscharleyããã¯log4js.shutdown
é¢æ°ããããŸãã ã³ãŒã«ããã¯ãåŒã³åºãåã«ããã¹ãŠã®ã¢ãã³ããŒïŒwinstonã¯ãããããã©ã³ã¹ããŒããšåŒãã§ããŸãïŒãæžã蟌ã¿ãçµäºããããšã確èªããã®ãåŸ
ã¡ãŸãã ç§ã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯ããŸãããããã§ãã ã·ã£ããããŠã³åŒã³åºãã«å¿çã§ããããã«ã¢ãã³ããŒãäœæããå¿
èŠããããšããç¹ã§ãã¢ãã³ããŒããã®ãµããŒããå¿
èŠã§ãã
ã¡ãªã¿ã«ãç§ã¯log4jsã宣äŒãããããŠã£ã³ã¹ãã³ãããåªããŠãããšèšã£ããããã€ããã¯ãããŸããããã®ã¢ãããŒããæ©èœããããšãææããã ãã§ãã ããã¯æåã®ã¢ãããŒãã§ã¯ãªããããããŸããã
ããã¯winston.log_and_exit()
ãè¡ãããšã«ã€ããŠã§ãã æžã蟌ã¿å¯èœãªã¹ããªãŒã ã«åºã¥ãè¿œå ã®å Žåã log4js.shutdown()
ã¯writable.end(complete)
ã«äŸåããããšã«æ³šæããŠãã ããïŒ appenders.filter(a => a.shutdown).forEach(a => a.shutdown(complete));
ïŒãããã¯äŸç¶ãšããŠéåæã·ã£ããããŠã³ã§ãã
@mscharleyã®ã³ã¡ã³ãã«é¢ããŠã¯ã fileSync
ã¢ãã³ããŒããããããŒãã®ãšãã«å®å
šãªãã°ããã¡ã€ã«ã«æžã蟌ãããã«shutdown()
ã䜿çšããå¿
èŠããªããšããå©ç¹ããããšæããŸããããã»ã¹ãçµäºããŸã...
ã¯ãã fileSync
ãã©ã³ã¹ããŒãããããšãæ£å³ã®ããã©ãŒãã³ã¹ãäœäžããå Žåã§ããç¶æ³ã«ãã£ãŠã¯äŸ¿å©ã§ãã
@jdthorpeã·ã£ããããŠã³ããåã«ç©äºããããã«éããããšãåŠçããã©ã€ãã©ãªãæã€ãšããããªãã®èãã¯è¯ããã®ã ãšæããŸãããããã§ããã¹ãŠããã£ã¹ã¯ã«ãã©ãã·ã¥ããã®ãåŸ ã€æ¹æ³ãæäŸãããšãã責任ããŠã£ã³ã¹ãã³ãã移ãããšã¯ãããŸããïŒã€ãŸããããèªäœãéããã¡ã«ããºã ãæäŸããŸãïŒãããããã®ãããªã©ã€ãã©ãªãšçµã¿åãããŠãããŸããŸãªã©ã€ãã©ãªã®éããã¡ãœãããéçŽããããšãã§ããŸãã
ãã®ãã±ããã¯å°ãªããšãããã¥ã¡ã³ããå€æŽããŠãçŸåšãµããŒããããŠããããã«èŠããªãããã«ããããšã¯ã§ããŸããïŒãªããžããªã§ãããšããµããŒããREADME
ã ããã¯ããµããŒããããŠããªãæ©èœãŸãã¯ãã°ã®ããã«æãããåé¿çã¯ããŸãå£ã«åããªããã®ã§ãã
ããã¯ãã€ä¿®æ£ãããŸããïŒ ããã¯3幎åããååšããŠãããéåžžã«éèŠã§ãã
å°ãªããšããå®éã«æ©èœãããã¬ãŒã«ã³ãŒã«ããã¯ãå ¥ããŸãããã
ããããããã¹ãŠã®äººã®ããã®äžè¬çãªshutdown()
é¢æ°ãæ°æ©èœãšããŠäœæãããšæããŸããããã®æ©èœã¯éåžžã«éèŠã§ãã
ã¯ããããã¯éåžžã«éèŠãªåé¡ã§ãã
ãã®ããã®+1
ççŽã«èšã£ãŠã shutdown(callback)
è¿œå ããããšã¯é©åã ãšæããŸããããã©ã³ã¹ããŒããç©æ¥µçã«ãµããŒãããå¿
èŠããããšããèŠåããããŸãã åã
ã®ãã©ã³ã¹ããŒãã¯ãåºç€ãšãªãåºåã¡ã«ããºã ã«é¢ãããæ
å ±ãšãã¹ããŒããã§ãã 圌ãã¯ãããã©ã®ããã«ãããã«ã·ã£ããããŠã³ããã¹ããã«ã€ããŠã®ã»ãšãã©ã®æ
å ±ãæã£ãŠããŸãã
winston
ã³ã¢ãè¡ãããšããããŠæã確å®ã«ãŠãŒã¶ãŒã©ã³ãã§è¡ãããšã¯ãã¹ãŠããªãŒã¯ãããã©ã³ã¹ããŒãã®å®è£
ã®è©³çŽ°ãå¿
èŠãšããŸãã
ãããã£ãŠã winston
ã¯äœæ¥ãè¡ãå¿
èŠã¯ãããŸãã...ããããå®éã«ã¯äœæ¥ãå®äºããæ¹æ³ãæäŸããå¿
èŠããããŸãã ããããã°ãç§ãã¡ã¯çããã©ã³ã¹ããŒãã®äœè
ãšååããŠæéã®ãããäœæ¥ãè¡ãããšãã§ããŸãã
以äžã®ãã€ã³ãã説æããããã®ããã€ãã®æ¬äŒŒã³ãŒãã
`` `js
ã·ã£ããããŠã³ïŒã³ãŒã«ããã¯ïŒ{
var transportCount = transports.length
var finish = 0;
//ãã©ã³ã¹ããŒãããšã«
ifïŒtransport.shutdownïŒ{
transport.shutdownïŒfunctionïŒïŒ{
//çµäºæ°ãå¢ãããŸãã
//ãã¹ãŠçµäºããããå
ã®ã³ãŒã«ããã¯ãåŒã³åºããŸãã
}ïŒ;
} ããããªããš {
//ãã©ã³ã¹ããŒãã¯ïŒãŸã ïŒããããµããŒãããŠããŸããã
//çµäºããã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ãããŸã
}
}
ãããv3.xã§ä¿®æ£ãããã®ã楜ãã¿ã«ããŠããŸãã
ãããç§ã®è§£æ±ºçã§ãïŒ async
/ await
ããµããŒãããç°å¢ãæ³å®ããŠããŸãïŒ
åäžã®ãã©ã³ã¹ããŒãã®å ŽåïŒ
const logTransport = new winston.transports.File({filename: '/log/app.log'})
global.log = winston.createLogger({transports: [logTransport]})
// helper to exit with a given return code, but only after the logger is finished
// this will return a Promise that will never resolve, thus halting execution
log.exit = (exit = 5) => {
return new Promise(() => {
logTransport.on('finished', () => process.exit(exit))
})
}
è€æ°ã®ãã©ã³ã¹ããŒãã®å ŽåïŒæªãã¹ãïŒïŒ
`` `js
const logTransports = [new winston.transports.FileïŒ{filenameïŒ '/ log / app.log'}ïŒ]
global.log = winston.createLoggerïŒ{transportsïŒ[logTransport]}ïŒ
//æå®ããããªã¿ãŒã³ã³ãŒãã§çµäºãããã«ããŒããã ãããã¬ãŒãçµäºããåŸã®ã¿
//ããã¯è§£æ±ºãããªãPromiseãè¿ããããå®è¡ãåæ¢ããŸã
log.exit =ïŒexit = 5ïŒ=> {
æ°ããPromiseïŒïŒïŒ=> {ãè¿ã
Promise.allïŒ
logTransports.mapïŒtransport => new PromiseïŒresolve => transport.onïŒ 'finished'ãresolveïŒïŒïŒ
ïŒ.thenïŒïŒïŒ=> process.exitïŒexitïŒïŒ
}ïŒ
}
</details>
<br>
Then, call with `await` like:
```js
try {
something()
} catch(e) {
//do something with the error
await log.exit(5) // <--- nothing will happen past this line as the promise will never resolve!
// <--- process will have exited before it reaches here
trySomethingElse() // <--- this will never be called, and control wont return to the calling code
}
å£ããèšé²ã§ã¯ãããŸãããã winston-log-and-exitããã®åé¡ã解決ããŸã
éåžžã«ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã®ã¿ã ããã»ã¹ãçµäºããªãAWSLambdaã§ã¯winston-log-and-exitã䜿çšã§ããŸããã§ããããå®è¡éã§ããªãŒãºããããããã°ã¯å€±ãããŸãã ãŸããã©ã®ã¡ãã»ãŒãžãç§ã®æåŸã®ã¡ãã»ãŒãžã§ããããç¥ã£ãŠããããšãåæãšããŠããŸãããæåããå®è¡ãã¹ã§ã¯åžžã«ããã§ãããšã¯éããŸããã
@mscharleyäžèšã®await
ãœãªã¥ãŒã·ã§ã³ã¯ãŠãŒã¹ã±ãŒã¹ã§æ©èœããŸããïŒ ããããlog.exit()
代ããã«ãããè¯ãAPIã¯await log.finish()
ã§ããã¹ãŠã®ãã©ã³ã¹ããŒããæžã蟌ã¿ãå®äºãããŸã§åŸ
ã£ãŠãããäœã§ãã§ããŸãïŒ process.exit
ãåŒã³åºããlamda done
åŒã³åºããŸãïŒ
ããã¯ããŠã£ã³ã¹ãã³ã®å éšãé€ããŠãåºæ¬çã«ãã®åé¡ã§ç§ãã¡ãæšé²ããŠããããšã§ãã ãªãããããã©ã°ã€ã³ã«ãªãã®ã§ããããïŒ ãã£ãšé »ç¹ã«åºãŠããã¯ãã®äœãã®ããã§ãã ç§ãã¡ããã£ãŠããããšã¯ç¹å¥ãªããšã§ã¯ãªããšæããŸããããã¹ãŠã®ãããžã§ã¯ãã§ãã®å£ã«ã¶ã€ãããŸããããã®ãããæçµçã«ãŠã£ã³ã¹ãã³ããé¢ããŸããã ç¹ã«ããã»ã¹ã®æåŸïŒãšã©ãŒãçºçããå¯èœæ§ãæãé«ãå ŽæïŒã§ãã°ã倱ãããšã¯ãå°ãªããšãå±éºã§ããããã«æãããŸãã
log4js-nodeã¯ããã¹ãŠã®ãã©ã³ã¹ããŒãããã©ãã·ã¥ãã process.exit()
ãªã©ã®ã³ãŒã«ããã¯ãåãåãã·ã£ããããŠã³ã¡ãœãããå®è£
ããŸããã ãã®ãããªãã®ããŠã£ã³ã¹ãã³ã«è¿œå ã§ããŸããïŒ
log4js-ããŒãããã¯ãã®åŸã§ã
æŽæ°ã¯ãããŸããïŒ åé¡ã¯éåžžã«çŸå®çã§ãã
ã©ã®ãã®ã³ã°ã·ã¹ãã ã§ãã埮ç©åã¯æ¬¡ã®ãšããã§ãã
process.exit()
åŒã³åºãå Žåã¯ããããã¡ãªã³ã°ãããã¡ãã»ãŒãžãã¯ãªã¢ããããŸã§åŸ
ã¡ãŸãã winstonã®å Žåã winston-log-and-exitããã±ãŒãžããããè¡ããŸããprocess.exit()
ãåŒã³åºããŠããŠããã©ãããã©ãŒã ã«on-exitããã¯ãããå Žåã¯ããã®ããã¯ã䜿çšããŠããããã¡ãªã³ã°ãããã¡ãã»ãŒãžãã¯ãªã¢ããããŸã§åŸ
ã¡ãŸãã winston-log-and-exitããããå©ããããšãã§ããŸããã¡ãªã¿ã«ã@ begin-ããã§ãã log_and_exit()
ã¡ãœããã¯log-4jsã®shutdown()
ã¡ãœãããšåºæ¬çã«åãã§ãããæäŸããããã°ã¡ãã»ãŒãžããã°ã«èšé²ããããšããè¿œå ã®ä¿èšŒããããŸãã
@jdthorpeãããã winston-log-and-exit
ã¯winston3ã§ã¯ç°¡åã«æ©èœããŸãã
@VRuzhentsovãããããã¯åé¡ã§ãã 圌ãã¯æ¬åœã«ããã«ã€ããŠäœãããã¹ãã§ãã
@jdthorpeã§ä¿®æ£ããŸãã
const transport = new Transport();
const logger = createLogger({
transports: [
transport
]
})
logger.finish = (exitCode) => {
transport.on('finish', () => process.exit(exitCode));
transport.close();
};
const shutDown = (exitCode) => {
logger.info('Shutting down');
logger.finish(exitCode);
};
shutDown(1);
以äžã¯ç§ã®ããã«åããŸãïŒ
logger.info('winston - info logged');
logger.error('winston - error logged');
process.nextTick(() => {
process.exit(0)
})
@ redhat-raptorã ããã¯ã»ãšãã©ã®å Žåæ©èœããŸãããããã§ã¯ãããŸããã ã¡ããã©ããªãã®ãããã¡ãnextTickïŒïŒãåŒã³åºãããæç¹ã§ã¯ãªã¢ãããããšãèµ·ãããŸãããæ¥ç¶ã«å¿ããŠãããªãã®ãã¬ãŒããªã³ã«äŸåããŠããããšãããã¯ç°¡åã«å€±ãããã¡ãã»ãŒãžã«ã€ãªããå¯èœæ§ã...
ãã®ã³ãŒãã¯ç§ã®ããã«åããïŒ
logger.error(`No value specified for ${value} variable! Node will exit now...`);
logger._flush(() => {
process.exit(1);
})
ããã¯v3ã§ãã€ãã£ãã«ãµããŒããããŠããŸãããïŒ
https://github.com/winstonjs/winston/blob/master/README.md#awaiting -logs-to-be-written-in-winston
@danielweckããããå£ããŠããŸãïŒïŒ1629ïŒ1504ïŒ
6幎ãããã§ãã_important_ãšããŒã¯ããããã°ã®å Žåã¯6幎ã§ãã ããŒããŒã©ã€ã³ãå°è±¡çã§ãã
ç§ã¯waitForWinston()
çŽæã䜿çšããŸãïŒ
const winston = require('winston');
const fileTransport = new winston.transports.File({ name: 'file', filename: FILE_PATH });
const consoleTransport = new winston.transports.Console({ name: 'console', stderrLevels: ['error'] });
const transports = [
fileTransport,
consoleTransport
];
winston.configure({
level: 'verbose',
transports,
format: winston.format.cli()
});
winston.log('info', 'TEST MSG');
try {
await waitForWinston();
} catch (err) {
console.log(err);
}
process.exit(0);
const waitForWinston = async () => {
return new Promise(async (resolve, _reject) => {
for (const transport of transports) {
try {
await closeWinstonTransportAndWaitForFinish(transport);
} catch (err) {
console.log(err);
}
}
resolve();
});
};
const closeWinstonTransportAndWaitForFinish = async (transport) => {
if (!transport.close) {
// e.g. transport.name === 'console'
return Promise.resolve();
}
// e.g. transport.name === 'file'
return new Promise(async (resolve, _reject) => {
transport._doneFinish = false;
function done() {
if (transport._doneFinish) {
return; // avoid resolving twice, for example timeout after successful 'finish' event
}
transport._doneFinish = true;
resolve();
}
setTimeout(() => { // TODO: use a cancellable setInterval instead
done();
}, 5000); // just in case the 'finish' event never occurs
const finished = () => {
done();
};
/* Update: `stream.end()` does not flush pending writes, so this solution is inadequate. For some reason, in recent tests `transport.close();` + `transport.once('finish', ...);` works just fine ... not sure why this works now though! (it used to fail!) */
/*
if (transport._stream) {
transport._stream.once('finish', finished);
transport._stream.end();
}
*/
transport.once('finish', finished);
transport.close();
});
};
æŽæ°ïŒ stream.end()
ã¯ä¿çäžã®æžã蟌ã¿ããã©ãã·ã¥ããªãããããã®ãœãªã¥ãŒã·ã§ã³ã¯äžååã§ãã äœããã®çç±ã§ãæè¿ã®ãã¹ãã§ã¯transport.close();
+ transport.once('finish', ...);
ã¯åé¡ãªãæ©èœããŸã...ãªãä»ãããæ©èœããã®ãããããŸããïŒ ïŒä»¥åã¯å€±æããŠããŸããïŒïŒ
äžèšã®ç§ã®äœæ¥ãœãªã¥ãŒã·ã§ã³ã§ã¯ãéèŠãªã®ã¯æ¬¡ã䜿çšããããšã§ãã
transport._stream.once('finish', finished); transport._stream.end();
ã®ä»£ããã«ïŒ
transport.once('finish', finished); transport.close();
ïŒè¿œå ãããã¿ã€ã ã¢ãŠãæŠç¥ã¯ç§ã®ãŠãŒã¹ã±ãŒã¹ã«åºæã§ãããäžè¬çãªã±ãŒã¹ã§ã¯ãããããªãã·ã§ã³/åé·ã§ãïŒ
ããç°¡åãªæ¹æ³ïŒ
logger.error(`No value specified for ${missing_vars.join(',')} variable! Node will exit now...`, () => {
process.exit(1);
});
@danielweckããã«å¯Ÿãã解決çãèŠã€ããããšãã§ããŸãããïŒ æè¿Winston3.xã«ã¢ããã°ã¬ãŒãããŸãããã2.xã«æ»ãããããã§è§£æ±ºçã®ãªãå¥ã®ãã¬ãŒãèŠã€ããå¿ èŠãããå ŽåããããŸãã
@ matttowerssonos ãIIRCããããã®åé¡ã¯ãã¹ãŠWinston @ 2ã«é¢é£ããŠã
ãšããã§ã Winston @ 3ã§ãã°ã倱ããããšããåé¡ã¯èŠãããªãã®ã§ãæ°ããåé¡ã«æ§æãå«ããããšããå§ãããŸãã
@cjbarthããã¯æ©èœããŸããïŒ
process.on(type as any, (err: ErrorExtended) => {
const processLogger: Logger = loggers.get('processLogger');
processLogger.error(errorFormatter(err, type));
processLogger.on('finish', function () {
processLogger.end();
console.log('never reaches here');
process.exit(1);
});
});
processExit('uncaughtException');
// log and exit for unhandledRejection events.
processExit('unhandledRejection');
@stephanoparaskevaç§ãééã£ãŠããªããã°ã processLogger.end()
åŒã³åºããªãããã finish
ã€ãã³ããprocessLogger
ããšã¯ãããŸããã ãããåŒã³åºããšãWinstonã®ãã®ã³ã°ãå®äºãããšã finish
ã€ãã³ããçºçããã¯ãã§ãã
ãŸãã process.disconnect()
代ããã«process.exit()
ã䜿çšããŸããããã«ããããã¥ãŒã空ã«ãªããŸãã ãã¥ãŒã空ã«ãªããšèªåçã«çµäºããŸãã
@stephanoparaskevaç§ãééã£ãŠããªããã°ã
processLogger.end()
åŒã³åºããªããããfinish
ã€ãã³ããprocessLogger
ããšã¯ãããŸããã ãããåŒã³åºããšãWinstonã®ãã®ã³ã°ãå®äºãããšãfinish
ã€ãã³ããçºçããã¯ãã§ãããŸãã
process.disconnect()
代ããã«process.exit()
ã䜿çšããŸããããã«ããããã¥ãŒã空ã«ãªããŸãã ãã¥ãŒã空ã«ãªããšèªåçã«çµäºããŸãã
ã¬ããã£ãã ãããã®ãããªãã®ïŒ
process.on(type as any, (err: ErrorExtended) => {
const processLogger: Logger = loggers.get('processLogger');
processLogger.error(errorFormatter(err, type));
processLogger.end()
processLogger.on('finish', function () {
process.disconnect();
});
});
// log and exit for uncaughtException events.
processExit('uncaughtException');
// log and exit for unhandledRejection events.
processExit('unhandledRejection');
@stephanoparaskevaããã¯è¯ãèŠããŸãã
éåžžã processLogger.end()
åŒã³åºãåã«ã€ãã³ããã³ãã©ãŒããã€ã³ãããŸããã finish
ã€ãã³ãã¯ã€ãã³ãã«ãŒããçµäºããåŸã«ã®ã¿çºçãããããåé¡ã§ã¯ãããŸããããã®æç¹ã§ãã³ãã©ãŒããã€ã³ããããŸãã ã€ãã³ããã³ãã©ãŒãæåã«ãã€ã³ããããã³ãŒããæžããšããããããæ確ã«ãªããšæããŸãã
@cjbarth
ãããã©ã®ããã«ã€ãã³ããã³ãã©ãŒãäœãã«ãã€ã³ãããŸããïŒ
ããã¯ïŒ
processLogger.on('finish', () => {
this.process.disconnect();
});
@stephanoparaskevaã¯ãã ããã¯ãé¢æ°ããã€ã³ãããããã®æ£ããæ§æã§ãã
{
this.process.disconnect();
}
ãªããžã§ã¯ãprocessLogger
ã«ãã£ãŠçºè¡ãããfinish
ã€ãã³ãã«ã
ããã¯ç§ã®ããã«åããŸãïŒ https ïŒ
process.exitãåŒã³åºããã«ã代ããã«é©åãªã·ã£ããããŠã³ãå®è¡ããå Žåã¯ããã¹ãŠã®æ¥ç¶ãéããã€ãã³ãã«ãŒãããã¬ã€ã³ãããã®ãåŸ ã€ããšã§ããŸã£ããåé¡ã¯ãããŸããã
@deedfãäœãæããŠããã®ããããããç解ããã«ã¯ã https ïŒ //stackoverflow.com/a/37592669ãåç §ããŠãã ããã ãã®ã¢ããã€ã¹ã«åŸã£ãŠãç§ã«ãšã£ãŠããã®åé¡ã軜æžããŸããã
ãã£ããã·ã¥ã€ãã³ããäœå¹Žãçµã£ãŠããŸã åºãŠããªããšããäºå®ã¯ãçŸæç¹ã§ã¯æ¥ããããããšã§ãã ããã¯ããã¬ãŒãåãæ¿ããŠããã¹ãŠã®ã«ã¹ã¿ã ãã©ã³ã¹ããŒããæžãçŽããªããã°ãªããªãã®ã¯é¢åã§ãã
ãŠã£ã³ã¹ãã³ãããããŸã 解決ããŠããªãã®ãããããŸããã ã³ãŒãã®æåã®ãã¬ãŒã®ã¿ãLogstashã«ãã°ã«èšé²ããããšããåé¡ããããŸãïŒwinston-elasticsearchã䜿çšïŒã logger.endïŒïŒã䜿çšãããšããã¹ãŠããã°ã«èšé²ãããŸãããããã°ã©ã ã®çµäºãæ©ãããŸãã äžèšã®ãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠã¿ãŸããããå®éã«ã¯æ©èœããŸããã§ããã
ç§ã¯æ¬åœã«ç¡åã§ã
ãŠã£ã³ã¹ãã³ãããããŸã 解決ããŠããªãã®ãããããŸããã ã³ãŒãã®æåã®ãã¬ãŒã®ã¿ãLogstashã«ãã°ã«èšé²ããããšããåé¡ããããŸãïŒwinston-elasticsearchã䜿çšïŒã logger.endïŒïŒã䜿çšãããšããã¹ãŠããã°ã«èšé²ãããŸãããããã°ã©ã ã®çµäºãæ©ãããŸãã äžèšã®ãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠã¿ãŸããããå®éã«ã¯æ©èœããŸããã§ããã
ç§ã¯æ¬åœã«ç¡åã§ã
ãããè©Šã
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
ãããã£ãŠããã®åé¡ã®è§£æ±ºçã¯ãprocess.exitïŒïŒãåŒã³åºããªãããšã§ãã
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
ãããã£ãŠããã®åé¡ã®è§£æ±ºçã¯ãprocess.exitïŒïŒãåŒã³åºããªãããšã§ãã
ã¯ããnodejsã§ã¯åžžã«æªãèãã§ããhttps ïŒ //stackoverflow.com/a/37592669ãåç §ããŠ
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
ãããã£ãŠããã®åé¡ã®è§£æ±ºçã¯ãprocess.exitïŒïŒãåŒã³åºããªãããšã§ãã
ã¯ããnodejsã§ã¯åžžã«æªãèãã§ããhttps ïŒ //stackoverflow.com/a/37592669ãåç §ããŠ
ç§ãå人çã«process.exitã䜿çšããŠããçç±ã¯ãuncaughtExceptionãšunhandledRejectionããªãã¹ã³ããŠãã¹ãŠã®ãã©ã³ã¹ããŒãã«ãã°ãèšé²ããã¢ããªã±ãŒã·ã§ã³ãçµäºããããã§ãã ãã®åé¡ã解決ããããã®ããè¯ãæ¹æ³ã¯ãããŸããïŒ
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
exitïŒïŒã䜿çšãããšèšã£ãã®ã¯ã©ãã§ãããïŒ
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
exitïŒïŒã䜿çšãããšèšã£ãã®ã¯ã©ãã§ãããïŒ
ããªãã®èªæžãšç解ã®èœåããã®ãã°ãäœã§ããããç解ããã®ã«ååã§ãããšä»®å®ããŠç³ãèš³ãããŸããã ã¿ã€ãã«ãããäžåºŠç¢ºèªããŠãã ããã
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
exitïŒïŒã䜿çšãããšèšã£ãã®ã¯ã©ãã§ãããïŒ
ããªãã®èªæžãšç解ã®èœåããã®ãã°ãäœã§ããããç解ããã®ã«ååã§ãããšä»®å®ããŠç³ãèš³ãããŸããã ã¿ã€ãã«ãããäžåºŠç¢ºèªããŠãã ããã
8幎ééãããŠããåé¡ã«ééããé©åãªæ¯æŽããŸã£ããæäŸããªãå Žåãããªãã¯ãšãŠãå¿ããã«éããããŸããã
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
ãããã£ãŠããã®åé¡ã®è§£æ±ºçã¯ãprocess.exitïŒïŒãåŒã³åºããªãããšã§ãã
ã¯ããnodejsã§ã¯åžžã«æªãèãã§ããhttps ïŒ //stackoverflow.com/a/37592669ãåç §ããŠ
ç§ãå人çã«process.exitã䜿çšããŠããçç±ã¯ãuncaughtExceptionãšunhandledRejectionããªãã¹ã³ããŠãã¹ãŠã®ãã©ã³ã¹ããŒãã«ãã°ãèšé²ããã¢ããªã±ãŒã·ã§ã³ãçµäºããããã§ãã ãã®åé¡ã解決ããããã®ããè¯ãæ¹æ³ã¯ãããŸããïŒ
ç§ã¯ãã°ãããŠã£ã³ã¹ãã³ã䜿çšããŠããŸãããããšã«ããããã¯ãã°ã«èšé²ãããŸãããïŒ ããã§ãªãå Žåã¯ããã°ã«èšé²ããåŸã«ãšã©ãŒãåã¹ããŒããŸãããïŒ
ãã®ãåé¡ããã解決ããããŠããªãã®ã¯ãäœããªãã®ã§ã人ã ãã©ããã£ãŠç解ã§ããªãã®ãããããŸããã exitïŒïŒãåŒã³åºããã«é©åãªã³ãŒããæžãã ãã§ãåé¡ãããŸããã
exitïŒïŒã䜿çšãããšèšã£ãã®ã¯ã©ãã§ãããïŒ
ããªãã®èªæžãšç解ã®èœåããã®ãã°ãäœã§ããããç解ããã®ã«ååã§ãããšä»®å®ããŠç³ãèš³ãããŸããã ã¿ã€ãã«ãããäžåºŠç¢ºèªããŠãã ããã
8幎ééãããŠããåé¡ã«ééããé©åãªæ¯æŽããŸã£ããæäŸããªãå Žåãããªãã¯ãšãŠãå¿ããã«éããããŸããã
å°ãªããšããè³æ Œã®ããã¬ãã®ããã«æ³£ãèšãèšãããšãªããèªåã®åé¡ã解決ããããšãã§ããŸãã
æãåèã«ãªãã³ã¡ã³ã
@danielweckããããå£ããŠããŸãïŒïŒ1629ïŒ1504ïŒ
6幎ãããã§ãã_important_ãšããŒã¯ããããã°ã®å Žåã¯6幎ã§ãã ããŒããŒã©ã€ã³ãå°è±¡çã§ãã