我正在使用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。
答案 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}