Winston DailyRotateFile 在日志中写入转义字符

问题描述 投票:0回答:1

我已经使用winston 设置了日志记录,并希望使用winston 的dailyRotateFile 写入日志文件。记录到控制台没有问题,但将完全相同的内容记录到文件确实有点工作,但它确实以某种方式包含所有转义字符。

const winstonLogFormat = winston.format.combine(
    winston.format.colorize({ all: true }),
    winston.format.timestamp({
        format: 'YYYY-MM-DD HH:mm:ss.SSS',
    }),
    winston.format.align(),
    winston.format.printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)
)

const fileRotateTransport = new winston.transports.DailyRotateFile({
    filename: '%DATE%-app-log.log',
    dirname: 'logs',
    datePattern: 'YYYY-MM-DD',
    maxFiles: '28d',
    zippedArchive: true,
    json: false,
});

const logger = winston.createLogger({
    level: logLevel,
    format: winstonLogFormat,
    transports: [
        fileRotateTransport,
        new winston.transports.Console()
    ]
});

我使用

logger.info('Connected to: ' + target);
进行记录并将其记录在日志文件中:

[2024-01-11 10:50:46.160] [32minfo[39m:     [32mConnected to: Home[39m

(在每个

[
Notepad++ 以黑色显示 ESC 之前)

控制台只会向我显示正确的日志,没有任何奇怪的字符:

[2024-01-11 10:50:46.160] info:     Connected to: Home

知道如何解决这个问题吗?


编辑: 发现这和颜色有关系。从日志格式中删除

winston.format.colorize({ all: true })
时,控制台不会有任何颜色,但日志不会有错误。

知道如何删除日志文件中的颜色吗?我尝试向 DailyRotateFile 添加新的日志格式,但没有成功:

const winstonLogFormat = winston.format.combine(
    winston.format.colorize({ all: true }),
    winston.format.timestamp({
        format: 'YYYY-MM-DD HH:mm:ss.SSS',
    }),
    winston.format.align(),
    winston.format.printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)
)

const winstonLogFormatForFile = winston.format.combine(
    winston.format.timestamp({
        format: 'YYYY-MM-DD HH:mm:ss.SSS',
    }),
    winston.format.align(),
    winston.format.printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)
)

const fileRotateTransport = new winston.transports.DailyRotateFile({
    filename: '%DATE%-app-log.log',
    dirname: 'logs',
    datePattern: 'YYYY-MM-DD',
    maxFiles: '28d',
    zippedArchive: true,
    json: false,
    format: winstonLogFormatForFile
});

const logger = winston.createLogger({
    level: logLevel,
    format: winstonLogFormat,
    transports: [
        fileRotateTransport,
        new winston.transports.Console()
    ]
});
node.js logging winston
1个回答
0
投票

事实证明,您可以为

winston.transports.Console()
提供自己的格式,这样您就不需要提供全局格式,因此记录到文件中不会有任何颜色:

const winstonLogFormatForFile = winston.format.combine(
    winston.format.timestamp({
        format: 'YYYY-MM-DD HH:mm:ss.SSS',
    }),
    winston.format.align(),
    winston.format.printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)
)

const fileRotateTransport = new winston.transports.DailyRotateFile({
    filename: '%DATE%-app-log.log',
    dirname: 'logs',
    datePattern: 'YYYY-MM-DD',
    maxFiles: '28d',
    zippedArchive: true,
    json: false,
    format: winstonLogFormatForFile
});

const consoleTransport = new winston.transports.Console({
    format: winston.format.combine(
        winston.format.colorize({ all: true }),
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss.SSS',
        }),
        winston.format.align(),
        winston.format.printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)
    )
});

const logger = winston.createLogger({
    level: logLevel,
    transports: [
        fileRotateTransport,
        consoleTransport
    ]
});
© www.soinside.com 2019 - 2024. All rights reserved.