1

winston-js在我的项目中用作记录器 - 它工作正常,但是我现在尝试为每个日志行添加一个唯一的日志 ID 以进行调试。

我有 2 次传输 - 1)控制台,2)文件。

我希望两个传输的同一日志行的日志 ID 相同。目前,随着请求通过我的系统,日志 ID 保持不变。

在下面的示例代码中,我使用的是winston's 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),
            }),
        ]
    });
}
4

1 回答 1

0

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

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

这和我们之前运行的logFormat一样jsonFormat

 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),
                }),
            ]
        });
    }
于 2021-12-23T16:26:28.753 回答