Winston 日志记录 - Winston 3.x 中的漂亮 JSON 格式

Winston logging - pretty JSON format in Winston 3.x

几年前我和温斯顿一起工作。当我们在本地主机上开发时,我们的 winston 被配置为输出格式良好的 JSON,这很容易阅读。

2.x温斯顿

npm install winston@2.2.0

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"}

问题

是否有一些 native/easy 方法可以获得与我在最新 (3.3.3) 版本中的 2.x 版本相同的输出?如果没有,您知道实现它的最佳方法吗?

加分题

Webstorm 无法检测到(在上述两个示例中)堆栈跟踪中的文件和行,因此它不可点击。 当我只是“console.error”时,堆栈跟踪看起来像这样:

而且我可以直接单击该文件以在导致错误的行中导航到它。 你知道如何在温斯顿实现吗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

中包含可点击的 link