【问题标题】:Winston logging to a file that begins with custom multi line textWinston 记录到以自定义多行文本开头的文件
【发布时间】:2022-06-13 20:45:19
【问题描述】:

我们的 Winston 日志记录已经设置好,并且使用 winston-daily-rotate-file 创建每日日志文件非常好用。我现在需要做的是从一个特定的文件模板(或任何其他方法)创建这些日志文件,并在文件的开头有几个标题行。我们希望更改我们的应用程序以使用结构化的日志记录,以便与单独的内部应用程序一起使用,以便我们的支持团队可以更轻松地遍历大型日志文件。

通常,日志文件会将每个日志附加到文件中,从一个空白文件开始。要指定,我希望该文件在添加任何日志记录之前以几行文本开头。

这可能吗?我在 Winston 或 winston-daily-rotate-file 中都找不到对此类功能的任何引用。也许我打算使用 options 对象参数在文件流中创建挂钩?

【问题讨论】:

  • 我已经尝试过 transport.on('new',....) 方法,我发现文件开头的行覆盖了几行的日志,也许是因为这两个函数的异步性质。我正在旋转 csv 文件并尝试添加标题。 const addHeaderRow = (newFilename) => { return new Promise((resolve, reject) => { const headers = ['col1', 'col2'] const ws = fs.createWriteStream(newFilename) ; const data = '${headers.join(',')}\n' ws.write(data) resolve() }) }

标签: javascript node.js logging winston


【解决方案1】:

处理rotate 事件是可行的方法。
在以下代码中,出于演示目的,我每分钟轮换 2 个文件。我在每个新文件以及每次旋转的顶部附加文本。随着稍后发生旋转,您会看到 ROTATE 高于 NEW,这是预期的。

演示

var winston = require('winston');
require('winston-daily-rotate-file');
const fs = require('fs');

var transport = new winston.transports.DailyRotateFile({
    frequency: '1m',
    filename: 'log-%DATE%',
    datePattern: 'YYYY-MM-DD-HH-mm',
    zippedArchive: false,
    maxSize: '1k',
    maxFiles: '2',
    extension: 'log'
});

transport.on('rotate', function (oldFilename, newFilename) {
    console.log("rotate");

    var data = fs.readFileSync(newFilename); //read existing contents into data
    var fd = fs.openSync(newFilename, 'w+');
    var buffer = Buffer.from('ROTATE text inserted on top \n');
    fs.writeSync(fd, buffer, 0, buffer.length, 0); //write new data
    fs.writeSync(fd, data, 0, data.length, buffer.length); //append old data
    fs.close(fd);
});

transport.on('new', function (newFilename) {
    console.log("new");

    var data = fs.readFileSync(newFilename); //read existing contents into data
    var fd = fs.openSync(newFilename, 'w+');
    var buffer = Buffer.from('NEW text inserted on top \n');

    fs.writeSync(fd, buffer, 0, buffer.length, 0); //write new data
    fs.writeSync(fd, data, 0, data.length, buffer.length); //append old data
    fs.close(fd);
});

var logger = winston.createLogger({
    transports: [
        transport
    ]
});

async function demo() {
    for (i = 1; i < 20; i++) {
        logger.info('Hello World ' + i);
        console.log(i);
        await new Promise(r => setTimeout(r, 10000));
    }
}

demo();

控制台输出

1
2
3
new
rotate
4
5
6
7
8
9
new
rotate
10
11
12
13
14
15
new
rotate
16
17
18
19

创建的文件

log-2022-06-13-14-36log
log-2022-06-13-14-37log

文件内容

1:

ROTATE text inserted on top 
NEW text inserted on top 
{"level":"info","message":"Hello World 10"}
{"level":"info","message":"Hello World 11"}
{"level":"info","message":"Hello World 12"}
{"level":"info","message":"Hello World 13"}
{"level":"info","message":"Hello World 14"}
{"level":"info","message":"Hello World 15"}

2:

ROTATE text inserted on top 
NEW text inserted on top 
{"level":"info","message":"Hello World 16"}
{"level":"info","message":"Hello World 17"}
{"level":"info","message":"Hello World 18"}
{"level":"info","message":"Hello World 19"}

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2014-12-03
    • 2015-05-06
    • 2015-02-13
    • 2015-07-26
    相关资源
    最近更新 更多