Я работал с Уинстоном несколько лет назад. Когда мы разрабатывали на локальном хосте, наш winston был настроен на вывод красиво отформатированного JSON, который было легко читать.
2.x Уинстон
npm install [email protected]
const winston = require('winston');
const logger = new winston.Logger({
transports: [new (winston.transports.Console)({ json: true })],
});
logger.info('please', { iam: 'good' });
try {
throw new Error('ooh noo');
} catch (err) {
logger.error('Not good error', err);
}
имеет этот вывод
{
"iam": "good",
"level": "info",
"message": "please"
}
{
"message": "Not good error",
"stack": "Error: ooh noo\n at Object.<anonymous> (C:\\Users\\libor\\WebstormProjects\\untitled\\usewinston.js:30:11)\n at Module._compile (internal/modules/cjs/loader.js:1063:30)\n at Object.Module._extensions..js (internal/
modules/cjs/loader.js:1092:10)\n at Module.load (internal/modules/cjs/loader.js:928:32)\n at Function.Module._load (internal/modules/cjs/loader.js:769:14)\n at Function.executeUserEntryPoint [as runMain] (internal/modules/run_
main.js:72:12)\n at internal/main/run_main_module.js:17:47",
"level": "error"
}
3.x Уинстон
npm install winston
(самая новая версия или 3.3.3 при написании этой статьи)
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
});
logger.add(new winston.transports.Console({
format: winston.format.json(),
}));
logger.info('please', { iam: 'good' });
try {
throw new Error('ooh noo');
} catch (err) {
logger.error('Not good error', err);
}
имеет этот вывод
{"iam":"good","level":"info","message":"please"}
{"level":"error","message":"Not good error ooh noo","stack":"Error: ooh noo\n at Object.<anonymous> (C:\\Users\\libor\\WebstormProjects\\untitled\\usewinston.js:21:11)\n at Module._compile (internal/modules/cjs/loader.js:1063:30)
\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)\n at Module.load (internal/modules/cjs/loader.js:928:32)\n at Function.Module._load (internal/modules/cjs/loader.js:769:14)\n at Function.executeU
serEntryPoint [as runMain] (internal/modules/run_main.js:72:12)\n at internal/main/run_main_module.js:17:47"}
Вопрос
Есть ли какой-нибудь нативный/простой способ получить тот же вывод, что и в версии 2.x в новейшей (3.3.3) версии? Если нет, то знаете ли вы лучший способ добиться этого?
Бонусный вопрос
Webstorm не может обнаружить (ни в одном из приведенных выше примеров) файлы и строки в трассировке стека, поэтому он не активен. Когда я просто "console.error", трассировка стека выглядит так:
и я могу напрямую щелкнуть файл, чтобы перейти к нему в строке, вызвавшей ошибку. Вы знаете, как этого добиться в Winston 3.x?
Я решил это с помощью пользовательского форматирования следующим образом
const winston = require('winston');
const _ = require('lodash');
const logger = winston.createLogger({
level: 'info',
});
const logStackAndOmitIt = winston.format((info, opts) => {
if (info.stack){
console.error(info.stack);
return _.omit(info, 'stack');
}
return info;
});
logger.add(new winston.transports.Console({
format: winston.format.combine(
logStackAndOmitIt(),
winston.format.prettyPrint(),
),
})
);
const arr = Array(50).fill(20)
logger.info('pleases', { iam: 'abc', arr });
try {
throw new Error('ooh noo');
} catch (err) {
logger.error('Not good error', err);
}
Который имеет этот выход
{
iam: 'abc',
arr: [
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20
],
level: 'info',
message: 'pleases'
}
Error: ooh noo
at Object.<anonymous> (C:\Users\libor\WebstormProjects\untitled\usewinston.js:71:11)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47
{ level: 'error', message: 'Not good error ooh noo' }
Включение интерактивной ссылки в Webstorm