Winston: 3.0.0μ—μ„œλŠ” JSON.stringifyλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  개체λ₯Ό 기둝할 수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 02μ›” 22일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: winstonjs/winston

μ €λŠ” 버전 3을 μ‚¬μš© μ€‘μ΄μ§€λ§Œ 개체λ₯Ό β€‹β€‹κΈ°λ‘ν•˜λŠ” μœ μΌν•œ 방법은 λ¨Όμ € 개체λ₯Ό λ¬Έμžμ—΄ν™”ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 였λ₯˜λ₯Ό μ „ν˜€ 기둝할 수 μ—†κΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ 더 λ‚˜μ©λ‹ˆλ‹€. error.messageλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 직접 μ½˜μ†”μ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이것은 개발 ν™˜κ²½μ— λŒ€ν•œ λ‚΄ κ΅¬μ„±μž…λ‹ˆλ‹€.

`` const { createLogger, ν˜•μ‹, 전솑 } = require('winston');
const { κ²°ν•©, νƒ€μž„μŠ€νƒ¬ν”„, λ ˆμ΄λΈ”, printf } = ν˜•μ‹;

const environment = process.env.NODE_ENV;
const timestampFormat = 'YYYY-MM-DD HH:mm:SS';

const loggerFormat = printf((info) => {
    return `[${info.label}] ${info.message}`;
});
logger = createLogger({
    format: combine(
        label({ label: 'immoliste' }),
        format.colorize({ all: true }),
        format.splat(),
        format.simple(),
        loggerFormat
    ),
    transports: [
        new transports.Console({
            level: 'debug',
            colorized: true
        })
    ]
});

μ΄λ ‡κ²Œ ν•˜λ©΄:

logger.error('Error sending contact message:', JSON.stringify(err));

λ‚˜λŠ” 단지 :

[mylabel] Error sending contact message:

κ·ΈλŸ¬λ‚˜ λͺ¨λ“  것을 λ¬Έμžμ—΄ν™”ν•˜κ³  였λ₯˜μ— λŒ€ν•΄ κ·Έλ ‡κ²Œ ν•΄μ•Ό ν•˜λŠ” 것은 골치 μ•„ν”ˆ μΌμž…λ‹ˆλ‹€. 이전 λ²„μ „μ—μ„œλŠ” κ°„λ‹¨ν–ˆκΈ° λ•Œλ¬Έμ— λ‚΄κ°€ 뭘 잘λͺ»ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ§„μ§€ν•˜κ²Œ, 이것은 λ‹€μš΄ κ·Έλ ˆμ΄λ“œμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. Winston 2λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  console.X λ₯Ό winston.X 둜 λ°”κΏ€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ™œ κ°‘μžκΈ° λͺ»μƒκΈ΄ ν˜•μ‹ νƒœκ·Έμž…λ‹ˆκΉŒ?

λͺ¨λ“  18 λŒ“κΈ€

+1

@eyp 이거 ν•΄λ³Όλž˜ ?

logger.error('Error sending contact message:%o', {foo: "bar"});

κΈ°λ³Έ μ†ŒμŠ€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

https://github.com/winstonjs/logform/blob/master/splat.js

λ…Έλ“œμ—μ„œ util.format λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

https://nodejs.org/api/util.html#util_util_format_format_args

κ·Έλž˜μ„œ %o , %O 및 %j κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

%o

맀λ ₯처럼 μž‘λ™ν•˜μ§€λ§Œ winston이 util.formatκ³Ό λ™μΌν•œ ν˜•μ‹ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 것을 λͺ°λžμŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€!

μœˆμŠ€ν„΄ 3.1.0
λ‚˜λŠ” 이것을 여기에 μ“°λŠ” κ²ƒμ²˜λŸΌ μ‹œλ„ν•©λ‹ˆλ‹€.
const debugConsole = μƒˆλ‘œμš΄ winston.transports.Console({
레벨: '디버그',
ν˜•μ‹: winston.format.combine(winston.format.simple()),
ν•Έλ“€ μ˜ˆμ™Έ: 사싀
})
logger.add(디버그 μ½˜μ†”)

