Winston: "prettyPrint"๋ฅผ ํ™œ์„ฑํ™”ํ•  ๋•Œ ๋†’์€ CPU ์‚ฌ์šฉ๋Ÿ‰

์— ๋งŒ๋“  2018๋…„ 09์›” 04์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: winstonjs/winston

๊ท€ํ•˜์˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์—ฌ๋Ÿฌ JSON ๊ตฌ์กฐ ์™€ prettyPrint ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ๋กœ๊น…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ winston์€ CPU๋ฅผ 90% ์ด์ƒ์œผ๋กœ ์ŠคํŒŒ์ดํฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋œ ์ „์†ก์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

new (winston.transports.Console)({
          level: 'silly',
          silent: false,
          colorize: true,
          prettyPrint: true,
          timestamp: true,
          humanReadableUnhandledException: true,
          format: format.combine(
            format.splat(),
            format.colorize(),
            format.label({ label: 'Foo' }),
            format.timestamp(),
            format.prettyPrint(),
            format.printf( log => {
              return '[ ' + log.timestamp + ' ][ ' + log.level + ' ][ ' + log.label + ' ] ' + log.message;
            })
          )
        })

https://github.com/winstonjs/winston/issues/613 ๊ณผ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ?

Winston ๋ฐ prettyPrint๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CPU ์ŠคํŒŒ์ดํฌ ์—†์Œ ํ™œ์„ฑํ™”

๊ธฐํƒ€ ์ •๋ณด

PrettyPrint๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋กœ๊น… ์ „์— JSON ๊ตฌ์กฐ์˜ ๋ฌธ์ž์—ดํ™”๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด CPU ์ŠคํŒŒ์ดํฌ๊ฐ€ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

CPU ์ŠคํŒŒ์ดํฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ •๋œ ์ „์†ก ๊ตฌ์„ฑ:

new (winston.transports.Console)({
          level: 'silly',
          silent: false,
          colorize: true,
          prettyPrint: false, // Forced disabled pretty print
          timestamp: true,
          humanReadableUnhandledException: true,
          format: format.combine(
            format.splat(),
            format.colorize(),
            format.label({ label: 'Foo' }),
            format.timestamp(),
            //format.prettyPrint(), // Removed prettyPrint from format
            format.printf( log => {
              return '[ ' + log.timestamp + ' ][ ' + log.level + ' ][ ' + log.label + ' ] ' + log.message;
            })
          )
        })

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

winston ๋˜๋Š” logform์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค.

util.inspect์˜ Node.js ๋ฌธ์„œ์—์„œ(https://nodejs.org/api/util.html#util_util_inspect_object_options):

util.inspect()๋Š” ์ฃผ๋กœ ๋””๋ฒ„๊น… ๋„๊ตฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ž…๋ ฅ ๊ฐ’์—๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ํ•ซ ์ฝ”๋“œ ๊ฒฝ๋กœ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋”ฐ๋ผ์„œ Node๋Š” ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ prettyPrint๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, prettyPrint์— ๋Œ€ํ•œ ๊นŠ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜๋ฉด ์„ฑ๋Šฅ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ฉ”๋ชจ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

๋ชจ๋“  3 ๋Œ“๊ธ€

JSON ๊ฐ์ฒด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊นŠ๊ณ  ๋ณต์žกํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์œ ์ธ์‡„์— ์‚ฌ์šฉํ•˜๋Š” util.inspect๋Š” ์ถฉ๋ถ„ํžˆ ๋ณต์žกํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋งค์šฐ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ˆœํ™˜ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌดํ•œ ๋ฃจํ”„์ผ ์ˆ˜๋„ ์žˆ์Œ). ์ „์ฒด ๊ฐœ์ฒด๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ฐœ์ฒด์˜ ์ฒ˜์Œ ๋ช‡ ๋ ˆ์ด์–ด(๊นŠ์ด ๋งค๊ฐœ๋ณ€์ˆ˜)๋งŒ์œผ๋กœ ๋งŒ์กฑํ•ฉ๋‹ˆ๊นŒ?

์ง€๊ธˆ ๋‚ด๊ฐ€ ๊ธฐ๋กํ•˜๊ณ  ์žˆ๋Š” JSON ๊ตฌ์กฐ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๊ฐ์ฒด์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ์ธ์Šคํ„ด์Šคํ™”๋œ ํด๋ž˜์Šค์ด๊ณ  ๊ทธ ์ˆ˜๋Š” 10~100๊ฐœ ํ•ญ๋ชฉ์ด๋ฉฐ ๋ณต์žก์„ฑ์€ ๊นŠ์ด ์ˆ˜์ค€ 3(์ˆœํ™˜ ๊ตฌ์กฐ ์—†์Œ)์— ๋„๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋งค์šฐ ์ž์ฃผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค: 200/500ms๋งˆ๋‹ค ํ•˜๋‚˜์˜ ๋กœ๊ทธ์˜ ์ตœ๋Œ€ ๋นˆ๋„์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ๊ตฌ์กฐ์˜ ๋กœ๊น…์€ "์–ด๋ฆฌ์„์€" ์žฅํ™ฉํ•จ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
"์–ด๋ฆฌ์„์€" ์ž์„ธํ•œ ์ •๋ณด๋Š” "๋ฐ”๋ณด ๊ฐ™์€" ์ˆ˜์ค€์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—(^^) ์ €๋Š” ๊ทธ๋ƒฅ ์˜ˆ์œ ์ธ์‡„๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊นŠ์ด ์ œํ•œ, ์ง€์—ฐ ๋˜๋Š” ๊ณผ๋„ํ•œ CPU ์‚ฌ์šฉ๋Ÿ‰ ์—†์ด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์–ป์Œ์œผ๋กœ์จ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

"util.inspect"๊ฐ€ JSON.stringify์— ๋น„ํ•ด ๊ทธ๋ ‡๊ฒŒ ๋Š๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊นŠ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ŠคํŒŒ์ดํฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ƒํ™ฉ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Œ)

winston ๋˜๋Š” logform์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค.

util.inspect์˜ Node.js ๋ฌธ์„œ์—์„œ(https://nodejs.org/api/util.html#util_util_inspect_object_options):

util.inspect()๋Š” ์ฃผ๋กœ ๋””๋ฒ„๊น… ๋„๊ตฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ž…๋ ฅ ๊ฐ’์—๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ํ•ซ ์ฝ”๋“œ ๊ฒฝ๋กœ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋”ฐ๋ผ์„œ Node๋Š” ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ prettyPrint๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, prettyPrint์— ๋Œ€ํ•œ ๊นŠ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜๋ฉด ์„ฑ๋Šฅ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ฉ”๋ชจ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