使用 Node.js 中的 Winston 和 Winston-Daily-Rotate-File 在 JSON 对象中输出日志

Outputting Logs inside JSON Object with Winston and Winston-Daily-Rotate-File in Node.js

我遇到了同样的问题,想要得到与此处相同的结果:

但我使用的是 winston-daily-rotate-file,因此给定的答案/解决方案不适用于我的情况。

我的记录器看起来像这样:

const path = require('path');
const { createLogger, format, transports, addColors, config } = require('winston');
const winstonDailyRotateFile = require('winston-daily-rotate-file');
const { combine, timestamp, json, colorize, label, printf, errors } = format;

const CustomTransport = require('./customtransport')

const customLevels = {
    levels: {
      error: 0,
      warn: 1,
      fileProcessed: 2,
      info: 3,
      debug: 4,
      silly: 5,
    },
    colors: {
        error: 'bold red',
        warn: 'bold yellow',
        fileProcessed: 'bold blue',
        info: 'bold cyan',
        debug: 'bold gray',
        silly: 'bold magenta'
    }
  };

addColors(customLevels.colors);

const consoleFormat = printf(({ level, message, label, stack }) => {
    const log = `${level}: [${label}] ${message}`;
    const errLog = `${log}\n${stack}`;

    return stack ? errLog : log;
});

module.exports = (module) => {
    const logger = createLogger({
        levels: customLevels.levels,
        transports: [
            new CustomTransport({

            }),
            new winstonDailyRotateFile({
                format: combine(
                    errors({stack: true}),
                    timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
                    label({ label: path.basename(module.filename) }),
                    json(),
                ),
                dirname: './logs',
                filename: 'sppa-%DATE%.log',
                datePattern: 'YYYY-MM-DD',
                zippedArchive: true,
                maxSize: '20m',
                maxFiles: '14d'
            })
        ]
    });

    // If we're not in production then log to the `console` 
    if (process.env.NODE_ENV !== 'production') {
        logger.add(new transports.Console({
            levels: customLevels.levels,
            level: 'silly',
            format: combine(
                colorize(),
                errors({stack: true}),
                label({ label: path.basename(module.filename) }),
                consoleFormat
            ),
        }));
    }

    return logger;
}

如有任何帮助,我们将不胜感激!

我现在使用正则表达式的解决方法,我用逗号替换换行符并在文件周围添加 [ ]。它看起来像这样:

app.get("/log", (req, res) => {
    fs.readFile('C:\Path\To\nodeAPI\logs\test.log', function (err, data) {
        if (err) {
            console.log(err);
        }
        let content = data.toString('utf8').replace(/\r?\n|\r/g, ',');
        content = "[" + content + "]";
        res.send(content);
    });
});