winston
ããŒãžã§ã³ïŒ_node -v
åºåïŒ_v8.11.1ããŒãError
ãªããžã§ã¯ãããã°ã«èšé²ãããšã空ã®ã¡ãã»ãŒãžã衚瀺ãããŸãã
äŸïŒ
const winston = require('winston');
const { createLogger, format, transports } = winston;
const logger = createLogger({
transports: [
new transports.Console()
]
});
let err = new Error('this is a test');
logger.log({level: 'error', message: err});
çµæã®åºåïŒ
% node test.js
{"level":"error","message":{}}
ãŸãïŒ
logger.error(new Error('hello'))
çµæïŒ
{"level":"error"}
ã¡ãã»ãŒãžããŒã«ã¯ãå°ãªããšããšã©ãŒã¡ãã»ãŒãžãå«ãŸããŠãããšæããŸãã ã«ã¹ã¿ã ãã©ãŒããã¿ãè©ŠããŠã¿ããšã info
ããšã©ãŒãªããžã§ã¯ããå«ãŸããŠããªããããã©ããã§åé€ããå¿
èŠããããŸããïŒ
ç§ãã©ã®ããã«æå©ãã§ãããæããŠãã ãã-PRãããªãã¯ããŠå¹žãã§ããã [email protected]
åšãã®éããŸã ããããŸãã
ããã«ã€ããŠã¯ãã¹ãã«ãã¬ããžããããŸãããæããã«ãã£ãšå¿ èŠã§ãã è£ã§äœãèµ·ãã£ãŠããã®ãïŒ
Error
ã€ã³ã¹ã¿ã³ã¹ã¯objectMode
ã¹ããªãŒã ãã€ããã§ãŒã³ã«æ²¿ã£ãŠæž¡ãããŸãLogger
ã®ããã©ã«ãã®åœ¢åŒã¯json
ïŒ logform
json
圢åŒã³ãŒããlogform
ïŒmessage
ãšstack
ã®ããããã£Error
åå ã§ããéå¯ç®JSON.stringify
1ã«ã¯æåŸ
ããŠããªãããšãåºåã«äœããconsole.log(JSON.stringify(new Error('lol nothing here')));
// '{}'
èšèšã®èŠ³ç¹ããã winston@3
ã¯ãããã©ãŒãã³ã¹ãåäžãããããã«ããŸãã«ãã®çš®ã®åé¡ã«å¯ŸããŠformats
ãå°å
¥ããŸããã ããã©ãŒãã³ã¹ã«ã€ããŠèšãã°ãèå³æ·±ãããšã«ã pino
ã¯ããã§äœãé¢çœãããšãããŸãã ããããã解決çã¯ãããã©ã«ãã®json
圢åŒã§asJson
ã«äŒŒããã®ãå®è£
ããããšã§ãã
誰ããç°¡åãªåé¿çãæ¢ããŠãããªããä»ã®ãšãããã¬ãŒã®ãã©ãŒãããã«enumerateErrorFormat
ãå«ããããšãã§ããŸãã æ¥é±ã®3.0.0
åïŒãŸãã¯3.0.1
çŽåŸïŒã«ãããä¿®æ£ã§ããããšãé¡ã£ãŠããŸãã
const winston = require('../');
const { createLogger, format, transports } = winston;
const enumerateErrorFormat = format(info => {
if (info.message instanceof Error) {
info.message = Object.assign({
message: info.message.message,
stack: info.message.stack
}, info.message);
}
if (info instanceof Error) {
return Object.assign({
message: info.message,
stack: info.stack
}, info);
}
return info;
});
const logger = createLogger({
format: format.combine(
enumerateErrorFormat(),
format.json()
),
transports: [
new transports.Console()
]
});
// Error as message
console.log('Run FIRST test...');
logger.log({ level: 'error', message: new Error('FIRST test error') });
// Error as info (one argument)
console.log('\nRun SECOND test...');
const err = new Error('SECOND test error');
err.level = 'info';
logger.info(err);
// Error as info (two arguments);
console.log('\nRun THIRD test...');
logger.log('info', new Error('THIRD test error'));
@indexzero ãç§ã¯ããªãã®åé¿çã«åŸãããšããŸããããããã¯æ©èœããŠããŸããã ãªããªã®ããåç¥ã§ããïŒ
ãã©ãŒããã¿ãŒïŒ
`` ` javascript
const level = settings.debug ? 'debug' : 'info';
const printFormat = winston.format.printf(info =>
$ {info.timestamp}-$ {info.level}ïŒ$ {info.message}`ïŒ;
const enumerateErrorFormat = winston.formatïŒinfo => {
ifïŒinfo.message instanceof ErrorïŒ{
info.message = Object.assignïŒ{
ã¡ãã»ãŒãžïŒinfo.message.messageã
ã¹ã¿ãã¯ïŒinfo.message.stackã
}ãinfo.messageïŒ;
}
ifïŒinfo instanceof ErrorïŒ{
Object.assignïŒ{ãè¿ã
ã¡ãã»ãŒãžïŒinfo.messageã
ã¹ã¿ãã¯ïŒinfo.stackã
}ãæ
å ±ïŒ;
}
æ
å ±ãè¿ã;
}ïŒ;
const consoleLogger = winston.createLoggerïŒ{
ã¬ãã«ã
ãã©ãŒãããïŒwinston.format.timestampïŒïŒã
ãã©ã³ã¹ããŒãïŒ[
new winston.transports.ConsoleïŒ{
ãã©ãŒãããïŒwinston.format.combineïŒ
winston.format.colorizeïŒïŒã
enumerateErrorFormatïŒïŒã
printFormatã
ïŒã
}ïŒã
]ã
}ïŒ;
Code:
javascript
{ãè©ŠããŠãã ãã
//ã³ãŒãã¹ããŒãšã©ãŒ
} catchïŒerrïŒ{
logger.errorïŒerrïŒ;
}
Output:
2018-06-28T21ïŒ17ïŒ25.140Z-ãšã©ãŒïŒæªå®çŸ©
Info object:
javascript
{ã¬ãã«ïŒ '\ u001b [31merror \ u001b [39m'ãã¿ã€ã ã¹ã¿ã³ãïŒ '2018-06-28T21ïŒ17ïŒ25.140Z'ã[èšå·ïŒã¬ãã«ïŒ]ïŒ 'ãšã©ãŒ'}
ãã
ãšã©ãŒãã°ã®ã¡ãã»ãŒãžå±æ§ã¯ã©ãã«ãããŸããïŒ
@sandrocsimasãã¬ãŒãæ©èœãããã«ã¯ããã¬ãŒã®ããã©ã«ãã®ãã©ãŒããã¿ãŒã«enumerateErrorFormaté¢æ°ãæå®ããå¿ èŠãããããšã«æ°ã¥ããŸããã
ãã©ãŒããã¿ãŒ
const consoleLogger = winston.createLogger({
level,
format: winston.format.combine(
winston.format.timestamp(),
enumerateErrorFormat()
),
transports: [
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
printFormat,
),
}),
],
});
ãªããªã®ããŸã ããããªã
@sandrocsimasãšåããã°ãçºçããŠãããšæããŸãã
ãããç§ã®ãã¬ãŒèšå®ã§ãïŒ
logger.js
const winston = require('winston');
const {configure, format} = winston;
const {combine, colorize, timestamp, printf} = format;
const enumerateErrorFormat = format(info => {
if (info.message instanceof Error) {
info.message = Object.assign({
message: info.message.message,
stack: info.message.stack
}, info.message);
}
if (info instanceof Error) {
return Object.assign({
message: info.message,
stack: info.stack
}, info);
}
return info;
});
const myConsoleFormat = printf(info => {
console.log('** Info Object: **');
console.log(info);
console.log('** Winston Output: **');
return `${info.level}: ${info.message}`;
});
winston.configure({
transports: [
new winston.transports.Console({
format: combine(
colorize(),
enumerateErrorFormat(),
myConsoleFormat
),
})
]
});
ãã®ã³ãŒããããã¯ã§ãã¹ããããšã次ã®ããã«ãªããŸãã
ãã¹ãA
const logger = require('winston');
try {
throw(new Error());
} catch (err) {
logger.error(err);
}
new Error()
ã¡ãã»ãŒãžå€ãå«ãŸããŠããªãå Žåã次ã®åºåãåŸãããŸãã
åºåA
** Info Object: **
{ message:
{ message: '',
stack: 'Error\n at Object.<anonymous> (app.js:21:9)\n at Module._compile (module.js:652:30)\n at Object.Module._extensions..js (module.js:663:10)\n at Module.load (module.js:565:32)\n at tryModuleLoad (module.js:505:12)\n at Function.Module._load (module.js:497:3)\n at Module.require (module.js:596:17)\n at require (internal/module.js:11:18)\n at Object.<anonymous> (server.js:11:13)\n at Module._compile (module.js:652:30)' },
level: '\u001b[31merror\u001b[39m',
[Symbol(level)]: 'error',
[Symbol(message)]: '{"message":{},"level":"error"}' }
** Winston Output: **
error: [object Object]
error: [object Object]
ã¯ãŸãã«ç§ãæåŸ
ãããã®ã§ã
ãã ãããã®ã³ãŒããããã¯ã§ãã¹ããããšã次ã®ããã«ãªããŸãã
ãã¹ãB
const logger = require('winston');
try {
throw(new Error('This causes error: undefined'));
} catch (err) {
logger.error(err);
}
new Error()
ã¡ãã»ãŒãžå€ãå«ãŸããŠããå Žåã次ã®åºåãåŸãããŸãã
åºåB
** Info Object: **
{ level: '\u001b[31merror\u001b[39m',
[Symbol(level)]: 'error',
[Symbol(message)]: '{"level":"error"}' }
** Winston Output: **
error: undefined
ã芧ã®ãšããã @ sandrocsimasãšåãerror: undefined
ãååŸããŸãã error: [object Object]
ãæã«å
¥ãããšæã£ãŠããŸãã
ãã®ã³ãŒããããã¯ãè©ŠããŠã¿ããšã次ã®ããšã«æ³šæããŠãã ããã
ãã¹ãC
const logger = require('winston');
try {
throw(new Error('This should work'));
} catch (err) {
logger.log({level: 'error', message: err});
}
logger.log
代ããã«logger.error
ã䜿çšãããšãäžèšã®åºåAãšåãåºåãåŸãããŸãã
ç§ã¯åãåé¡ãæ±ããŠããŸãã ç§ã¯ãŠã£ã³ã¹ãã³ãåããŠã§ãã @indexzeroãœãªã¥ãŒã·ã§ã³ãè©Šã
@ nvtuan305 ã ãŸãããããããšãå°ãç·šéããŸãããïŒ ãããããªãããµã³ãã«ã³ãŒããæäŸã§ããŸããïŒ åœŒã®ã³ãŒãã¯ã logger.log({level: ____, message: err});
ã䜿çšããŠããå Žåã¯æ©èœããã¯ãã§ãã logger.info
ã logger.error
ããŸãã¯ãã®ä»ã®logger.<level>
ãŠããå Žåã¯æ©èœããŸããã ã ããã¯äžèšã§æå®ãããã°ã§ãããä»åŸã®ãªãªãŒã¹ã§ä¿®æ£ãããã¯ãã§ãã
ç§ã¯äœãã足ããªãã®ã§ããããããããšãconsole.log / error / warnããç°¡åã«åŸãããã®ãšåãåºåãåŸãã®ã¯å®å šãªé çã®çš®ïŒãŸãã¯äžå¯èœã§ãããããŸããïŒïŒã§ããïŒ
try {
// ...
throw new Error('foo');
} catch (e) {
console.error('Caught error:', e); // convenient, informative
logger.error('Caught error:', e); // nope, the second parameter is something else (couldn't find docs)
logger.error(`Caught error: ${e}`); // stack lost
logger.error(`Caught error: ${JSON.stringify(e)}`); // Caught error: {}
}
ãšåãåºåãååŸããããã®åçã®ãŠã£ã³ã¹ãã³ã³ãŒãã¯äœã§ãã
console.error('Caught error:', error);
ïŒ
ãŸãããã¬ãŒãªããžã§ã¯ãã®ã³ã³ãããšã³ã¹ã¡ãœããã«ãã£ãŠååŸããããã©ã¡ãŒã¿ãŒã®ããã¥ã¡ã³ãã¯ã©ãã«ãããŸããïŒ
@dandv
logger.error('Caught error:', e);
console.log()
ãšã¯ç°ãªãããŠã£ã³ã¹ãã³ã®logger.<level>(message)
ã¯ã¡ãã»ãŒãžãšåŒã°ãããã©ã¡ãŒã¿ã1ã€ã ãåããããããã¯æ©èœããŸããã ãã®ã¡ãã»ãŒãžãã©ã¡ãŒã¿ã¯ãªããžã§ã¯ããŸãã¯æååã®ããããã§ãïŒç§ãééã£ãŠããå Žåã¯èª°ããç§ãä¿®æ£ããŸãããããã¯ç§ã®ç解ã§ãïŒã
logger.log({level: <level>, message: <message>})
ã䜿çšã§ããããšã«æ³šæããŠãã ããã ãããã®2ã€ã®é¢æ°ã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ãã®ãã®éšåãèªãããšããå§ãããŸãïŒãã°ã¬ãã«ã®WinstonDocs ã ãã®ã³ã°ã¬ãã«ã®äœ¿çšãå¿
ããèªã¿ãã ãã
logger.error(`Caught error: ${e}`);
ãªããããã¹ã¿ãã¯ãåºåããªãã®ããæ確ã«èšãããšã¯ã§ããŸããããããããŠã£ã³ã¹ãã³ã®åé¡ã§ã¯ãªãããšã¯ç¥ã£ãŠããŸãã console.log(`Caught error: ${e}`)
ãè©ŠããŠã¿ããšãã¹ã¿ãã¯ãå«ãŸããŠããŸããã ç§ã¯ãã³ãã¬ãŒããªãã©ã«ãããŸã䜿çšããŠããªãã®ã§ããã³ãã¬ãŒããªãã©ã«ããªããžã§ã¯ãã§ããŸãæ©èœããªãããjavascriptã®console.logããªããžã§ã¯ãããšã©ãŒãªããžã§ã¯ããšããŠèªèããã¡ãã»ãŒãžããããã£ã®ã¿ãåºåããŸãã ãããç§ã®äžçªã®æšæž¬ã§ãã
logger.error(`Caught error: ${JSON.stringify(e)}`)
ããã¯ããã®ãã°ã¹ã¬ããã®æ žå¿ã«ãªããŸãã ãŸããJavaScriptã«é¢ããæè¡çãªè©³çŽ°ãç解ããå¿
èŠããããŸãã console.log(`Caught error: ${JSON.stringify(e)}`)
ãè©ŠããŠã¿ããšãåãåºåCaught error: {}
ãåŸãããããšã«æ³šæããŠãã ããã @indexzeroã説æããããã«ïŒ
message
ãšstack
ç¹æ§ã«Error
åå ãšãªãéåæãããŠããJSON.stringify
åºåã«1ãæåŸ ããŠããªãããšãäœããã
åºæ¬çã«ã message
ããããã£ãšstack
ããããã£ã¯åæã§ããªãããã JSON.stringify
ã¯ãããã®ããããã£ãã¹ããããã空ã®ãªããžã§ã¯ã{}
ãŸãã åæå¯èœæ§ãããããç解ããã«ã¯ããã®åæå¯èœæ§ãšããããã£ã®æææš©ãèªãããšããå§ãã
幞ããªããšã«ãwinston 3.0ã®èšèšæ¹æ³ïŒwinstonããŒã ãžã®å°éå ·ïŒã«ããã@ indexzeroãæäŸãããã®åé¿çããããŸãã 説æãæäŒããŸãã ãŸãã次ã®é¢æ°ãäœæããŸãã
const enumerateErrorFormat = format(info => {
if (info.message instanceof Error) {
info.message = Object.assign({
message: info.message.message,
stack: info.message.stack
}, info.message);
}
if (info instanceof Error) {
return Object.assign({
message: info.message,
stack: info.stack
}, info);
}
return info;
});
ããã¥ã¡ã³ãStreamsãobjectModeãããã³infoãªããžã§ã¯ããããinfoãªããžã§ã¯ãã«ã¯info.level
ãšinfo.message
2ã€ã®ããããã£ããããŸãã ãã®info.message
ããã¯ããªããæž¡ããããã¹ãŠã®å Žåããšã©ãŒãªããžã§ã¯ãã§ããããããã£ãæã
ã¯æ°ãããªããžã§ã¯ããäœæã ããmessage.stack
ãšmessage.message
ïŒãšèããŠError.stack
ãšError.message
ïŒãåæå¯èœã«ãªãããã®ãšã©ãŒãªããžã§ã¯ãã«ã¢ã¿ãããããå¯èœæ§ã®ããä»ã®ããããã£ãå«ãŸããŸãã
次ã«ãäžèšã®enumerateErrorFormat()
é¢æ°ã䜿çšãããã®ãã¬ãŒãäœæããŸãã
const logger = createLogger({
format: format.combine(
enumerateErrorFormat(),
format.json()
),
transports: [
new transports.Console()
]
});
ããã¯ãæž¡ããmessage
ãåãåããããããšã©ãŒãªããžã§ã¯ãã§ãããã©ããã確èªããŸãã ããã§ããã°ãåæã®åé¡ãä¿®æ£ããŸãã 次ã«ãã¡ãã»ãŒãžãformat.json
ã«æž¡ããŸããããã«ããããªããžã§ã¯ãïŒãšã©ãŒãã©ããïŒãæåååãããŸãã ããããªããžã§ã¯ãã§ãªãå Žåãããã¯æååã§ããã format.json
Effectivleyã¯äœãããŸããããããŠããªãã¯å®¶ã«åž°ããŸããïŒ
ããã§ãããšã©ãŒãªããžã§ã¯ãã¯äžè¬çã«ãã°ã«èšé²ãããããããã®enumerateErrorFormat
ãäœæããå¿
èŠããªãå Žåã¯äŸ¿å©ã§ãã ç§ãç解ããŠããããã«ãwinstonããŒã ã¯ãåŸã®ããŒãžã§ã³ã§ãªãªãŒã¹ãããä¿®æ£ã«åãçµãã§ããŸãã
ããã€ãã®æåŸã®ã¡ã¢ã ããã¯ãã¡ãã»ãŒãžããšã©ãŒãªããžã§ã¯ãã§ããlogger.log({level: <level>, message: <message>})
ã䜿çšããå Žåã«ã®ã¿æ©èœããŸãã äŸïŒ
try {
throw(new Error('This should work'));
} catch (err) {
logger.log({level: 'error', message: err});
}
äžèšã®ä»ã®æçš¿ã§èª¬æããããã«ãwinstonã«ã¯ãã®ã³ãŒããæ©èœããªãå¥ã®ãã°ããããŸãã
try {
throw(new Error('This will not work'));
} catch (err) {
logger.error(err);
}
logger.error(err)
ã䜿çšãããšãäœããã®çç±ã§info.message
ããããã£ãå®çŸ©ãããŸããã ããŸãããã°ã @ indexzeroã¯ããã
@ SamuelMaddox17 @indexzeroããããšãããããŸãïŒ logger.log({level: 'error', message: err});
ã䜿ã£ãŠã¿ãŸããããããŸããããŸãã
ããã¯logger.errorãªã©ã§ä¿®æ£ã§ããŸããïŒ
logger.log
ã䜿çšããã®ã¯é¢åã§åé·ã§ããç¹ã«ã logger.error
ã䜿çšãããšãè€æ°ã®åŒæ°ãç°¡åã«è¿œå ã§ããããã§ãã
ãããç§ã¯ããã調ã¹ãŠããŸãã @indexzero ïŒããã§ããenumerateErrorFormat
æ©èœãjson
ãã©ãŒããã¿ãŒã«è¿œå ããã®ãæåã®ã¢ã€ãã¢ã ãšæããŸããïŒ ç§ãã¡ã¯å¥ã«æ°ã«ããå¿
èŠããããŸããã«ã€ããŠã®å Žåã¯meta
ããError
ã ãã§ã¯ãªãã object
ïŒç§ãã¡ã¯ãŸãããã®ãããªå Žåã«å¯ŸåŠããŠããªãå Žåã人ã
ã¯æå¥ãèšãã ããæšæž¬ããŠããŸãïŒïŒ ïŒ ãŸããç§ã¯master
ã䜿çšããŠããŸãããäžèšã®@indexzero / @ SamuelMaddox17ã«ãããœãªã¥ãŒã·ã§ã³ã§ã¯ã logger.error
æ©èœããŠããããã§ãã
const winston = require('winston');
const format = winston.format;
const enumerateErrorFormat = format(info => {
if (info.message instanceof Error) {
info.message = Object.assign({
message: info.message.message,
stack: info.message.stack
}, info.message);
}
if (info instanceof Error) {
return Object.assign({
message: info.message,
stack: info.stack
}, info);
}
return info;
});
const logger = winston.createLogger({
level: 'debug',
format: format.combine(
enumerateErrorFormat(),
format.json()
),
transports: [
new winston.transports.Console(),
],
});
logger.error(new Error('whatever'));
ããã«èª¿æ»ãããšãããäžèšã§èª¬æããlogger.error
åé¡ã¯ãããã©ã«ãã®ãã¬ãŒã䜿çšããå Žåã®åé¡ã«ãããªãããã§ãã @DABH ãç§ã¯ããªãã®ã³ãŒããè©ŠããŸããããããŠããã¯ç§ã®ããã«åããŸãããããç§ããããããã©ã«ãã®ãã¬ãŒã«åãæ¿ãããšããããã¯åããŸããïŒ
const winston = require('winston');
const format = winston.format;
const enumerateErrorFormat = format(info => {
if (info.message instanceof Error) {
info.message = Object.assign({
message: info.message.message,
stack: info.message.stack
}, info.message);
}
if (info instanceof Error) {
return Object.assign({
message: info.message,
stack: info.stack
}, info);
}
return info;
});
winston.configure({
transports: [
new winston.transports.Console({
level: 'debug',
format: format.combine(
enumerateErrorFormat(),
format.json()
),
})
]
});
winston.error(new Error('whatever'));
次ã«ã enumerateErrorFormat
ãjson圢åŒã«è¿œå ããå¿
èŠãããããšã«åæããŸãã ãããŠãããªãã¯ããããmeta
ã«ã€ããŠãæ£ããã§ãããã
æåŸã«ã @ DABHã§æå®ãããã³ãŒãäŸã«ãããã¹ã¿ãã¯ãããããã«å°å·ããããªãããšã«æ³šæããŠãã ããã å°ãªããšãmacOSHighSierraãå®è¡ããŠããç§ã®ãã·ã³ã§ã¯ã ããã¯ç§ã«ãšã£ãŠãããã©ã®ããã«èŠãããã§ãïŒ
{"message":"whatever","stack":"Error: whatever\n at Object.<anonymous> (/Users/samuelmaddox/Desktop/winston-test/index.js:33:14)\n at Module._compile (internal/modules/cjs/loader.js:689:30)\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)\n at Module.load (internal/modules/cjs/loader.js:599:32)\n at tryModuleLoad (internal/modules/cjs/loader.js:538:12)\n at Function.Module._load (internal/modules/cjs/loader.js:530:3)\n at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)\n at startup (internal/bootstrap/node.js:266:19)\n at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)","level":"error"}
ã芧ã®ãšãããto JSONé¢æ°ã䜿çšããŠãšã©ãŒãåºåããå Žåãæ¹è¡æå\n
ã¯å®éã®æ°ããè¡ãäœæããŸããã ããã¯ããªããžã§ã¯ããååŸããŠJSONã«å€æãããšãã«äºæ³ãããåäœã§ãããå°ãªããšãã³ã³ãœãŒã«ã«ãã°ãèšé²ãããšãã¯ããã¬ãŒã«å®éã«å¿
èŠãªåäœã§ã¯ãªãå¯èœæ§ããããŸãã
ãã®@DABHã詳ãã調ã¹ãŠããã ãããããšãããããŸã
åèãŸã§ã«ãããã¯ç§ãããã§å°ãéãã åŸã«åŸããšããã§ãïŒ
import winston from 'winston';
const format = winston.format;
const printNice = format.printf(info => {
const {level, message} = info;
return `Logging Level: ${level} - Logging Message: ${message}`;
});
const enumerateErrorFormat = format(info => {
if (info.message instanceof Error) {
info.message = Object.assign({
message: `${info.message.message}\n============\n${info.message.stack}`
}, info.message);
}
if (info instanceof Error) {
return Object.assign({
message: `${info.message}\n============\n${info.stack}`
}, info);
}
return info;
});
const logger = winston.createLogger({
format: format.combine(
enumerateErrorFormat(),
format.json()
),
transports: [
new winston.transports.Console({
format: format.combine(
format.colorize(),
printNice,
),
})
]
});
export default logger;
ãã®åé¡ã®åå ã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
ç§ãã¡ã¯ééããªããã®ãã©ãŒã ãwinston2.xã§åé¡ãªã䜿çšããŸããã winston.err('some message', err);
ãšwinston.error(err)
äžèšã®enumerateErrorFormat
winston.error(err)
ä¿®æ£ããŸããã2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠerrã䜿çšãããŠãŒã¹ã±ãŒã¹ã¯ä¿®æ£ããŸããã
@ SamuelMaddox17
logger.logïŒ{ã¬ãã«ïŒ____ãã¡ãã»ãŒãžïŒãšã©ãŒ}ïŒ;
ããã¯thxã§åäœããŸã
ããŠãç§ã¯äœããçºèŠããŸããã 9æ3æ¥ããã®ç§ã®ã³ã¡ã³ãã¯ééã£ãŠããŸãã ããã¯ããã©ã«ãã®ãã¬ãŒã§ã¯åé¡ãããŸããã ããã¯ã level
ããã³/ãŸãã¯format
ãå®çŸ©ããå Žæã®åé¡ã§ãã @DABHã¯ããã«ããªãã®å€ãã³ãŒãã§ãïŒ
const winston = require('winston');
const format = winston.format;
const enumerateErrorFormat = format(info => {
if (info.message instanceof Error) {
info.message = Object.assign({
message: info.message.message,
stack: info.message.stack
}, info.message);
}
if (info instanceof Error) {
return Object.assign({
message: info.message,
stack: info.stack
}, info);
}
return info;
});
const logger = winston.createLogger({
level: 'debug',
format: format.combine(
enumerateErrorFormat(),
format.json()
),
transports: [
new winston.transports.Console(),
],
});
logger.error(new Error('whatever'));
ãããåé€ããå ŽåïŒ
const logger = winston.createLogger({
level: 'debug',
format: format.combine(
enumerateErrorFormat(),
format.json()
),
transports: [
new winston.transports.Console(),
],
});
ãããŠãããããã«çœ®ãæããŠãã ããïŒ
const logger = winston.createLogger({
transports: [
new winston.transports.Console({
level: 'debug',
format: format.combine(
enumerateErrorFormat(),
format.json()
),
}),
],
});
次ã«ã info.message === undefined
åé¡ãçºçããŸãã åãã©ã³ã¹ããŒãã®ã¬ãã«ãšåœ¢åŒãæå®ããŠãåé¡ãªããšæããŸãã ããã¯Winston2.0ã§èš±å¯ãããŠãããšã»ãŒç¢ºä¿¡ããŠããŸãã
ç°¡åã«å®è¡ããŠãã¹ãã§ããããã«ãã³ãŒããå€æŽããã³ãŒããµã³ãã«ã次ã«ç€ºããŸãã
const winston = require('winston');
const format = winston.format;
const enumerateErrorFormat = format(info => {
if (info.message instanceof Error) {
info.message = Object.assign({
message: info.message.message,
stack: info.message.stack
}, info.message);
}
if (info instanceof Error) {
return Object.assign({
message: info.message,
stack: info.stack
}, info);
}
return info;
});
const logger = winston.createLogger({
transports: [
new winston.transports.Console({
level: 'debug',
format: format.combine(
enumerateErrorFormat(),
format.json()
),
}),
],
});
logger.error(new Error('whatever'));
ããŸãããã°ããããåé¡ã®æ ¹æ¬ã«å°éããã®ã«åœ¹ç«ã¡ãŸãã
https://github.com/winstonjs/winston/pull/1527ãäœæããŸãã
ããã¯ãã¹ãŠã®ãªãã·ã§ã³ãã«ããŒããŸãã ãã ããäžéšã®ãã¹ãã¯å€±æãããããä»ã¯éããŠããŸãã ä¿®æ£ãããã°å€±æã¯äºæ³ãããŸããããã¹ããä¿®æ£/åé€ããããã®é»è©±ããããç«å Žã«ã¯ãªããšæããŸãã
ãã«ãã®å€±æã¯https://travis-ci.org/winstonjs/winston/jobs/453012141ã«ããããã¹ãã³ãŒããèªãã ãšãã«ãã¹ãã倱æããçç±ã¯æããã§ãã
https://github.com/winstonjs/winston/blob/c42ab7fdc51b88db180a7dd90c52ce04ddd4e054/test/logger.test.js#L668
èãïŒ
åé¡ã¯ãã®è¡ã«ãããšæããŸã
const info =ïŒmsg && !(msg instanceof Error)
&& msg.message && msgïŒ|| {{
ã¡ãã»ãŒãžïŒmsg
};
@crowleymãææããŠããããã«ãinstanceofErrorã®ãã§ãã¯ãè¿œå ãããšåé¡ã解決ããããã§ã
ãŸã ãããæ±ã£ãŠãã人ã®ããã«ãããã¯ç§ãæãã€ããåé¿çã®ãã©ãŒããã¿ãŒã§ãïŒç§ã®logger.jsã¢ãžã¥ãŒã«ã®ã¹ããããïŒïŒ
const { format, transports, createLogger } = require("winston");
const { combine, timestamp, colorize, printf } = format;
function devFormat() {
const formatMessage = info => `${info.level}: ${info.timestamp} ${info.message}`;
const formatError = info => `${info.level}: ${info.timestamp}\n\n${info.stack}\n`;
const format = info => info instanceof Error ? formatError(info) : formatMessage(info);
return combine(timestamp(), printf(format));
}
äœããã®çç±ã§ã logger.error(new Error("hello"))
ã¯ããã©ãŒããã¿ãŒãwinston.createLogger
ð€ã§ã°ããŒãã«ã«å®çŸ©ãããã©ãŒããã¿ãŒã®info
ã§Errorãªããžã§ã¯ããååŸããå Žåã«ã®ã¿æ©èœããŸãã
ãã©ã³ã¹ããŒãããšã«ãã©ãŒããã¿ãå®çŸ©ããå Žåã¯ã logger.log({level: "error", message: new Error("FAILED")})
ã䜿çšãã info
ã§ã¯ãªãinfo.message
ãä»ããŠErrorãªããžã§ã¯ããåŠçããŠErrorãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã
ãã©ã³ã¹ããŒããªãã·ã§ã³ã§ãã©ãŒããããã£ãŒã«ããèšå®ãããšãã«ãã°ããããšæããŸããïŒ
ãããã¯ç§ã®2ã»ã³ãã§ãããç§ã«ãšã£ãŠã¯ããŸããããŸãããç§ã¯WinstonãåããŠäœ¿çšããJavaScriptã«æ £ããŠããªãã®ã§ãäœãåŒçšããªãã§ãã ããã
ç§ã®ã¢ãããŒãã¯æ ¹æ¬çãªåå ãä¿®æ£ããè©Šã¿ã§ããã ãããããªããžããªã®ææè ããã¯ããŸã泚ç®ãããŠããŸãã...
ãããç§ã¯ãããç解ããŠããŸãã ç§ã¯ãŠã£ã³ã¹ãã³ã«äžæ £ãã§ãããããããã誀ã£ãŠå©çšãããããã®èåŸã«ããæŠå¿µããŸã ååã«ç解ããŠããªãã®ã§ã¯ãªãããšæã£ãã®ã§ãæåéããããç解ãã
ãããã幞éãªããšã«ãç§ã¯å¥ã®æ¹æ³ã§ç§ã瀺ããããã€ãã®ã¹ã¬ããïŒãããå«ãïŒã«åºããããŸããã ããŸãããã°ã圌ãã¯ãããä¿®æ£ããã®ã§ãåé¿çã䜿ãç¶ããå¿ èŠã¯ãããŸããã
ããã¯wintson-transport
ãåå ã§ããå¯èœæ§ããããŸããåé¡ã«ã€ããŠã¯https://github.com/winstonjs/winston-transport/issues/31ãã ãã ããã PRã®å Žåã¯
ãšã©ãŒãªããžã§ã¯ãã®çŽæ¥ãã®ã³ã°ã¯ããããã®åæã§ããªãããããã£ã®ããã«åžžã«æ··ä¹±ããŸãã å人çã«ã¯ããã¯æªãç¿æ £ã ãšæããŸãããã³ãã¥ããã£ã®ååãªäººã ãããããµããŒãããªããã°ãªããªãèŠä»¶ãšããŠããã«ã€ããŠåºå·ããŠããŸãã
ãã®ãããªåäœããµããŒããã圢åŒãšããŠhttps://github.com/winstonjs/logform/pull/59ãæ¡çšããããšãæ€èšããŠã.splat()
ãšåæ§ïŒ
@indexzeroåæããåŸåããããŸãããè€æ°ã®Error
ã¿ã€ããç°ãªãæ¹æ³ã§è¡šç€ºããå¿
èŠããããWinston 2.xãç®±ããåºããŠèš±å¯ãããã®ã§ããã®æ
£è¡ãšæŠã£ãŠãã ããã
ãããã£ãŠãenumerateErrorFormatã«å¯ŸããŠææ¡ããããœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸããããã©ãŒãããlogger.error('some message', err)
ãµããŒãããŠããŸããã info.message
ãinfo
ãinstanceof Error
ã§ãã ãŸãããã®ãœãªã¥ãŒã·ã§ã³ã®å¥ã®åé¡ãææããããšæããŸãã çŸåšã superagent
ããè¿ããããšã©ãŒããã°ã«èšé²ããŠããŸã
try {
const response = await request
.get('https://some/endpoint')
.set('Authorization', bearerToken);
logger.info('successfully received response');
return response.body;
} catch (e) {
logger.error('An error was caught while getting programs');
logger.error(e); // <<< THE ERROR LOG
}
Object.assignã䜿çšããã ãã§ãã¹ã¿ãã¯ãå·åŽãããšã¡ãã»ãŒãžãèšå®ãããŸãã ãã ãããšã©ãŒã®äžéšã§ãã£ããã®ä»ã®æ
å ±ããã°ã«èšé²ãããŸãã ããã¯ããšã©ãŒã«Authorization Headers
ïŒãã®å Žåã¯ãšã©ãŒãªããžã§ã¯ãã®äžéšãšããŠå«ãŸããïŒãªã©ã®æ©å¯ããŒã¿ãå«ãŸããŠããå Žåã«éåžžã«å±éºã§ãã
ããããããªãã¯èšããããããŸããã ããã¯ãŠã£ã³ã¹ãã³ã®ããã§ã¯ãªããã¹ãŒããŒãšãŒãžã§ã³ãããã®ããŒã¿ããšã©ãŒã«è¿œå ããã®ã¯ãŠã£ã³ã¹ãã³ã®ããã§ã¯ãããŸããã åæããïŒ ãã ãããã¹ãŠãinfo
ãªããžã§ã¯ãã«ãã©ããã«ä¿åããããããå€ãæ
å ±ãä¿æããæ®ããäžæžãããªãããšãéåžžã«å°é£ã«ãªããŸãã
logger.errorã䜿çšããå Žåã¯ãã»ãŒäŸ¿å©ã§ãã 2çªç®ã®ãã©ã¡ãŒã¿ããšã©ãŒã§ãããšæ³å®ãããããinfo
ãªããžã§ã¯ãã«info.error
ãšããŠé
眮ããéã®æ¹æ³ã§ãã°ãèšé²ãããšãã€ã³ã¿ãŒãã§ã€ã¹ã¯{ level: "error", error: YOUR ERROR OBJECT}
ç§ã¯æ¬åœã«ããã§åŸãåããŸãããæ°ããã€ã³ã¿ãŒãã§ãŒã¹ã¯ééããªãå°ãã€ã©ã€ã©ããŠããŸãïŒãã¹ãŠã®æ å ±ïŒã
ç§ãèšã£ãŠãããã€ã³ãã詳ãã説æããããã«ã logger.error( e )
ãšä»®å®ããŸããããã§ãeã¯åãšã©ãŒã§ãã
次ã«ãã³ãŒãã§winstonã次ã®ããã«æ§æããŸãã
winston.configure({
format: combine(
timestamp(),
enumerateErrorFormat(),
...
),
});
ã¿ã€ã ã¹ã¿ã³ãããšã©ãŒãªããžã§ã¯ãã«æŒã蟌ãŸããŠããŸãð±ã ããã¯æ¬åœã«æå³ããããŸããïŒ èããŠã¿ãŠãã ãããéä¿¡ãããšã©ãŒãªããžã§ã¯ãã¯ãæ°ãããããã©ãåçã«ååŸããŠããŸããã¿ã€ã ã¹ã¿ã³ãã
ãã®åé¡ã®å šäœçãªæåã®è§£æ±ºçã¯ã次ã®æ§æããµããŒãããããšã ãšæããŸã
logger.error('An error occurred when doing something important', { error: e } );
次ã«ãå éšçã«ããšã©ãŒãã£ãŒã«ããæ€çŽ¢ãããšã©ãŒãã©ãŒããã¿ãäœæã§ããŸãã
ãã®äººã ã®ææ°æ å ±ïŒ
logform
圢åŒã®https ïŒ ãããçž«ãäžããŠãæ°æ¥ä»¥å
ã«åºè·ããããšãæãã§ããŸãã [email protected]
ãã©ãã«ãŒã®æåŸãã2çªç®ã®å·ã§ã
ããŠãã£ã®çããâhttps ïŒ//github.com/winstonjs/winston/pull/1562ããã§ãã¯ããŠ3.2.0
ãªãªãŒã¹ãã§ãã¯ãªã¹ãã®æåŸã®é
ç®ã ã£ãã®ã§ãPRãçž«ãä»ãããããããªãªãŒã¹ã§ããããã«ãªããŸãã
ä¿®æ£ãå ¬éããããŸã§ã次ã®åé¿çã䜿çšããŸãã
logger.error = item => {
logger.log({ level: 'error', message: item instanceof Error ? item.stack : item });
};
ç§ã¯ææ°ã®ãŠã£ã³ã¹ãã³ïŒ3.2.1ïŒã䜿çšããŠããŸããã logger.error
ãšã©ãŒãæž¡ããšããŸã undefined
åãåããŸãã
@ezzeã«ã¯åªãããœãªã¥ãŒã·ã§ã³ããããŸããããã¹ã¿ãã¯ãã¬ãŒã¹ã¯æ°ããè¡ã«åŒ·å¶ãããŸãã ããã¯å°ãå€æŽãããããŒãžã§ã³ã§ã1è¡ã«ãŸãšããããŠããŸãïŒãã°ãã¡ã€ã«ã®åçŽãªgrepã«ãã£ãŠãã£ãããããŸãïŒ
logger.error = item => {
const message = item instanceof Error
? item.stack.replace('\n', '').replace(' ', ' - trace: ')
: item;
logger.log({ level: 'error', message });
};
åºåä»ã<Error message> - trace: <stack trace>
ææ°ã®ãŠã£ã³ã¹ãã³ã§ãããè¡ãç°¡åãªæ¹æ³ãããå Žåã¯ã@ indexzeroãŸã§ãç¥ãããã ããã ç§ã¯ã©ã€ãã©ãªãåããŠäœ¿çšããããã¥ã¡ã³ãããã©ããŒããŠããŸãã
ããªããPRã«æçš¿ãããªã³ã¯ãèŠããšããã§ãã ããã¯ããšã©ãŒãlogger.error
ã«æž¡ãã«ã¯ã¡ãã»ãŒãžæååãå¿
èŠã§ããã次ã«ãšã©ãŒãå¿
èŠã§ããããšãæå³ããŸããïŒ
try {
someThing();
} catch(error) {
logger.error(error); // what I would like to do
logger.error('special message', error); // what I believe is required?
}
@ the-vampiireãã®ã¹ã¬ããã話ããŠãã2ã€ã®åé¡ãçºçããŸããã æåã¯å
ã®ãã¹ã¿ãŒãæèµ·ãããã®ã§ããã2çªç®ã¯ç§ãæèµ·ããåé¡ã§ãããããªãã®åé¡ãšåãã§ãã 圌ãã¯å
ã®ãã¹ã¿ãŒã®åé¡ãä¿®æ£ããã ãã ãšæããŸãã ç§ã¯ããã«ãã§ãã¯ããŠç¢ºèªãããã®å Žåã¯æ°ããåé¡ãéãããšãæå³ããŠããŸããã æ®å¿µãªãããæ·±ãæœãæéããããŸããã§ããã ãããŸã§ã®éã logger.log({level: 'error', message: err});
ã䜿çšããå ŽåïŒ err
ã¯ãšã©ãŒãªããžã§ã¯ãïŒãããã¯æ©èœããŸãã
ãŸã ãã®åé¡ãããããããç解ããããã«å€ãã®æéã倱ããŸããã@ the-vampiireã®è§£æ±ºçã¯ããŸãæ©èœããŸãã
ãªããã®ãã±ããã¯éãŸã£ãŠããã®ã§ããïŒ
logger.errorããªãŒããŒã©ã€ãããããšã¯ãerrorïŒïŒã«åäžã®åŒæ°ãšããŠæž¡ãããErrorãªããžã§ã¯ãã«ã¿ã€ã ã¹ã¿ã³ãããããã£ãè¿œå ããªãããããããŸã§ã®ãšããæåã®è§£æ±ºçã§ãã ã»ãšãã©ã®äººã¯ãErrorãªããžã§ã¯ããäžå€ã§ããããšãæåŸ ããŠããå¯èœæ§ããããŸãã logger.infoããã®ä»ãã¹ãŠã®ã¬ãã«é¢é£ã®ã¡ãœããããªãŒããŒã©ã€ãããªããšãæåŸ ã©ããã«æ©èœããªãã®ã¯é©ãã§ãã ç¹°ãè¿ããŸããããªããžã§ã¯ããå€æŽããå¿ èŠããªãéãããã®ã¿ã€ãã«é¢ä¿ãªããWinstonãã¬ãŒã¡ãœããã«çŽæ¥éä¿¡ããªãã§ãã ããã
ãã®æ©èœã¯[email protected]以éãµããŒããããŠã
䜿çšäŸïŒ
const winston = require('winston');
const { transports, format } = winston;
const print = format.printf((info) => {
const log = `${info.level}: ${info.message}`;
return info.stack
? `${log}\n${info.stack}`
: log;
});
const logger = winston.createLogger({
level: 'debug',
format: format.combine(
format.errors({ stack: true }),
print,
),
transports: [new transports.Console()],
});
const error = new Error('Ooops');
logger.error(error);
logger.error('An error occurred:', error);
cc @ HRK44 @ the-vampiire
ç§ããŸã åé¡ã«ã¶ã€ãã£ãŠããŸãã
logger.error(error);
ãããªãšã©ãŒãåŒã³åºããšã undefined
ãã衚瀺ãããŸããã
logger.error('Something went wrong', error)
ããã«åŒã³åºãå Žåã«ã®ã¿ãå®å
šãªãšã©ãŒãçºçãã解æã§ããŸãã
ç§ããŸã åé¡ã«ã¶ã€ãã£ãŠããŸãã
logger.error(error);
ãããªãšã©ãŒãåŒã³åºããšãundefined
ãã衚瀺ãããŸããã
logger.error('Something went wrong', error)
ããã«åŒã³åºãå Žåã«ã®ã¿ãå®å šãªãšã©ãŒãçºçãã解æã§ããŸãã
ãããè¿œå ããŸãããïŒ
format.errors({ stack: true })
ã¯ããããã§ãåãåé¡ã§ãã èŠæšã§åçŸããŠã¿ãŸãã
@ OBrown92ä»æ¥ãåãåé¡ã«çŽé¢ããŠããŸãã format.errors({ stack: true })
ããã©ã³ã¹ããŒãã§ã¯ãªããã¬ãŒã«é©çšãããã°ãæ©èœããããšã確èªã§ããŸãã ãã®å Žåã logger.error(error);
ãšlogger.error('Something went wrong', error)
äž¡æ¹ã䜿çšã§ããŸãã ãã ããéžæãããã©ã³ã¹ããŒãã«format.errors({ stack: true })
ãé©çšããããšãããšãåé¡ãçºçããŸãã ãã®å Žåã logger.error(error);
ã«å¯ŸããŠundefined
ãååŸããŸããã logger.error('Something went wrong', error)
ã¯æ£ããæ©èœããŸãã
äºæãããåäœãªã®ããã°ãªã®ãã¯ããããŸããããåå ãèŠã€ããã®ã«å€ãã®æéãè²»ãããã®ã§ãä¿®æ£ããããããã¥ã¡ã³ãã®ã©ããã«ãã®ããšãèšèŒããŠãã ããã ããã¯æ¬åœã«åœ¹ã«ç«ã¡ãŸãã
ãšã«ããããã®çŽ æŽããããããžã§ã¯ãã§ã®ããªãã®ä»äºã«ãšãŠãæè¬ããŠããŸãã
ç§ã¯åãåé¡ã«çŽé¢ããŠããã®ã§ããã®ããã±ãŒãžutils-deep-cloneãäœæããŸããã èŠãŠã¿ãªã
format.errors is not a function
...ãŸãããã¯é©ãã§ãã
@holmberd
winstonããã±ãŒãžãããã©ãŒããããã€ã³ããŒãããŸãããïŒ
䜿çšäŸïŒ
const { format } = require('winston')
ãŸãã¯const winston = require('winston');
const { format } = winston;
@aybhalala yeppããšã©ãŒã¹ã¿ãã¯ããããªãã§printf
æž¡ãããããšã¯åé¡ã§ã¯ãããŸãããã
æŽæ°ïŒããã«ã¯ãŸã åé¡ãããã®ã§ãç§ã¯ãã°ããã®é次ã®ããšãããŠããŠãããã¯ããŸãæ©èœããŠããŸã
// Grab the default winston logger
const winston = require('winston');
const { format } = winston;
const { combine, timestamp } = format;
// Custom format function that will look for an error object and log out the stack and if
// its not production, the error itself
const myFormat = format.printf((info) => {
const { timestamp: tmsmp, level, message, error, ...rest } = info;
let log = `${tmsmp} - ${level}:\t${message}`;
// Only if there is an error
if ( error ) {
if ( error.stack) log = `${log}\n${error.stack}`;
if (process.env.NODE_ENV !== 'production') log = `${log}\n${JSON.stringify(error, null, 2)}`;
}
// Check if rest is object
if ( !( Object.keys(rest).length === 0 && rest.constructor === Object ) ) {
log = `${log}\n${JSON.stringify(rest, null, 2)}`;
}
return log;
});
winston.configure({
transports: [
new winston.transports.Console({
level: 'debug',
timestamp: true,
handleExceptions: true
}),
];
format: combine(
trace(),
timestamp(),
myFormat
),
});
// Finally you log like this
logger.error('An error occurred!!!', { error } );
^^ããã¯äºæ³ããã䜿çšæ³ã§ãã åãªã人éã¯ãããç解ããããšã¯æ±ºããŠãªãã®ã§ããããææžåããå¿ èŠããããŸãã
åãªã人éã¯ãããç解ããããšã¯æ±ºããŠãªãã®ã§ãããã¯ææžåãããã¹ãã§ã
ðãã®ä»²éã«+1
ç§ã¯ãµãŒãããŒãã£ã®ãã©ã³ã¹ããŒãïŒ @google-cloud/logging-winston
ïŒã§winstonã䜿çšããŠããã®ã§ãæ§æãå°ãå¶åŸ¡ã§ããŸããã ããã«ãããã¯ãã£ãšçŽæçã ãšæããŸãã
const error = new Error('something bad happened');
logger.error('was doing this and', error);
ã³ã³ãœãŒã«ã«ãã°ã€ã³ãããšããã¹ã¿ãã¯ãã¡ãã»ãŒãžã«é£çµããŸãã ããããçµæã¯æ¬¡ã®ããã«ãªããŸãã
ERROR was doing this andsomething bad happened Error: something bad happened <rest of the stack.>
winstonã¯meta.message
ãå
ã®ã¡ãã»ãŒãžã«é£çµãããããå¥åŠãªandsomething
ãšéè€ããã¡ãã»ãŒãžãã¹ã¿ãã¯ã«åºåãããŸãã ããã¯ïŒ1660ã§èª¬æãããŠããŸãã
ïŒ1664ããããä¿®æ£ããããšããŠããããã§ãã ãã®éã«ãç§ã¯ãã®é£çµããå ã«æ»ãããã©ãŒããã¿ãŒãäœæããŸããïŒ https ïŒ
@dandv
logger.error('Caught error:', e);
console.log()
ãšã¯ç°ãªãããŠã£ã³ã¹ãã³ã®logger.<level>(message)
ã¯ã¡ãã»ãŒãžãšåŒã°ãããã©ã¡ãŒã¿ã1ã€ã ãåããããããã¯æ©èœããŸããã ãã®ã¡ãã»ãŒãžãã©ã¡ãŒã¿ã¯ãªããžã§ã¯ããŸãã¯æååã®ããããã§ãïŒç§ãééã£ãŠããå Žåã¯èª°ããç§ãä¿®æ£ããŸãããããã¯ç§ã®ç解ã§ãïŒã
logger.log({level: <level>, message: <message>})
ã䜿çšã§ããããšã«æ³šæããŠãã ããã ãããã®2ã€ã®é¢æ°ã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ãã®ãã®éšåãèªãããšããå§ãããŸãïŒãã°ã¬ãã«ã®WinstonDocs ã ãã®ã³ã°ã¬ãã«ã®äœ¿çšãå¿ ããèªã¿ãã ããlogger.error(`Caught error: ${e}`);
ãªããããã¹ã¿ãã¯ãåºåããªãã®ããæ確ã«èšãããšã¯ã§ããŸããããããããŠã£ã³ã¹ãã³ã®åé¡ã§ã¯ãªãããšã¯ç¥ã£ãŠããŸãã
console.log(`Caught error: ${e}`)
ãè©ŠããŠã¿ããšãã¹ã¿ãã¯ãå«ãŸããŠããŸããã ç§ã¯ãã³ãã¬ãŒããªãã©ã«ãããŸã䜿çšããŠããªãã®ã§ããã³ãã¬ãŒããªãã©ã«ããªããžã§ã¯ãã§ããŸãæ©èœããªãããjavascriptã®console.logããªããžã§ã¯ãããšã©ãŒãªããžã§ã¯ããšããŠèªèããã¡ãã»ãŒãžããããã£ã®ã¿ãåºåããŸãã ãããç§ã®äžçªã®æšæž¬ã§ããlogger.error(`Caught error: ${JSON.stringify(e)}`)
ããã¯ããã®ãã°ã¹ã¬ããã®æ žå¿ã«ãªããŸãã ãŸããJavaScriptã«é¢ããæè¡çãªè©³çŽ°ãç解ããå¿ èŠããããŸãã
console.log(`Caught error: ${JSON.stringify(e)}`)
ãè©ŠããŠã¿ããšãåãåºåCaught error: {}
ãåŸãããããšã«æ³šæããŠãã ããã @indexzeroã説æããããã«ïŒ
message
ãšstack
ç¹æ§ã«Error
åå ãšãªãéåæãããŠããJSON.stringify
åºåã«1ãæåŸ ããŠããªãããšãäœãããåºæ¬çã«ã
message
ããã³stack
ããããã£ã¯åæã§ããªããããJSON.stringify
ã¯ãããã®ããããã£ãã¹ããããã空ã®ãªããžã§ã¯ã{}
ãŸãã åæå¯èœæ§ãããããç解ããã«ã¯ããã®åæå¯èœæ§ãšããããã£ã®æææš©ãèªãããšããå§ãã幞ããªããšã«ãwinston 3.0ã®èšèšæ¹æ³ïŒwinstonããŒã ãžã®å°éå ·ïŒã«ããã@ indexzeroãæäŸãããã®åé¿çããããŸãã 説æãæäŒããŸãã ãŸãã次ã®é¢æ°ãäœæããŸãã
const enumerateErrorFormat = format(info => { if (info.message instanceof Error) { info.message = Object.assign({ message: info.message.message, stack: info.message.stack }, info.message); } if (info instanceof Error) { return Object.assign({ message: info.message, stack: info.stack }, info); } return info; });
ããã¥ã¡ã³ãStreamsãobjectModeãããã³infoãªããžã§ã¯ããããinfoãªããžã§ã¯ãã«ã¯
info.level
ãšinfo.message
2ã€ã®ããããã£ããããŸãã ãã®info.message
ããããã£ããã¯ããªããæž¡ããããã¹ãŠã®å Žåããšã©ãŒãªããžã§ã¯ãã§ããç§ãã¡ã¯ãæ°ãããªããžã§ã¯ããäœæã ããmessage.stack
ããmessage.message
ïŒãšèããŠError.stack
ãšError.message
ïŒãåæå¯èœã«ãªãããã®ãšã©ãŒãªããžã§ã¯ãã«ã¢ã¿ãããããå¯èœæ§ã®ããä»ã®ããããã£ãå«ãŸããŸãã次ã«ãäžèšã®
enumerateErrorFormat()
é¢æ°ã䜿çšãããã®ãã¬ãŒãäœæããŸããconst logger = createLogger({ format: format.combine( enumerateErrorFormat(), format.json() ), transports: [ new transports.Console() ] });
ããã¯ãæž¡ãã
message
ãåãåããããããšã©ãŒãªããžã§ã¯ãã§ãããã©ããã確èªããŸãã ããã§ããã°ãåæã®åé¡ãä¿®æ£ããŸãã 次ã«ãã¡ãã»ãŒãžãformat.json
ã«æž¡ããŸããããã«ããããªããžã§ã¯ãïŒãšã©ãŒãã©ããïŒãæåååãããŸãã ããããªããžã§ã¯ãã§ãªãå Žåãããã¯æååã§ãããformat.json
Effectivleyã¯äœãããŸããããããŠããªãã¯å®¶ã«åž°ããŸããïŒããã§ãããšã©ãŒãªããžã§ã¯ãã¯äžè¬çã«ãã°ã«èšé²ãããããããã®
enumerateErrorFormat
ãäœæããå¿ èŠããªãå Žåã¯äŸ¿å©ã§ãã ç§ãç解ããŠããããã«ãwinstonããŒã ã¯ãåŸã®ããŒãžã§ã³ã§ãªãªãŒã¹ãããä¿®æ£ã«åãçµãã§ããŸããããã€ãã®æåŸã®ã¡ã¢ã ããã¯ãã¡ãã»ãŒãžããšã©ãŒãªããžã§ã¯ãã§ãã
logger.log({level: <level>, message: <message>})
ã䜿çšããå Žåã«ã®ã¿æ©èœããŸãã äŸïŒtry { throw(new Error('This should work')); } catch (err) { logger.log({level: 'error', message: err}); }
äžèšã®ä»ã®æçš¿ã§èª¬æããããã«ãwinstonã«ã¯ãã®ã³ãŒããæ©èœããªãå¥ã®ãã°ããããŸãã
try { throw(new Error('This will not work')); } catch (err) { logger.error(err); }
logger.error(err)
ã䜿çšãããšãäœããã®çç±ã§info.message
ããããã£ãå®çŸ©ãããŸããã ããŸãããã°ã @ indexzeroã¯ããã
éåžžã«è¯ã説æã§ããã logger.error(
è¿œå ããããšæããŸãããšã©ãŒãçºçããŸããïŒ$ {e} );
æååãªãã©ã«ãjavascriptã§æ©èœããæ¹æ³ãåå ã§ãã¹ã¿ãã¯ã倱ãããŸã`${e}`
ã¯e.toString()
`${e}`
ãšãŸã£ããåãã§ããããããšã©ãŒã¡ãã»ãŒãžã®ã¿ãåºåããããšãæåŸ
ãããåäœã§ãã
ããã¯ãŸã åé¡ã§ããïŒ ç§ã¯ãŸã ããã«åé¡ããããŸãïŒ
const { createLogger, format, transports } = require('winston')
const { combine } = format
const errorFormatter = format((info) => {
console.log(info)
return info
})
const consoleTransport = new transports.Console({
format: combine(errorFormatter()),
})
const logger = createLogger({
transports: [
consoleTransport,
],
})
try {
throw new Error('Error message')
} catch(err) {
logger.error(err) // info doesnt have the error object
logger.error('', err) // info have the error object
}
ããã¯ãŸã åé¡ã§ããïŒ ç§ã¯ãŸã ããã«åé¡ããããŸãïŒ
const { createLogger, format, transports } = require('winston') const { combine } = format const errorFormatter = format((info) => { console.log(info) return info }) const consoleTransport = new transports.Console({ format: combine(errorFormatter()), }) const logger = createLogger({ transports: [ consoleTransport, ], }) try { throw new Error('Error message') } catch(err) { logger.error(err) // info doesnt have the error object logger.error('', err) // info have the error object }
ããã§åãåé¡...
ãœãŒã¹ã³ãŒããèŠãåŸãç§ã¯ãããã©ã®ãã©ã¡ãŒã¿ãåãå ¥ããããèŠãããšãã§ããŸãïŒ
ã€ã³ã¿ãŒãã§ã€ã¹LeveledLogMethod {
ïŒã¡ãã»ãŒãžïŒæååãã³ãŒã«ããã¯ïŒLogCallbackïŒïŒãã¬ãŒ;
ïŒã¡ãã»ãŒãžïŒæååãã¡ã¿ïŒä»»æãã³ãŒã«ããã¯ïŒLogCallbackïŒïŒãã¬ãŒ;
ïŒã¡ãã»ãŒãžïŒæååã...ã¡ã¿ïŒä»»æ[]ïŒïŒãã¬ãŒ;
ïŒinfoObjectïŒãªããžã§ã¯ãïŒïŒãã¬ãŒ;
}
ãããã£ãŠããšã©ãŒãªããžã§ã¯ããæåã®ãã©ã¡ãŒã¿ãšããŠæž¡ããšãæååããç解ããªãããããšã©ãŒã®ã¡ãã»ãŒãžã®ã¿ãåãåãããŸãã2çªç®ã®ãã©ã¡ãŒã¿ã§ãšã©ãŒãæž¡ããšãinfo.stackã®ã¹ã¿ãã¯ãã¬ãŒã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
ãšããã§ãç§ã¯ãããããã¥ã¡ã³ãã®ã©ãã«ãèŠã€ããããšãã§ããŸããã§ãã
ç§ã¯2ã€ã®è§£æ±ºçãèŠã€ããŸãããæåã®è§£æ±ºçã¯ã芪ãã¬ãŒã®ãã°ãã©ãŒã ã«èšèŒãããŠããformat.errors
ã䜿çšãã次ã«format.printf
ã䜿çšããŠmessageFormatterãäœæããããæœåºãããstack
ãã£ãŒã«ããæ¡ä»¶ä»ãã§è¿œå ããããšã§ãã info
ïŒ format.errors({ stack: true})
ã¯ãããè¿œå ããŸãïŒã
ç§ã奜ãã ãã1ã€ã®è§£æ±ºçã¯ããŠã£ã³ã¹ãã³ã¬ãã«ã®ãã¬ãŒãããã¯ããããšã§ããã
const addArgs = format((info) => {
const args: any[] = info[Symbol.for('splat')]
info.args = args ? [...args] : []
return info
})
const messageFormatter = format.printf(info => {
const { timestamp: timeString = '', message, args = [] } = info
const formattedMsgWithArgs = util.formatWithOptions({ colors: true }, message, ...args)
const msg = `${timeString} - ${info.level}: ${formattedMsgWithArgs}`
return msg
})
const logger = createLogger({
format: format.combine(
addArgs(),
format.timestamp({ format: 'HH:mm:ss.SSS' })
),
transports: [
new transports.Console({
format: format.combine(format.colorize(), messageFormatter),
}),
],
})
const levels = ['debug', 'info', 'error']
levels.forEach((level) => {
logger[level] = (msg: any, ...remains: any) => {
if(typeof msg != "string") {
return logger.log(level, '', msg, ...remains)
}
logger.log(level, msg, ...remains)
}
})
ãã®ããã«ããŠã console.log
ãšåæ§ã®ãšã©ãŒãã°ãååŸã§ããããã§ãã
format.errors
ã_parent_ãã¬ãŒã«ã©ã®ããã«é
眮ãããªããã°ãªããªããã«ã€ããŠã®@tiagonapoliã®ã³ã¡ã³ãã
winston.loggers.add("default");
const log = winston.loggers.get("default");
/* get a `transportOptions` object and a `transportType` */
transportOptions.format = logform.format.combine(
logform.format.errors({ stack: true }),
logform.format.timestamp(),
logform.format.printf(myFormatter)
);
log.add(new winston.transports[transportType](transportOptions);
Error
ãªããžã§ã¯ãã®åŠçã¯ãæååã§ãããã®ããã«è¡ãããŸãã ããããç§ããã®ãããªããšããããšïŒ
winston.loggers.add("default");
const log = winston.loggers.get("default");
log.format = logform.format.errors({ stack: true });
/* get a `transportOptions` object and a `transportType` */
transportOptions.format = logform.format.combine(
logform.format.timestamp(),
logform.format.printf(myFormatter)
);
log.add(new winston.transports[transportType](transportOptions);
Error
ãªããžã§ã¯ãã®åŠçã¯æ£ããæ©èœããŸãã
ããã§ã®ãã°ã¯ãåäœã«éãããªãã¯ãã ãšããããšã ãšç§ã«ã¯æããŸãã
ããã§ãããã¯1幎åŸããŸã ä¿®æ£ãããŠããŸãããïŒ ãŠã£ã³ã¹ãã³ãã¬ãŒã³ãŒããããã¯ããŠæ©èœãããå¿ èŠããããŸããïŒ
ãããããã¯ç§ã«ååãªé çã®çš®ãäžããã®ã§ããŠã£ã³ã¹ãã³ã¯ç§ã®æ¯èŒçåçŽãªãŠãŒã¹ã±ãŒã¹ã®äŸ¡å€ãããã¯ããã«åä»ãªããã«èŠãå§ããŸãã...ç§ã¯èªåã®å°ããªãã¬ãŒã¯ã©ã¹ãæžãããšã«ãªããŸããããããŠãŠã£ã³ã¹ãã³ã§ãªãéãä»ã®äººã«ãåãããšãããããšããå§ãããŸãæ¬åœã«å¿ èŠãªãã®ãæäŸããŸãã
ã¿ããªãæ¬åœã«ïŒ ããã¯ã€ã©ã€ã©ããŸã...
ç§ã¯ã³ããã¿ãŒã§ã¯ãããŸããããå£ããŠããªãã®ã§ãä¿®æ£ããããããšã¯ãªããšèšãã®ã¯ããããæ£ããã§ãããã ãŠã£ã³ã¹ãã³ã¯äœ¿çšãã䟡å€ããããŸãã ããªãã¯ãããèšå®ããå¿ èŠããããŸã-ç§ã«ãšã£ãŠã®æè¯ã®ã¢ããã€ã¹ã¯https://github.com/winstonjs/winston/issues/1338#issuecomment-506354691ã«ãããŸã
æªã ã« ïŒ
æŽæ°ïŒããã«ã¯ãŸã åé¡ãããã®ã§ãç§ã¯ãã°ããã®é次ã®ããšãããŠããŠãããã¯ããŸãæ©èœããŠããŸã
// Grab the default winston logger const winston = require('winston'); const { format } = winston; const { combine, timestamp } = format; // Custom format function that will look for an error object and log out the stack and if // its not production, the error itself const myFormat = format.printf((info) => { const { timestamp: tmsmp, level, message, error, ...rest } = info; let log = `${tmsmp} - ${level}:\t${message}`; // Only if there is an error if ( error ) { if ( error.stack) log = `${log}\n${error.stack}`; if (process.env.NODE_ENV !== 'production') log = `${log}\n${JSON.stringify(error, null, 2)}`; } // Check if rest is object if ( !( Object.keys(rest).length === 0 && rest.constructor === Object ) ) { log = `${log}\n${JSON.stringify(rest, null, 2)}`; } return log; }); winston.configure({ transports: [ new winston.transports.Console({ level: 'debug', timestamp: true, handleExceptions: true }), ]; format: combine( trace(), timestamp(), myFormat ), }); // Finally you log like this logger.error('An error occurred!!!', { error } );
ãã¬ãŒã¹ã¯ã©ãããæ¥ãã®ã§ããïŒ
ããããããã¯ãã®ã³ã°ã©ã€ãã©ãªã«ã¯åãå
¥ããããŸããã
ã¡ã³ããã¯ãã«ã¹ã¿ã ã®printf圢åŒãšéjson圢åŒãå®çŸ©ããlogger.errorïŒ "something"ãerrïŒãloggerãªã©ã䜿çšããŠãšã©ãŒããã°ã«èšé²ã§ããããšã©ãŒããã°ã«èšé²ããæ¹æ³ã瀺ãããŠããããã¥ã¡ã³ãã«ããã匷調ãããäŸãé
眮ããã ãã§ãã .errorïŒerrïŒ
ãŠã£ã³ã¹ãã³ã¯çŽ æŽãããããã§ãããããã®åé¡ã¯ä¿¡ããããªãã»ã©åãå
¥ããããŸãã
ããã¯ãWinstonã䜿çšããŠãšã©ãŒããã°ã«èšé²ããæ¹æ³ã«ã€ããŠã®ç§ã®èŠè§£ã§ãã ããã¯ãŠããŒã¯ã§ã¯ãããŸãããäžèšã®å€ãã®èŠãèŠã«ã¯ãåãæŠå¿µã«åºã¥ããå®çšçãªãœãªã¥ãŒã·ã§ã³ããããŸãã
ããã¯ã°ã©ãŠã³ã
@jsdevtools/ono
ã䜿çšããŠãä»»æã®ãªããžã§ã¯ãã¿ã€ããã«ã¹ã¿ã ãšã©ãŒã«ã©ããããŠããŸãããããã§ãããã®ãœãªã¥ãŒã·ã§ã³ã¯ããã€ãã£ãããŒããšã©ãŒïŒfs epermãšã©ãŒãªã©ïŒãã«ã¹ã¿ã ãšã©ãŒã¯ã©ã¹ã§æ£åžžã«æ©èœããããã§ãã
説æ
åºæ¬çã«ãç§ã¯format.errors({stack:true})
ãšformat.metadata()
ã«äŸåããŠããŸãã https://github.com/winstonjs/winston/issues/1338#issuecomment -532327143ã§èšåãããŠããããã«ãããã¯èŠªãã©ãŒããã¿ãŒã«ããå¿
èŠããããŸãã
ã¡ã¿ããŒã¿ã¯ããã¹ãŠã®ãšã©ãŒãªããžã§ã¯ãã®ã«ã¹ã¿ã ããããã£ãinfo.metadata
ã«ã·ããããã®ã«åœ¹ç«ã¡ãŸãã
ãšã©ãŒã¡ãã»ãŒãžãã¹ã¿ãã¯ãã¬ãŒã¹ããšã©ãŒãªããžã§ã¯ãã®ããããã£ã®3çš®é¡ã®æ
å ±ãåºåãããã£ãã®ã§ãã ãšã©ãŒã¡ãã»ãŒãžã¯ãã§ã«ãã¬ãŒã³ããã¹ãã§ããã pretty-error
ã¢ãžã¥ãŒã«ã䜿çšããŠãã¹ã¿ãã¯info.metadata.stack
ããããã«å°å·ããŸããã ãšã©ãŒãªããžã§ã¯ãã®ããããã£ã«ã€ããŠã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ãå床衚瀺ããããªãã®ã§ããªããžã§ã¯ãã®ã¯ããŒã³ãäœæããã¹ã¿ãã¯ãã¬ãŒã¹ããããã£ãåé€ããŸããã 次ã«ã fast-safe-stringify
ã䜿çšããŠãšã©ãŒãªããžã§ã¯ãããããã«å°å·ããŸãããããã¯ãwinstonãäŸåããŠããã®ãšåãstringifyã¢ãžã¥ãŒã«ã§ãã
const lodash = require("lodash");
const path = require("path");
const winston = require("winston");
const { default: stringify } = require("fast-safe-stringify");
const logDir = "D:/temp/logs";
// pretty formatting
const PrettyError = require("pretty-error");
const pe = new PrettyError();
pe.withoutColors()
.appendStyle({
'pretty-error > trace':
{
display: 'inline'
},
'pretty-error > trace > item':
{
marginBottom: 0,
bullet: '"*"'
}
})
// @ts-ignore
.alias(/.*[\\\/]CelebrityQuery/i, "<project>")
.alias(/\[CelebrityQuery\][\\\/]?/i, "")
.skip(/** <strong i="23">@type</strong> {(_:any) => boolean} */ (traceline => {
if (traceline && traceline.dir) {
return traceline.dir.toString().startsWith("internal");
}
return false;
}))
.skipNodeFiles();
const consoleFormat = winston.format.combine(
winston.format.colorize(),
winston.format.timestamp({
format: 'DD MMM HH:mm:ss'
}),
winston.format.printf(info => {
if (!lodash.isEmpty(info.metadata) && info.metadata.hasOwnProperty("stack")) {
let dup = lodash.clone(info.metadata);
delete dup.stack;
const errBody = stringify(dup, undefined, 4);
const stack = pe.render({ stack: info.metadata.stack });
return `${info.timestamp} ${info.level} ${info.message}${errBody}\n${stack}`;
} else if (lodash.isString(info.message)) {
return `${info.timestamp} ${info.level} ${info.message}`;
} else {
return `${info.timestamp} ${info.level} ${stringify(info.message, undefined, 4)}`;
}
})
);
const logFormat = winston.format.combine(winston.format.timestamp(), winston.format.json());
return winston.createLogger({
level: 'debug',
format: winston.format.combine(
winston.format.errors({ stack: true }),
winston.format.metadata()
),
transports: [
new winston.transports.Console({
format: consoleFormat,
level: 'info',
}),
new winston.transports.File({
filename: path.join(logDir, "stdout.json"),
format: logFormat,
level: 'debug',
maxsize: 1000000,
tailable: true
})
]
});
PSïŒ httpsïŒ //github.com/winstonjs/winston/issues/1338#issuecomment-506354691ã«èšèŒãããŠãã解決çãè¯ã代æ¿æ段ã ãšæãlogger.warn("Oh no", { error: new Error() })
ã䜿çšããŠãããã«ã¹ã¿ã ãã©ãŒããã¿ã§info.error
ã
@tiagonapoli芪ãã¬ãŒã§format.errors
ã䜿çšããããšã«ã€ããŠã®ããªãã®è§£æ±ºçã¯ç§ã®ããã«åããŸããïŒ
const logger = createLogger({
transports: loggerTransports,
});
logger.format = format.errors({ stack: true });
ãã®ãã¬ãŒãæ§æããã®ã¯ããªãèŠçã§ã...ç®±ããåºããŠconsole.log
ããã«æ¯ãèãã ãã§ã¯ãªãã§ããããïŒ
@ will093ããã§ãåãã§ãã ããäžåºŠãã®åé¡ã«åãçµãã§ããŠããªãç§ã®console.log
ãçŽ æŽããããŠãããã§ããŠã£ã³ã¹ãã³åœ¢åŒãããããšã§ããã®ãç解ã§ããŸããã
ç§ã®2¢
// Enable console logging when not in production
if (process.env.NODE_ENV !== "production") {
logger.add(new transports.Console({
format: format.combine(
format.colorize(),
format.simple(),
format.printf(info => {
const { level, ...rest } = info;
let rtn = "";
// rtn += info.timestamp;
rtn += "[" + info.level + "] ";
if (rest.stack) {
rtn += rest.message.replace(rest.stack.split("\n")[0].substr(7),"");
rtn += "\n";
rtn += "[" + level + "] ";
rtn += rest.stack.replace(/\n/g, `\n[${level}]\t`);
} else {
rtn += rest.message;
}
return rtn;
}),
),
}));
}
logger.error("Error during schema stitching", e);
@tiagonapoliãš@ will093ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠãããã芪ã ãã«è¿œå ããããšã¯ããšã©ãŒãçŽæ¥ãã°ã«èšé²ããã¡ãã»ãŒãžããã°ã«èšé²ããããšããµããŒãããæãç°¡åãªæ¹æ³ã®ããã§ã-ã¿ã€ã ã¹ã¿ã³ãä»ãã®æå°éã®ã»ããã¢ããã®å®å šãªäŸã次ã«ç€ºããŸãã
const createLogger = () => {
const logFormatter = winston.format.printf(info => {
let { timestamp, level, code, stack, message } = info;
// print out http error code w/ a space if we have one
code = code ? ` ${code}` : '';
// print the stack if we have it, message otherwise.
message = stack || message;
return `${timestamp} ${level}${code}: ${message}`;
});
return winston.createLogger({
level: 'info',
// put the errors formatter in the parent for some reason, only needed there:
format: winston.format.errors({ stack: true }),
transports: new winston.transports.Console({
format: winston.format.combine(
winston.format.timestamp(),
logFormatter
),
});
};
logger.error(error)
ãããªãšã©ãŒã§åŒã³åºããããšãã«ã¹ã¿ãã¯ã§æ©èœãã logger.error('a regular message')
ããã«åŒã³åºããããšãã«æååã§æ©èœãããã°ã§ã¯æ¬¡ã®ããã«ãªããŸãã
2020-09-23T20:05:30.30Z info: Feathers application started on http://localhost:3030
2020-09-23T20:05:35.40Z info: job queue - redis ready, registering queues...
2020-09-23T20:05:40.25Z error 401: NotAuthenticated: invalid authorization header
at new NotAuthenticated (/path/to/server/node_modules/@feathersjs/errors/lib/index.js:94:17)
at Object.<anonymous> (/path/to/server/src/hooks/authentication.js:123:456)
at /path/to/server/node_modules/@feathersjs/commons/lib/hooks.js:116:46
ããã¯ããŠã£ã³ã¹ãã³ã®logger.error('message here', error)
-incompatibility w / console.log
ã解決ããããšã¯ããŸããããã@ tiagonapoliã®ããè€éãªãœãªã¥ãŒã·ã§ã³ãè¡ãããã§ãã
ãŸããjsonãã°ã奜ããªå Žåã¯ãããã«logFormatter
ãããããããŠã代ããã«winston.format.json()
ã䜿çšã§ããŸããããã«ã¯ãã¹ã¿ãã¯ãå«ãŸããŸããããããã§ã¯ãããŸããã
æŽæ°ïŒããã«ã¯ãŸã åé¡ãããã®ã§ãç§ã¯ãã°ããã®é次ã®ããšãããŠããŠãããã¯ããŸãæ©èœããŠããŸã
// Grab the default winston logger const winston = require('winston'); const { format } = winston; const { combine, timestamp } = format; // Custom format function that will look for an error object and log out the stack and if // its not production, the error itself const myFormat = format.printf((info) => { const { timestamp: tmsmp, level, message, error, ...rest } = info; let log = `${tmsmp} - ${level}:\t${message}`; // Only if there is an error if ( error ) { if ( error.stack) log = `${log}\n${error.stack}`; if (process.env.NODE_ENV !== 'production') log = `${log}\n${JSON.stringify(error, null, 2)}`; } // Check if rest is object if ( !( Object.keys(rest).length === 0 && rest.constructor === Object ) ) { log = `${log}\n${JSON.stringify(rest, null, 2)}`; } return log; }); winston.configure({ transports: [ new winston.transports.Console({ level: 'debug', timestamp: true, handleExceptions: true }), ]; format: combine( trace(), timestamp(), myFormat ), }); // Finally you log like this logger.error('An error occurred!!!', { error } );
traceïŒïŒã®å®çŸ©ã¯ã©ãã«ãããŸããïŒ
æŽæ°ïŒããã«ã¯ãŸã åé¡ãããã®ã§ãç§ã¯ãã°ããã®é次ã®ããšãããŠããŠãããã¯ããŸãæ©èœããŠããŸã
// Grab the default winston logger const winston = require('winston'); const { format } = winston; const { combine, timestamp } = format; // Custom format function that will look for an error object and log out the stack and if // its not production, the error itself const myFormat = format.printf((info) => { const { timestamp: tmsmp, level, message, error, ...rest } = info; let log = `${tmsmp} - ${level}:\t${message}`; // Only if there is an error if ( error ) { if ( error.stack) log = `${log}\n${error.stack}`; if (process.env.NODE_ENV !== 'production') log = `${log}\n${JSON.stringify(error, null, 2)}`; } // Check if rest is object if ( !( Object.keys(rest).length === 0 && rest.constructor === Object ) ) { log = `${log}\n${JSON.stringify(rest, null, 2)}`; } return log; }); winston.configure({ transports: [ new winston.transports.Console({ level: 'debug', timestamp: true, handleExceptions: true }), ]; format: combine( trace(), timestamp(), myFormat ), }); // Finally you log like this logger.error('An error occurred!!!', { error } );
ãã¬ãŒã¹ã¯ã©ãããæ¥ãã®ã§ããïŒ
ããã«ã€ããŠäœãçãã¯ãããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
ããããããã¯ãã®ã³ã°ã©ã€ãã©ãªã«ã¯åãå ¥ããããŸããã
ã¡ã³ããã¯ãã«ã¹ã¿ã ã®printf圢åŒãšéjson圢åŒãå®çŸ©ããlogger.errorïŒ "something"ãerrïŒãloggerãªã©ã䜿çšããŠãšã©ãŒããã°ã«èšé²ã§ããããšã©ãŒããã°ã«èšé²ããæ¹æ³ã瀺ãããŠããããã¥ã¡ã³ãã«ããã匷調ãããäŸãé 眮ããã ãã§ãã .errorïŒerrïŒ
ãŠã£ã³ã¹ãã³ã¯çŽ æŽãããããã§ãããããã®åé¡ã¯ä¿¡ããããªãã»ã©åãå ¥ããããŸãã