在Winston中为2个传输设置相同的唯一ID



我在项目中使用winston-js作为记录器-它运行良好,但我现在正试图为每个日志行添加一个唯一的日志Id以进行调试。

我有两个传输-1(控制台,2(文件。

我希望同一日志行的日志ID在两种传输中都相同。目前,当请求通过我的系统时,日志ID保持不变。

在下面的示例代码中,我使用了winston的defaultMeta——它似乎不起作用,但我也尝试添加了函数——并得到了相同的结果。

我是否将同一日志行的日志ID设置为在两个传输中相同?

注意:我在项目中使用UUID作为LogId——为了简单起见,我在示例中使用了一个数字。

例如,我目前的设置是:

文件

logID: 1 | Request: Post | Request: 1
logID: 1 | Request: Post | Request: 1
logID: 2 | Request: Post | Request: 2

控制台

logID: 1 | Request: Post | Request: 1
logID: 1 | Request: Post | Request: 1
logID: 2 | Request: Post | Request: 2

我想要:

文件

logID: 1 | Request: Post | Request: 1
logID: 2 | Request: Post | Request: 1
logID: 3 | Request: Post | Request: 2

控制台

logID: 1 | Request: Post | Request: 1
logID: 2 | Request: Post | Request: 1
logID: 3 | Request: Post | Request: 2

function devLogger () {
const logFormat = printf(({ level, message, timestamp, stack, ...meta }) => {
var logId = meta.logId
return `${timestamp} [${level}] ${message} | ${logId} | Console`;
})
const jsonFormat = printf(({ level, message, timestamp, stack, ...meta }) => {
var logId = meta.logId
return `${timestamp} [${level}] ${message} | ${logId} | File`;
})
return createLogger({
defaultMeta: { logId: uuidv4() }, // Add logId to both transports
transports: [
new transports.Console({
level: 'debug',
format: combine(
format.colorize(),
timestamp({ format: 'DD-MM-YY HH:mm:ss' }),
logFormat
),
}),
new transports.File({
level: 'debug',
filename: 'error.log',
format: combine(timestamp({ format: 'DD-MM-YY HH:mm:ss' }), errors({ stack: true }), jsonFormat),
}),
]
});
}

用一些直接变量修复了它。

首先我们设置LogId,我们重用它,然后我们将它设置为一个新的ID,为下一个请求做好准备。

这与我们在jsonFormat之前运行logFormat一样有效

function devLogger () {

var setLogId = uuidv4()

const logFormat = printf(({ level, message, timestamp, stack}) => {
return `${timestamp} [${level}] ${message} | ${setLogId} | Console`;
})

const jsonFormat = printf(({ level, message, timestamp, stack}) => {
var logId = setLogId

setLogId = uuidv4()
return `${timestamp} [${level}] ${message} | ${logId} | File`;
})



return createLogger({
transports: [
new transports.Console({
level: 'debug',
format: combine(
format.colorize(),
timestamp({ format: 'DD-MM-YY HH:mm:ss' }),
logFormat
),
}),
new transports.File({
level: 'debug',
filename: 'error.log',
format: combine(timestamp({ format: 'DD-MM-YY HH:mm:ss' }), errors({ stack: true }), jsonFormat),
}),
]
});
}

最新更新