λ‚΄κ°€ μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œ: logger.debug('%o', req.query)
json κ°œμ²΄κ°€ ν‘œμ‹œλ˜μ§€λ§Œ μ•„λž˜ μ½˜μ†” 둜그 이전에 "%o"도 ν‘œμ‹œλ©λ‹ˆλ‹€.
디버그: %o {"μ˜€ν”„μ…‹":"73000","카운트":"3","νƒ€μž„μŠ€νƒ¬ν”„":"2018-10-29 15:02:08"}
λ‚˜λŠ” λ¬΄μ—‡μ„ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

일반적으둜 %oλŠ” μ›ν•˜λŠ” 개체λ₯Ό μ§€μ •ν•˜λŠ” util.format()에 μ˜ν•΄ ν˜ΈμΆœλ©λ‹ˆλ‹€. 좜λ ₯μ—μ„œ κ°œμ²΄κ°€ ν‘œμ‹œλ˜κ³  있기 λ•Œλ¬Έμ— %oκ°€ ν•„μš”ν•˜μ§€ μ•Šμ€ κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

λŒ€μ‹  logger.debug(req.query)λ₯Ό μ‚¬μš©ν•˜λ©΄ μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. λ˜λŠ” λ‹€μŒκ³Ό 같이 util.format을 μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜μ— μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
const queryFormatted = util.format('%o', req.query)
logger.debug(queryFormatted)

@frenzymind λ˜λŠ” @mingchunoκ°€ μ›λž˜ λ¬Έμ œμ— κ²Œμ‹œν•œ ν•΄κ²° 방법을 μ‹œλ„ν•΄ λ³΄μ‹­μ‹œμ˜€.

λŒ€μ‹  이것을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. logger.debug(req.query) 그러면 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@eponymz 이 경우 λ‹€μŒμ΄ μžˆμŠ΅λ‹ˆλ‹€. debug: [object Object] {"timestamp":"2018-10-30 11:14:04"}

const queryFormatted = util.format('%o', req.query)

μž‘λ™ν•˜μ§€λ§Œ μ‹œλ„λŸ½μŠ΅λ‹ˆλ‹€.

두 번째의 좜λ ₯이 당신이 μ›ν–ˆλ˜ κ²ƒμž…λ‹ˆκΉŒ? 즉, λ‘œκ·Έμ—μ„œ 쿼리λ₯Ό μ›ν•˜λ©΄ ν‘œμ‹œλ©λ‹ˆλ‹€. 그렇지 μ•Šμ€ 경우 mingchunoκ°€ κ²Œμ‹œν•˜κΈ° 전에 μ–ΈκΈ‰λœ ν•΄κ²° 방법을 μ‹œλ„ν•˜μ‹­μ‹œμ˜€.

예, 두 번째 방법은 λ‚΄κ°€ μ›ν•˜λŠ” λŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. json 객체 데이터가 λ³΄μž…λ‹ˆλ‹€.
λ‚΄κ°€ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•œλ‹€λ©΄ mingchunoλŠ” winston이 "under the hood"λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ¬Έμžμ—΄μ— %oλ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ‘°μ–Έν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것을 μ‹œλ„ν•˜κ³  μž‘λ™ν•˜μ§€λ§Œ λ‚΄ κ²½μš°μ—λŠ” %o도 μΈμ‡„λ©λ‹ˆλ‹€. λ˜ν•œ 디버그 μˆ˜μ€€μ— splat() ν˜•μ‹μ„ μΆ”κ°€ν•˜μ§€λ§Œ 아무 것도 λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ λ­”κ°€λ₯Ό λ†“μΉ˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

예, 개체 검사에 미리 보λ₯˜λœ %o 이 ν‘œμ‹œλ©λ‹ˆλ‹€. μΌμ’…μ˜ 버그인 것 κ°™μ€λ°μš”?

