ํ์ผ์ ๊ธฐ๋กํ๋๋ก winston์ ๊ตฌ์ฑํ๊ณ ์ฝ๋์์ process.exit (0)์ ํธ์ถํ๋ฉด winston์ ๋ก๊ทธ ํ์ผ์ ๋ง๋ค๊ณ ํ์ผ์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
์๋ฒฝํ ์ธ์์์ winston์์ด ์ฃ์ง ์ผ์ด์ค๋ฅผ ๊ธฐ๊บผ์ด ์ฒ๋ฆฌํ๊ณ ํ์ผ์ ์ธ ์ ์์ง๋ง, ์๋์ผ๋ก ํ์ผ์ ํ๋ฌ์๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ก๊ฑฐ ์ธ์คํด์ค์์ ํ๋ฌ์๋ฅผ ํธ์ถ ํ ์๋ ์์ต๋๋ค.
ํ์ฌ ์๋์ผ๋ก 'ํ๋ฌ์'ํ ์์๋ ๋ฐฉ๋ฒ์ด์์ ์ ์์ง๋ง ๋ฌธ์ํ๋์ง ์์์ผ๋ฉฐ ์ค์ ๋ก ๋ก๊ทธ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ๋ก๊ฑฐ ์ธ์คํด์ค ๋๋ ๋ด๋ถ ์คํธ๋ฆผ์ ์๋์ผ๋ก ๋ซ๊ฑฐ๋ ์ข ๋ฃ / ํ๊ดดํ๋ ๋ฐ ์ด์ด ์์์ต๋๋ค. ํ์ผ์ ๊ธฐ๋ก๋๊ณ ์์ต๋๋ค ..
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์ Yuri Zapuchlak์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
ํ์ผ์ ๊ธฐ๋กํ๋๋ก winston์ ๊ตฌ์ฑํ๊ณ ์ฝ๋์์ process.exit (0)์ ํธ์ถํ๋ฉด winston์ ๋ก๊ทธ ํ์ผ์ ๋ง๋ค๊ณ ํ์ผ์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
์๋ฒฝํ ์ธ์์์ winston์์ด ์ฃ์ง ์ผ์ด์ค๋ฅผ ๊ธฐ๊บผ์ด ์ฒ๋ฆฌํ๊ณ ํ์ผ์ ์ธ ์ ์์ง๋ง, ์๋์ผ๋ก ํ์ผ์ ํ๋ฌ์๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ก๊ฑฐ ์ธ์คํด์ค์์ ํ๋ฌ์๋ฅผ ํธ์ถ ํ ์๋ ์์ต๋๋ค.
ํ์ฌ ์๋์ผ๋ก 'ํ๋ฌ์'ํ ์์๋ ๋ฐฉ๋ฒ์ด์์ ์ ์์ง๋ง ๋ฌธ์ํ๋์ง ์์์ผ๋ฉฐ ์ค์ ๋ก ๋ก๊ทธ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ๋ก๊ฑฐ ์ธ์คํด์ค ๋๋ ๋ด๋ถ ์คํธ๋ฆผ์ ์๋์ผ๋ก ๋ซ๊ฑฐ๋ ์ข ๋ฃ / ํ๊ดดํ๋ ๋ฐ ์ด์ด ์์์ต๋๋ค. ํ์ผ์ ๊ธฐ๋ก๋๊ณ ์์ต๋๋ค ..
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); // ๋ ๋ก๊ทธ๋ ์ฝ์์ ๊ธฐ๋ก๋์ง๋ง winston.log ํ์ผ์๋ ๊ธฐ๋ก๋์ง ์์ต๋๋ค.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ํ์ ํ๊ฑฐ๋ GitHub (https://github.com/flatiron/winston/issues/228)์์ ํ์ธํ์ธ์.
ํ . ์ด ๊ฒฝ์ฐ ๋ ธ๋ ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ฌ์ผํ์ง๋ง ์ฃฝ์ด๊ธฐ ์ง์ ์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํด์ผํ๋ ๊ฒฝ์ฐ, ์ถฉ๋ถํ ๊ธด ์๊ฐ์ ๊ฐ์ง setTimeout () ์์ process.exit ()๋ฅผ ๋ฃ์ด์ผํฉ๋๋ค. winston์ด ์ค์ ๋ก ๋ก๊ทธ ํ์ผ์ ๋ฉ์์ง๋ฅผ ์๋๊น?
๋ช
ํ์ฑ์ ์ํด console.log
๋ฐ ์น๊ตฌ ๋ ๋๊ธฐ์ ์
๋๋ค.
@yzapuchlak ๋๋ ์ค์ ๋ก ํ ์คํธํ์ง ์์์ง๋ง ๊ทธ๊ฒ ๋๋ํ๋ ์ผ์ ๋๋ค.
@yzapuchlak setTimeout์ ๋ฌธ์ ์์ด _probably_ ์๋ํ์ง๋ง, ๋์ ์ ํ์ ์ฝ๋ฐฑ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
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 Curious, ๋ฒ์ 0.6.2์ ๋๊น?
โโโฌ [email protected]
โโโ [email protected]
โโโ [email protected]
โโโ [email protected]
โโโ [email protected]
โโโ [email protected]
โโโ [email protected]
โโโ [email protected]
์ง๊ธ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ณ ๋ก๊ทธ ํ์ผ์ ๋ฉ๋ชจ๋ฅผ ์์ฑํด์ผํฉ๋๋ค. ๋ฉ์์ง๊ฐ ์์ฑ๋ ํ์ ๋ง โโํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋ ๋ฐ ์ฌ์ฉํ ์์๋ ์ฝ๋ฐฑ ์ต์ ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์๋๋ฉด ์ด๋ฏธ ์กด์ฌํฉ๋๊น?
Winston 0.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);
}
});
์์์ ์ธ๊ธํ๋ฏ์ด ์ฝ๋ฐฑ ํจ์ ๋ง ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ํ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ฌ์๋๋๋ก _ ์ถฉ๋ถํ์ง ์์ต๋๋ค _. ์ด๊ฒ์ ๋์๊ฒ ๋ฒ๊ทธ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
winston์ flush
๋๋ closed
์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ค์ ๋ก finish
์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ ์์ต๋๋ค. 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!');
NodeJS v4.1.2 ๋ฐ winston 1.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();
});
์ด์์ ์ผ๋ก๋ ๋ ๊ทธ๋ฅ ์ ํ๋ฅผ ํ ์ ์๋ค๋ฉด ์ข์ ์ผ ๊ฒ์
๋๋ค close
์จ ๋ฐฉ๋ฒ loggerInstance
ํ์ง๋ง ๋ฐฉ์ถ ์ดํ closed
์ด๋ฒคํธ ๊ณง ํธ์ถ์ ์๋ฃ ํ close
๋ฉ์๋๋ ์ค์ ๋ก ๋ซ์ ํ๊ฐ ์๋๋ผ ๊ธฐ๋ณธ ์ ์ก์์ ์๋ํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ ์ ์ก์ด ์์ ํ ๋ซํ์ง ์๊ณ ๋ก๊ฑฐ๋ฅผ ๋ซ์ ์์๋ ๊ฒ์ ๋ฒ๊ทธ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@Kegsay ๋ฅผ ์ฌ์ฉ
๋ํ @Kegsay ์ ๋จ๊ณ๋ฅผ ์ฑ๊ณต์ผ๋ก ์ฌ์ฉ ... ๋ด ์์ ์ ๊ธฐ๋ฅ์ ์ธ์ฌ ์์ต๋๋ค.
2.2.0
๋ฒ์ ์์ ์ฌ์ ํ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์์ง ๊ตฌํ๋์ง ์์์ต๋๊น? 3 ์ธ ์ด์. ํ๋ก์ธ์ค ์ข ๋ฃ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์ดํดํ์ง๋ง ๋ช ์ ์ ์ผ๋ก ํธ์ถํ์ง ์๊ณ ํ๋ก์ธ์ค๊ฐ ์์ฒด์ ์ผ๋ก ์ข ๋ฃ ๋ ์ ์๋๋ก ํ์ผ์ ๋ํ ๋ชจ๋ ์ฐ๊ธฐ๋ฅผ ์๋ฃํ๊ณ ์ด๋ ค์๋ ๋ชจ๋ ํญ๋ชฉ์ ๋ซ๋ ๊ธฐ๋ฅ์ด ์์ด์ผํฉ๋๋ค. ํ๋ก๋์ ์์คํ ์์ ๊ทธ๋ฐ ๊ฒ๋ค์ ์ฌ์ฉํ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ต์ต๋๋ค.
์ด๊ฒ์ด ์ ๋ง๋ก ์์คํด ์ธก์ ๋ํ ํด๊ฒฐ์ฑ ์ด ํ์ํ๋ค๋ ๊ฒ์ ์๊ธฐ์ํจ๋ค. ๊ทธ๊ฒ์ด ๋๊ธฐ์ ํ์ผ ์ ์ก์ ์ ๊ณตํ๋ Winston์ '์์ ํ๊ฒ'์ข ๋ฃํ๊ธฐ ์ํด ์ข ๋ฃ ํํฌ๋ฅผ ์ ๊ณตํ๋ ์๊ด ์์ง๋ง ๋์๊ฒ ๋ง์กฑ์ค๋ฌ์ด ์๋ฃจ์ ์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์๋ฌด๊ฒ๋ ๊ฐ์ง์ง ์์ผ๋ฉด ๋ก๊ทธ๋ฅผ ์์ฑํ๊ณ ์ข ๋ฃํ๊ณ ์ค์ ๋ก ๊ธฐ๋ก ๋ ๊ฒ์ด๋ผ๋ ํ์ ์ ๊ฐ์ง ์ ์์ต๋๋ค.
๋๊ธฐ ์ ์ก์ ๊ฒฝ์ฐ IO๊ฐ ์๋ฃ ๋ ๋๊น์ง ์ฝ๋ ์คํ์ด ์ฐจ๋จ๋์ด ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค. ๋น๋๊ธฐ ์ฐ๊ธฐ๋ฅผ ์ฐจ๋จ ์ฐ๊ธฐ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ์ฆ, ์ผ๋จ ๋ก๊ทธ์ ๋น๋๊ธฐ ์ฐ๊ธฐ๋ฅผํ๋ฉด NodeJS๊ฐ ์ ๊ทผ ํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ฉฐ ๊ทธ๋์ ๋ค๋ฅธ JS ์ฝ๋๊ฐ ์คํ๋ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ํ๋ผ ๋ฏธ์ค๋ ๋๊ธฐ์์ผ๋ก ์ทจ์ ํ ์ ์๊ณ , ์๊ฐ ์ด๊ณผ๋ ๋๊ธฐ์์ผ๋ก ์ง์ธ ์ ์์ผ๋ฉฐ, ํ์ผ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋๊ธฐ์์ผ๋ก ๋ซ์ ์ ์์ผ๋ฏ๋ก ๋ ๋์ (๋ ๋์ ์ฑ๋ฅ) ์๋ฃจ์
์ ์ทจ์ / ์ง์์ผํ๋ ํญ๋ชฉ์ ์ถ์ ํ๋ ๊ฒ์
๋๋ค. winston.log_and_exit()
๋ฅผ ํธ์ถํ๋ ์์ธ ์ฒ๋ฆฌ๊ธฐ ๋๋ winston.log_and_exit()
๋ํ ์ ํ์ ์ฝ๋ฐฑ์์ ๋ซ๊ณ ๋ซ์ต๋๋ค.
๋ฌผ๋ก Winston์ด ์ค๋ฅ ๋ฐ์์ ๋ซ์์ผํ๋ ๋ชจ๋ ์ฌํญ์ ์ถ์ ํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฌํ ์์ ๊ด๋ฆฌ์๋ ๊ทธ ์์ฒด๋ก ์ ์ฉํ ๊ฒ์ผ ์ ์์ผ๋ฉฐ ๋ณ๋์ ํ๋ ์ ์ํฌ๋ฅผ ์ฌ์ฉํ ๊ฐ์น๊ฐ์์ ๊ฒ์ ๋๋ค. Curley์ ๋ฒ์น).
์ฌ๊ธฐ์ ์ฑ๋ฅ์ด ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ ๋ ์์ ์ ๋๋ค. winston์ IMO๋ฅผ ํ๋ณตํ๊ฒ ์ฐจ๋จํ ์์๋ ์ต์ข ๋ก๊ทธ ๋ผ์ธ์ ๋ํ ๋ถ๊ธฐ ๋ง ์ํํ๋ฉด๋ฉ๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์ผ๋ง๋ ์ค๋๋์๊ณ ์ด์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ค๋ ์ฌ์ค์ ๊ฐ์ํ ๋ ์ธ์ ๋ผ๋ winston์์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ๋์ ์ ํํ์ง์งํ์ง๋ ์์ต๋๋ค.
๋น์ ๊ณผ ๋ด๊ฐ ๋ชฉ์ ์๋๊ณ ์ด์ผ๊ธฐ (์ฐ๊ธฐ)ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ํ์ผ์ ์ต์ข ๋ฉ์์ง๋ฅผ ๋๊ธฐ์์ผ๋ก ์์ฑํ๋ ๋ฐ ๊ด์ฌ์ด์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง ์ ๊ด์ฌ์ฌ๋ ์ค๋ฅ ์ง์ ์ ๋น๋๊ธฐ์์ผ๋ก ์์ฑ๋ ๋ก๊ทธ๊ฐ ํ์ผ์ ์์ฑ๋๋๋กํ๋ ๊ฒ์ด ์์ต๋๋ค.
์ค๋ฅ ์ง์ ์ ๋ฐ์ํ ํ์ผ์ ๋ฉ์์ง๋ฅผ ๋ ๊ธฐ์ ์ผ๋ก ๊ธฐ๋กํ๋ ค๋ฉด ๋ชจ๋ ๋ฉ์์ง๊ฐ ๋ ๊ธฐ์ ์ผ๋ก ๊ธฐ๋ก๋์ด์ผํ๋ฉฐ ์ด๊ฒ์ด ์ฑ๋ฅ ๋ฌธ์ ์ ๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ ๋ง์ง๋ง ๋ก๊ทธ๊ฐ ํ์ผ์ ๊ธฐ๋ก๋๊ธฐ ์ ์ ๋ค๋ฅธ JS ์ฝ๋๊ฐ ์คํ๋์ง ์๋๋กํ๋ ๊ฒ์ ๋ํด ์ฐ๋ คํ์ต๋๋ค.
๋ชจ๋ ์ฌ๋์ ์๊ตฌ๋ฅผ ๋ง์กฑ์ํฌ ์์๋ ์ต์ ์ ๋น๋๊ธฐ ์ ์ผ๋ก ์ฐ๋ ์ฌ์ฉ์ ์ง์ ์ ์ก ์ ์์ฑํ๋ ๊ฒ์ด๋ฉฐ, ์์ง ํ์ผ์ ๊ธฐ๋ก (ํ๋ฌ์) ๋ ๊ฒ์ผ๋ก ํ์ธ๋์ง ์์ ๋ฉ์์ง์ ๋ฒํผ๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋๋ค. , NodeJS๊ฐ ์ด๋ฏธ ํ์ผ ์ฐ๊ธฐ๋ฅผ ์๋ฃํ์ง๋ง ํ๋ฌ์ ๋ ์ด๋ฒคํธ๊ฐ ์์ง ์ฒ๋ฆฌ๋์ง ์์ ๊ฒฝ์ฐ ...).
๋ฐํ ๋ฐ / ๋๋ ์ฝ๋ฐฑ์ ํธ์ถํ๊ธฐ ์ ์ ๋ชจ๋ ๊ฒ์ด ํ๋ฌ์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ข ๋ฃ ํํฌ๋ฅผ ํธ์ถ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ ๋ก ์ด๋ ต์ต๋๊น? ์ด๊ฒ์ ๊ฑฐ์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋๊ธฐ ๋ก๊ทธ์ ๊ด์ฌ์ด์๋ ์ด์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด์๋ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ํ ์คํธ. ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ 1 ~ 2 ์ด๊ฐ ๋ ๊ฑธ๋ฆฌ๋์ง ์๊ด ์์ต๋๋ค. ๋ก๊ทธ๊ฐ ๊ฒฐ์ ์ ์ด์ง ์์์ง ์ฌ๋ถ๋ ๋ ธ๋๊ฐ ์ข ๋ฃํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ ์๋์ ๋ฐ๋ผ ๊ธฐ๋ก ๋ ์๋ ์๊ณ ๊ธฐ๋ก๋์ง ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ๋์๋ค . ๋น๋๊ธฐ๊ฐ ๊ธฐ๋ณธ๊ฐ์ด์ด์ผํ๋ค๋ ์ ์ ์ง์ฌ์ผ๋ก ๋์ํฉ๋๋ค. ํนํ ๋ด๋ถ ๋ ธ๋ ์์ฒด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ ๋ ์ด๊ฒ์ด ์ ์ผํ ์ต์ ์ด์ด์ผํ๋ค๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค.
@mscharley ์ด๊ฒ์ด log4js.shutdown
ํจ์๊ฐ ์์ต๋๋ค. ์ฝ๋ฐฑ์ ํธ์ถํ๊ธฐ ์ ์ ๋ชจ๋ ์ด ํ๋ (winston์ด ํธ๋์ค ํฌํธ๋ผ๊ณ ๋ถ๋ฆ)๊ฐ ์์ฑ์ ์๋ฃํ๋์ง ํ์ธํ๊ธฐ ์ํด ๊ธฐ๋ค๋ฆด ๊ฒ์
๋๋ค. ๋ด ์ฌ์ฉ์์๊ฒ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ข
๋ฃ ํธ์ถ์ ์๋ต ํ ์ ์๋๋ก ์์ฑํด์ผํ๋ค๋ ์ ์์ ์ด ํ๋์ ์ง์์ด ํ์ํฉ๋๋ค.
์ ๋ log4js๋ฅผ ํ๋ณดํ๊ฑฐ๋ ์์คํด๋ณด๋ค ๋ซ๋ค๊ณ ๋งํ์ง ์์ต๋๋ค. ๋ค๋ง์ด ์ ๊ทผ ๋ฐฉ์์ด ํจ๊ณผ๊ฐ์์ ์ ์๋ค๊ณ ์ง์ ํฉ๋๋ค. ์ต์ ์ ๋ฐฉ๋ฒ์ด ์๋ ์๋ ์์ต๋๋ค.
์ด๊ฒ์ winston.log_and_exit()
๋ ์ผ์ ๊ดํ ๊ฒ์
๋๋ค. log4js.shutdown()
๋ ์ฐ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ ( appenders.filter(a => a.shutdown).forEach(a => a.shutdown(complete));
)์ ๊ธฐ๋ฐ์ผ๋กํ๋ ์ถ๊ฐ์ ๊ฒฝ์ฐ writable.end(complete)
์ ์ข
์๋๋ฉฐ ์ฌ์ ํ ๋น๋๊ธฐ์ ์ข
๋ฃ์
๋๋ค.
@mscharley ์ ์๊ฒฌ๊ณผ ๊ด๋ จํ์ฌ ์ฅ์ ์ fileSync
appender๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. shutdown()
๋ฅผ ์ฌ์ฉํ์ฌ ๋
ธ๋๊ฐ ํ์ผ์ ๊ธฐ๋ก ๋ ๋ ์ ์ฒด ๋ก๊ทธ๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ฉ๋๋ค ...
์, fileSync
์ ์ก์ ์ฌ์ฉํ๋ฉด ์ ์ฑ๋ฅ์ด ์ ํ ๋๋๋ผ๋ ์ผ๋ถ ์ํฉ์์ ์ ์ฉ ํ ์ ์์ต๋๋ค.
@jdthorpe ์ข ๋ฃํ๊ธฐ ์ ์ ๊นจ๋ํ๊ฒ ๋ซ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ ๊ฒ์ ๋ํ ๊ทํ์ ์์ด๋์ด๋ ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ฌ์ ํ ๋ชจ๋ ๊ฒ์ ๋์คํฌ์ ํ๋ฌ์ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ธฐ ์ํด winston์์ ์ฑ ์์ ์ฎ๊ธฐ์ง๋ ์์ต๋๋ค (์ฆ, ์์ฒด๋ฅผ ๋ซ๋ ๋ฉ์ปค๋์ฆ ์ ๊ณต) ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฐํฉํ์ฌ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ close ๋ฉ์๋๋ฅผ ์ง๊ณ ํ ์ ์์ต๋๋ค.
์ด ํฐ์ผ์ ์ต์ํ ๋ฌธ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ํ์ฌ ์ง์๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ ์ ์์ต๋๊น? ๋ฆฌํฌ์งํ ๋ฆฌ์์ seriously
๋ฅผ ๊ฒ์ ํ ๋ ์ง์ํ๋ค๊ณ ์ฃผ์ฅํ๋ ์ด ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น
ํ๋ ๋ฐ 30 ๋ถ์ ๋ณด๋์ต๋๋ค. README
์ด๊ฒ์ ์ง์๋์ง ์๋ ๊ธฐ๋ฅ์ด๋ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์ด๋ฉฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค์ ๋ก ๋๋ฌด ๋ง์์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ์ธ์ ํด๊ฒฐ๋ฉ๋๊น? ์ด๊ฒ์ ์ง๊ธ๊น์ง 3 ๋ ๋์ ์กด์ฌํ์ผ๋ฉฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ ์ด๋ ์ค์ ๋ก ์๋ํ๋ ๋ก๊ฑฐ์ ์ฝ๋ฐฑ์ ๋ฃ์ด ๋ณด๊ฒ ์ต๋๋ค.
๋ชจ๋ ์ฌ๋์์ํ ์ผ๋ฐ shutdown()
ํจ์๋ฅผ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์์ฑํ์ ์ ์์ผ๋ฉฐ์ด ๊ธฐ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ ์ด๊ฒ์ ๋งค์ฐ, ๋งค์ฐ ์ค์ํ ๋ฌธ์ ์ ๋๋ค.
์ด๊ฒ์ ๋ํ +1
์์งํ shutdown(callback)
๊ฒ์ด ์ ์ ํด ๋ณด์ด์ง๋ง ์ด์ก ์๋จ์ด์ด๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ง์ํด์ผํ๋ค๋ ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ ์ก์ ๊ธฐ๋ณธ ์ถ๋ ฅ ๋ฉ์ปค๋์ฆ์ ๋ํ "์ ๋ณด ์ ๋ฌธ๊ฐ"์
๋๋ค. ๊ทธ๋ค์ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์์ ํ ์ข
๋ฃ๋์ด์ผํ๋์ง์ ๋ํ ๊ฐ์ฅ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
winston
์ฝ์ด๊ฐ ์ํํ๋ ๋ชจ๋ ์์
, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ํ์คํ๊ฒ ์ฌ์ฉ์ ์์ญ์์ ์ํํ๋ ๋ชจ๋ ์์
์๋ ์ ์ถ ํ ์ ์ก์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค.
๋ฐ๋ผ์ winston
๊ฐ ์์
์ ์ํ ํ ํ์๋ ์์ง๋ง
์๋ ์์ ์ ์ค๋ช ํ๋ ๋ช ๊ฐ์ง ์์ฌ ์ฝ๋์ ๋๋ค.
```js
shutdown (callback) {
var transportCount = transports.length
var finished = 0;
// ๊ฐ ์ ์ก์ ๋ํด
if (transport.shutdown) {
transport.shutdown (function () {
// ์๋ฃ ํ์๋ฅผ ๋๋ฆฝ๋๋ค.
// ๋ชจ๋ ์๋ฃ๋๋ฉด ์๋ ์ฝ๋ฐฑ์ ํธ์ถํฉ๋๋ค.
});
} else {
// ์ ์ก์ (์์ง) ์ง์ํ์ง ์์ต๋๋ค.
// ์๋ฃ๋ ์นด์ดํฐ ์ฆ๊ฐ
}
}
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 = [์ winston.transports.File ({ํ์ผ ์ด๋ฆ : '/log/app.log'})]
global.log = winston.createLogger ({transports : [logTransport]})
// ์ฃผ์ด์ง ๋ฐํ ์ฝ๋๋ก ์ข
๋ฃํ๋ ๋์ฐ๋ฏธ์ด์ง๋ง ๋ก๊ฑฐ๊ฐ ์๋ฃ๋ ํ์ ๋ง
// ํด๊ฒฐ๋์ง ์๋ Promise๋ฅผ ๋ฐํํ๋ฏ๋ก ์คํ์ด ์ค์ง๋ฉ๋๋ค.
log.exit = (exit = 5) => {
return new 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 ๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ ์ฌ๋ก์๋ง ํด๋น๋ฉ๋๋ค. ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ง ์๋ AWS Lambda์์๋ winston-log-and-exit์ ์ฌ์ฉํ ์ ์์์ง๋ง ์คํ ์ฌ์ด์ ๋๊ฒฐ๋๋ฏ๋ก ๋ก๊ทธ๊ฐ ์ฌ์ ํ ์์ค๋ฉ๋๋ค. ๋ํ ์ฑ๊ณต์ ์ธ ์คํ ๊ฒฝ๋ก์์ ํญ์ ๊ทธ๋ ์ง๋ ์์ ๋ง์ง๋ง ๋ฉ์์ง๊ฐ ์ด๋ค ๋ฉ์์ง์ธ์ง ์๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
@mscharley ์์ await
์๋ฃจ์
์ด ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํฉ๋๊น? ์๋ง๋ log.exit()
๋์ ์ ๋ ๋์ API๋ await log.finish()
๊ฐ ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ํธ๋์ค ํฌํธ๊ฐ ์ฐ๊ธฐ๋ฅผ ๋ง์น ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ฌด์์ด๋ ํ ์์๊ฒํฉ๋๋ค ( process.exit
ํธ์ถ, ๋๋ค ํธ์ถ done
์ฝ๋ฐฑ ๋ฑ)
๊ทธ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์์คํด ๋ด๋ถ๋ฅผ ์ ์ธํ๊ณ ๋ ์ด๋ฒ ํธ์์ ์ถ์งํด์จ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ํ๋ฌ๊ทธ์ธ ์ธ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ ์์ฃผ ๋ฑ์ฅํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐํ๋ ์ผ์ด ํน๋ณํ ์ผ์ด ์๋๋ผ๊ณ ์๊ฐํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ชจ๋ ํ๋ก์ ํธ์์์ด ๋ฒฝ์ ์ณค์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ฒฐ๊ตญ Winston์์ ๋ฉ์ด์ก์ต๋๋ค. ํนํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋์ ํ๋ก์ธ์ค ๋์์ ๋ก๊ทธ๋ฅผ ์๋ ๊ฒ์ ์ ์ด๋ ์ํ ํด ๋ณด์ ๋๋ค.
log4js-node๋ ๋ชจ๋ ์ ์ก์ ํ๋ฌ์ํ๊ณ process.exit()
์ ๊ฐ์ ์ฝ๋ฐฑ์๋ฐ๋ ์ข
๋ฃ ๋ฉ์๋ ๋ฅผ ๊ตฌํํ์ต๋๋ค. winston์ ์ด์ ๊ฐ์ ๊ฒ์ ์ถ๊ฐ ํ ์ ์์ต๋๊น?
log4js-node๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ๋ฌธ์ ๋ ๋งค์ฐ ์ค์ ์ ์ ๋๋ค.
๋ชจ๋ ๋ก๊น ์์คํ ์ ๊ฒฝ์ฐ ๋ฏธ์ ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
process.exit()
์ง์ ํธ์ถํ๋ ๊ฒฝ์ฐ ๋ฒํผ๋ง ๋ ๋ฉ์์ง๊ฐ ์ง์์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ญ์์ค. winston์ ๊ฒฝ์ฐ winston-log-and-exit ํจํค์ง๊ฐ์ด ์์
์ ์ํํฉ๋๋ค.process.exit()
ํธ์ถํ๊ณ ํ๋ซํผ์ on-exit ํํฌ๊ฐ์๋ ๊ฒฝ์ฐ ํด๋น ํํฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋ฒํผ๋ง ๋ ๋ฉ์์ง๊ฐ ์ง์์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ญ์์ค. winston-log-and-exit ๋ ๋์์ด ๋ ์ ์์ต๋๋ค.๋ถ์์ ์ผ๋ก @ begin-again log_and_exit()
๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก log-4js์ shutdown()
๋ฉ์๋์ ๋์ผํ๋ฉฐ ์ ๊ณต๋ ๋ก๊ทธ ๋ฉ์์ง๊ฐ ๊ธฐ๋ก๋๋ค๋ ์ถ๊ฐ ๋ณด์ฅ์ด ์์ต๋๋ค.
@jdthorpe ํ์ง๋ง winston-log-and-exit
์ winston 3์์ ์ฝ๊ฒ ์๋ํ์ง ์์ต๋๋ค.
@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 ์๋์, ๊ณ ์ฅ
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 ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์ ์ ์์์ต๋๊น? ์ต๊ทผ์ Winston 3.x๋ก ์ ๊ทธ๋ ์ด๋ํ์ง๋ง 2.x๋ก ๋์๊ฐ๊ฑฐ๋ ์ฌ๊ธฐ์์ ์๋ฃจ์ ์ด์๋ ๋ค๋ฅธ ๋ก๊ฑฐ๋ฅผ ์ฐพ์์ผ ํ ์ ์์ต๋๋ค.
@matttowerssonos , IIRC, ์ด๋ฌํ ๋ฌธ์ ๋ ๋ชจ๋ Winston @ 2 ์ ๊ด๋ จ์ด ์์ต๋๋ค
BTW, 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
์ด๋ฒคํธ๋ ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋ฐ์ธ๋ฉ๋๋ ์๊ฐ์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ ํ ๋ ํ์ ๋ง โโ๋ฐ์ํด์ผํ๋ฏ๋ก ์ค์ํ์ง ์์ต๋๋ค. ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋จผ์ ๋ฐ์ธ๋ฉ๋๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ ๋ช
ํํ๊ฒ ์์ฑํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฟก๋ฟก
์ค, ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ด๋ป๊ฒ ๋ฐ์ธ๋ฉํฉ๋๊น?
๊ทธ๋ด๊น์?
processLogger.on('finish', () => {
this.process.disconnect();
});
@stephanoparaskeva ๋ค. ์ด๊ฒ์ด ํจ์ ๋ฐ์ธ๋ฉ์์ํ ์ฌ๋ฐ๋ฅธ ๊ตฌ๋ฌธ์ ๋๋ค.
{
this.process.disconnect();
}
processLogger
๊ฐ์ฒด์ ์ํด ์์ฑ ๋ finish
์ด๋ฒคํธ์.
๋๋ฅผ ์ํด ์๋ํฉ๋๋ค : https://stackoverflow.com/a/59260151
process.exit๋ฅผ ํธ์ถํ์ง ์๊ณ ๋์ ๋ชจ๋ ์ฐ๊ฒฐ์ ๋ซ๊ณ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ฐฐ์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ์ผ๋ก์จ ์ ์ ํ ์ข ๋ฃ๋ฅผ ์ํํ๋ฉด ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@deedf ๊ฐ ๋ฌด์์ ํ๋ ค๋ฉด https://stackoverflow.com/a/37592669 ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ด ์กฐ์ธ์ ๋ฐ๋ผ ์ ๋์ด ๋ฌธ์ ๋ฅผ ์ํํ์ต๋๋ค.
์ข ๋ฃ ์ด๋ฒคํธ๊ฐ ๋ช ๋ ์ด ์ง๋ ํ์๋ ์ฌ์ ํ ๋ฐ์ํ์ง ์๋๋ค๋ ์ฌ์ค์์ด ์์ ์์ ๋นํฉ ์ค๋ฝ์ต๋๋ค. ๋ก๊ฑฐ๋ฅผ ์ ํํ๊ณ ๋ชจ๋ ์ฌ์ฉ์ ์ง์ ์ ์ก์ ๋ค์ ์์ฑํด์ผํ๋ ๊ฒ์ ๊ณ ํต ์ค๋ฌ์ธ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด winston์ ์ํด ์์ง ํด๊ฒฐ๋์ง ์์ ๋ฐฉ๋ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ด ์ฝ๋์ ์ฒซ ๋ฒ์งธ ๋ก๊ฑฐ ๋ง Logstash์ ๊ธฐ๋ก๋๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค (winston-elasticsearch๋ ์ฌ์ฉ). logger.end ()๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๊ธฐ๋ก๋์ง๋ง ํ๋ก๊ทธ๋จ์ด ๋๋ฌด ์ผ์ฐ ์ข
๋ฃ๋ฉ๋๋ค. ์์ ๋ชจ๋ ์๋ฃจ์
์ ์ฌ์ฉํด ๋ณด์์ง๋ง ์ค์ ๋ก ์๋ํ์ง ์์์ต๋๋ค.
๋ ์ ๋ง ๋ฌด๋ ฅ ํด
๋๋ ์ด๊ฒ์ด winston์ ์ํด ์์ง ํด๊ฒฐ๋์ง ์์ ๋ฐฉ๋ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ด ์ฝ๋์ ์ฒซ ๋ฒ์งธ ๋ก๊ฑฐ ๋ง 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์ ๋ฃ๊ณ ๋ชจ๋ ์ ์ก์ ๊ธฐ๋กํ ๋ค์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋๋ ํ๋์ winston์ ์ฌ์ฉํ์ง ์์์ง๋ง ์ด์จ๋ ๊ธฐ๋กํ์ง ์์ต๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ก๊น ํ ์ค๋ฅ๊ฐ ๋ค์ ๋ฐ์ํ์ง ์์ต๋๊น?
๋๋ ์ฌ๋๋ค์ด์ด "๋ฌธ์ "๊ฐ "ํด๊ฒฐ"๋์ง ์์ ์์ ์ดํดํ์ง ๋ชปํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค. exit ()๋ฅผ ํธ์ถํ์ง ์๊ณ ์ ์ ํ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๊ด์ฐฎ์ต๋๋ค.
๋ด๊ฐ exit ()๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ด๋์์ ๋ณด์์ต๋๊น?
๋น์ ์ ์ฝ๊ธฐ์ ์ดํด ๋ฅ๋ ฅ์ด์ด ๋ฒ๊ทธ๊ฐ ๋ฌด์์ธ์ง ์ดํดํ๊ธฐ์ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํด์ ์ฃ์กํฉ๋๋ค. ์ ๋ชฉ์ ๋ค์ ํ์ธํ์ญ์์ค.
8 ๋ ๋์ ์ด๋ ค ์๊ณ ์ ์ ํ ๋์์ ์ ํ ์ ๊ณตํ์ง ์๋ ๋ฌธ์ ์ ์ง๋ฉดํ๋ฉด ๋๋ฌด ๋ฐ๋น ์ผํฉ๋๋ค.
์ ์ด๋ ๋๋ ์๊ฒฉ์ ๊ฐ์ถ ๋ ์์ฒ๋ผ ์ง์ง ๋์ง ์๊ณ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@danielweck ์๋์, ๊ณ ์ฅ
6 ๋ , ์ฆ _important_๋ก ํ์๋ ๋ฒ๊ทธ์ ๊ฒฝ์ฐ 6 ๋ ์ ๋๋ค. ์ธ์์ ์ธ ๊ฒฝ๊ณ์ ์ ๋๋ค.