处理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"}