μ˜λ„μ  인 λ””μžμΈ μ„ νƒμž…λ‹ˆκΉŒ? λŒ€μ‹  ν‘œμ€€μ—μ„œ μƒλ‹Ήνžˆ λ²—μ–΄λ‚¬μŠ΅λ‹ˆλ‹€ (그리고 μ°ΎλŠ” 데 쒋은 μ‹œκ°„μ΄ κ±Έλ ΈμŠ΅λ‹ˆλ‹€)

console.log('Log me plz: ', {'ok': 'logged'});

(winston 3.x) λͺ¨λ“  λ‘œκΉ… ν˜ΈμΆœμ„ λ‹€μŒμœΌλ‘œ λ³€κ²½ν•΄μ•Ό 함

logger.info('Log me plz: %o', {'ok':'logged'});

μ£„μ†‘ν•©λ‹ˆλ‹€, 제 말이 λ§žμŠ΅λ‹ˆκΉŒ? ν˜Όλž€μŠ€λŸ¬μ›Œμš”...

μ§„μ§€ν•˜κ²Œ, 이것은 λ‹€μš΄ κ·Έλ ˆμ΄λ“œμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. Winston 2λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  console.X λ₯Ό winston.X 둜 λ°”κΏ€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ™œ κ°‘μžκΈ° λͺ»μƒκΈ΄ ν˜•μ‹ νƒœκ·Έμž…λ‹ˆκΉŒ?

κ·Έλž˜μ„œ μˆ˜μ •μ€ 개체λ₯Ό μΈμ‡„ν•˜λ €λŠ” λͺ¨λ“  λ‘œκΉ… 문에 %o λ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ„€!

항상 %oλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” 사싀을 받아듀일 수 μ—†μ—ˆκ³  λ‹€μŒκ³Ό 같은 κ°„λ‹¨ν•œ μ†”λ£¨μ…˜μ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

κ·Έλž˜μ„œ 이 둜거....

  logger.info({ hi: 123 })

...μ½˜μ†”μ—μ„œ μ΄κ²ƒμœΌλ‘œ λ³€ν™˜

info: {
    "hi": 123
}

μ—¬λŸ¬λΆ„μ„ λ„μšΈ 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€ :D μš°λ¦¬κ°€ 항상 "%o"λ₯Ό 두 번 μ‚¬μš©ν–ˆλ‹€λ©΄ λ”μ°ν•©λ‹ˆλ‹€.

항상 %oλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” 사싀을 받아듀일 수 μ—†μ—ˆκ³  λ‹€μŒκ³Ό 같은 κ°„λ‹¨ν•œ μ†”λ£¨μ…˜μ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

κ·Έλž˜μ„œ 이 둜거....

  logger.info({ hi: 123 })

...μ½˜μ†”μ—μ„œ μ΄κ²ƒμœΌλ‘œ λ³€ν™˜

info: {
    "hi": 123
}

μ—¬λŸ¬λΆ„μ„ λ„μšΈ 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€ :D μš°λ¦¬κ°€ 항상 "%o"λ₯Ό 두 번 μ‚¬μš©ν–ˆλ‹€λ©΄ λ”μ°ν•©λ‹ˆλ‹€.

쒋은데 μ΄μƒν•˜λ„€μš”. λͺ¨λ“  둜거 μˆ˜μ€€μ— λŒ€ν•΄ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

μ •λ³΄μš©μœΌλ‘œλ§Œ μ‚¬μš©ν•˜λ©΄ 더 μ’‹μŠ΅λ‹ˆλ‹€
```μžλ°”μŠ€ν¬λ¦½νŠΈ
typeof info.message === '객체'
````
λŒ€μ‹ μ—

```μžλ°”μŠ€ν¬λ¦½νŠΈ
info.message.constructor === 개체
````
λ©”μ‹œμ§€κ°€ nullμ΄κ±°λ‚˜ μ •μ˜λ˜μ§€ μ•Šμ€ 경우 였λ₯˜λ₯Ό λ°©μ§€ν•˜κ³  배열이 μ˜¬λ°”λ₯΄κ²Œ ν‘œμ‹œλ©λ‹ˆλ‹€.
(예: [{hi: "456"}]

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