如何为winston@3记录器制作自定义json格式化程序?

Max*_*ock 4 logging node.js winston

我正在尝试为 Winston v3 制作自定义 json 格式化程序。

这是一个带有演示的单个文件:

const { createLogger, format, transports } = require("winston")
const { combine, timestamp, prettyPrint } = format

const logger = createLogger({
  format: combine(timestamp(), prettyPrint())
})

logger.add(new transports.Console())

logger.info("test message", { data: { a: 1, b: [1, 2, 3, 4], d: new Date() } })

try {
  throw new Error("I'm an error!")
} catch (err) {
  logger.error(err)
}
Run Code Online (Sandbox Code Playgroud)

它打印:

{ data: { a: 1, b: [ 1, 2, 3, 4 ], d: 2018-07-21T08:59:27.958Z },
  level: 'info',
  message: 'test message',
  timestamp: '2018-07-21T08:59:27.959Z',
  [Symbol(level)]: 'info',
  [Symbol(splat)]:
   [ { data: { a: 1, b: [ 1, 2, 3, 4 ], d: 2018-07-21T08:59:27.958Z } } ] }
{ Error: I'm an error!
    at Object.<anonymous> (/Users/max7z/projects/test/t32__test__winston__pretty-print_symbol/index.js:13:9)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:266:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
  level: 'error',
  timestamp: '2018-07-21T08:59:27.962Z',
  [Symbol(level)]: 'error' }
Run Code Online (Sandbox Code Playgroud)

我想要几乎相同的输出,但没有一些字段:[Symbol(level)]、[Symbol(splat)]。

是否可以从prettyPrint格式化程序中删除 [Symbol] 字段?

或者我如何制作自己的自定义 json 格式化程序,并像 PrettyPrint 那样带有错误堆栈跟踪?

Ben*_*uer 6

我使用winston v3.3.3测试了示例,并添加了一个自定义格式化程序来字符串化data对象:

const winston = require('winston');

const myFormatter = winston.format((info) => {
  const {message} = info;

  if (info.data) {
    info.message = `${message} ${JSON.stringify(info.data)}`;
    delete info.data; // We added `data` to the message so we can delete it
  }
  
  return info;
})();

const logger = winston.createLogger({
  format: winston.format.combine(
    winston.format.timestamp({
      format: 'YYYY-MM-DD HH:mm:ss',
    }),
    myFormatter,
    winston.format.simple(),
  ),
  transports: [
    new winston.transports.Console(),
  ],
});
Run Code Online (Sandbox Code Playgroud)

我运行了问题中的命令并得到了所需的输出。

执行:

logger.info('test message', {data: {a: 1, b: [1, 2, 3, 4], d: new Date()}});

try {
  throw new Error(`I'm an error!`);
} catch (err) {
  logger.error(err);
}
Run Code Online (Sandbox Code Playgroud)

输出:

信息:测试消息 {"a":1,"b":[1,2,3,4],"d":"2020-09-09T09:41:22.525Z"} {"timestamp":"2020- 09-09 11:41:22"}

错误:我是一个错误!{“时间戳”:“2020-09-09 11:41:22”}

winston.format.prettyPrint()当使用代替 时,还可以使用制表符和换行符打印 JSON 对象winston.format.simple()


Luc*_* S. 5

查看如何创建自定义格式。然后使用的源代码prettyPrint作为基础,根据您的需要创建修改版本。

Winstons 用于triple-beam各种Symbols 的定义,因此您也可以使用该包来删除它们。