μ λ λ²μ 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:
κ·Έλ¬λ λͺ¨λ κ²μ λ¬Έμμ΄ννκ³ μ€λ₯μ λν΄ κ·Έλ κ² ν΄μΌ νλ κ²μ κ³¨μΉ μν μΌμ λλ€. μ΄μ λ²μ μμλ κ°λ¨νκΈ° λλ¬Έμ λ΄κ° λ μλͺ»νκ³ μμ΅λκΉ?
+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"}]
κ°μ₯ μ μ©ν λκΈ
μ§μ§νκ², μ΄κ²μ λ€μ΄ κ·Έλ μ΄λμ²λΌ 보μ λλ€. Winston 2λ₯Ό μ¬μ©νλ©΄ λͺ¨λ
console.X
λ₯Όwinston.X
λ‘ λ°κΏ μ μμ΅λλ€. μ κ°μκΈ° λͺ»μκΈ΄ νμ νκ·Έμ λκΉ?