gpt4 book ai didi

node.js - winston 记录对象

转载 作者:行者123 更新时间:2023-12-03 21:46:56 26 4
gpt4 key购买 nike

我使用Winston进行后端日志记录,如果不使用JSON.stringify就无法记录对象,这很烦人

logger.debug(`Register ${JSON.stringify(req.body)}`)
const logger: Logger = createLogger({
// change level if in dev environment versus production
level: env === 'production' ? 'info' : 'debug',
format: format.combine(
format.label({label: path.basename(process.mainModule.filename)}),
format.timestamp({format: 'YYYY-MM-DD HH:mm:ss'}),
format.prettyPrint()
),
transports: [
new transports.Console({
format: format.combine(format.colorize(), logFormat),
}),
new transports.File({
filename,
format: format.combine(format.json()),
}),
],
exitOnError: false,
})

您能告诉我Winston记录对象的方法吗?我正在使用3.2.1版

最佳答案

您正在尝试将JSON对象直接插入字符串中,因此它将打印出[Object Object]而不包含JSON.stringify

这不能通过配置Winston来解决,因为在生成字符串时会发生此问题(在logger.debug函数实际读取它之前),因此console.log调用将打印相同的内容。
logger.*函数的第一个参数是消息(字符串),然后您可以传递元数据对象(JSON)。

要在logFormat函数中使用元数据,请更新Logger实例,如下所示:

const winston = require('winston')
const { format, transports } = winston
const path = require('path')

const logFormat = format.printf(info => `${info.timestamp} ${info.level} [${info.label}]: ${info.message}`)

const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
format: format.combine(
format.label({ label: path.basename(process.mainModule.filename) }),
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
// Format the metadata object
format.metadata({ fillExcept: ['message', 'level', 'timestamp', 'label'] })
),
transports: [
new transports.Console({
format: format.combine(
format.colorize(),
logFormat
)
}),
new transports.File({
filename: 'logs/combined.log',
format: format.combine(
// Render in one line in your log file.
// If you use prettyPrint() here it will be really
// difficult to exploit your logs files afterwards.
format.json()
)
})
],
exitOnError: false
})

用法:

const req = {
body: {
name: 'Daniel Duuch',
email: 'daniel.duuch@greatmail.com',
password: 'myGreatPassword'
}
}

logger.debug(`Register ${req.body.name} with email ${req.body.email}`, { ...req.body, action: 'register' })

控制台输出:
2019-05-11 17:05:45 debug [index.js]: Register Daniel Duuch with email daniel.duuch@greatmail.com

日志文件输出(手工整理,请参阅传输文件格式的注释):
{
message: 'Register Daniel Duuch with email daniel.duuch@greatmail.com',
level: 'debug',
timestamp: '2019-05-11 17:05:45',
label: 'index.js',
metadata: {
name: 'Daniel Duuch',
email: 'daniel.duuch@greatmail.com',
password: 'myGreatPassword'
}
}

希望这能解决您的问题。

Code for this answer

关于node.js - winston 记录对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com