温斯顿格式的信息对象不同

时间:2019-01-11 20:45:08

标签: node.js logging winston

我正在使用winston日志记录库。我有一些要记录的对象,在记录它们之前,我要进行一些转换。在将它们放入记录器之前,我可以手动进行这些转换,但是当选择的日志级别低于这些转换将出现的级别时,我想避免进行这些转换。如果有办法format每个人info object,那么我不会在额外的转换上浪费cpu。

这里大概是我的记录器课程,了解我的意思:

import * as winston from 'winston'
class Logger {
  constructor(logLevel) {
    this.logger = createLogger({ level: logLevel })
  }

  newValues = (valuesWithIds) => {
    this.logger.info(valuesWithIds.map(v => v.value))
  }
  selectedCachedValues = (valuesWithIds) => {
    this.logger.info(valuesWithIds.map(v => v.value))
  }
  downloadComplete = (url, queue) => {
    this.logger.info(`${url} complete, ${queue.length} items remaining`)
  }
}

const logger = new Logger('error')
// this performs an array map operation that doesnt need to be ran.
logger.newValues([{ id: 1, value: 'a' }, { id: 1, value: 'b' }])
scala-logging这样的

库对宏进行这种处理。我希望我可以写一些高效的javascript。

2 个答案:

答案 0 :(得分:0)

我有同样的情况,但是有指标。我基于代理开发了一些陷阱。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

答案 1 :(得分:0)

实际上,我最终用bunyan记录器解决了我的问题。 Bunyan允许您在特定的对象键上定义特定的转换(它们将其称为serializers)。我可以定义某些序列化程序,如果我以高于所选日志级别的级别登录,它将忽略该序列化程序。

const bunyan = require('bunyan')
const serializers = {
  valuesWithIds: vals => vals.map(v => v.value)
}
const logger = bunyan.createLogger({ name: 'root', level: 'error' })

const valuesWithIds = [{ id: 1, value: 'a' }, { id: 1, value: 'b' }]
// logs nothing, doesnt execute the serializer
logger.info({ valuesWithIds }, 'loaded values')
// logs to console, runs the serializer
logger.error({ valuesWithIds }, loaded values')

这将产生一行输出:

{"name":"root","hostname":"myhostname","pid":100,"level":30,"valuesWithIds":["a","b"],"msg":"loaded values","time":"2019-01-14T00:05:04.800Z","v":0}