检查 winston 元数据是否在 format.metadata 之后"empty"



这个"Complete Winston Logger Guide";,给出了以下示例:

const myFormat = printf( ({ level, message, timestamp , ...metadata}) => {
let msg = `${timestamp} [${level}] : ${message} `  
if(metadata) {
msg += JSON.stringify(metadata)
}
return msg
});

我正在努力实现;然而,我无法测试元数据的存在性。首先,我总是有元数据。我想这是因为我在这个过程的早期使用了format.metadata。这是我的Winston设置:

const logger = createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
defaultMeta: {
service: 'lp-server'
},
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
format.errors({ stack: true }),
format.splat(),
format.metadata({ fillExcept: [
'timestamp',
'level',
'service',
'label',
'message'
]}),
),
transports: [
new transports.Console({
level: 'debug',
format: format.combine(
consoleFormat // my implementation of the example, which we'll get to, below
)
})
]
});

现在,如果我做一个日志条目,说

logger.debug(`PROD is ${PROD} and NODE_ENV is ${process.env.NODE_ENV}`);

如果在我的自定义格式中,我控制台记录完整的info对象,我会得到

{
timestamp: '2022-07-21 13:14:40',
level: 'debug',
service: 'lp-server',
label: undefined,
message: 'PROD is false and NODE_ENV is undefined',
metadata: {},
[Symbol(level)]: 'debug'
}

如果我像他们在示例中那样销毁info,并控制台记录metadata,它会将metadata[Symbol(level]都放入其中:

// console.log('Got metadata');
// console.dir(metadata);
Got metadata
{ metadata: {}, [Symbol(level)]: 'debug' }

所以,我的自定义格式功能现在看起来是这样的:

const consoleFormat = format.printf( (
{
timestamp,
level,
service,
label = '',
message,
...metadata
}
)  => {
let msg = `${timestamp} ${level} ${service}`;
if (label) msg += ` [${label}]`;
msg += `: ${message}`;
if (metadata.metadata !== {})  msg += ' ' + JSON.stringify(metadata.metadata);
return msg;
});

如果我真的有意记录一些额外的元数据,那就很好了;但是,除了必须处理metadata.metadata的问题之外,我无法使测试正常工作——它总是返回true。我试过

(metadata.metadata)
(metadata.metadata !== {})
(metadata.metadata !== '{}')
(metadata.metadata !== '{}')

让它发挥作用的正确方法是什么?要么通过测试我认为存在但没有属性的对象,要么更好地通过解决我的metadata.metadata问题?

我来这里是为了寻找答案,但阅读你的问题让我找到了一个可能的答案:

let metadataString = JSON.stringify(metadata.metadata);
if (metadataString  !== '{}')  msg += ' ' + metadataString;

相关内容

  • 没有找到相关文章

最新更新