Handling the rotate event is the way to go.
In the following code, I am rotating every 2 files every minute for demo purposes. I am appending text on top of each new file, and also every rotation. As rotation happens later, you see ROTATE above NEW, which is expected. For your scenario I don't think you need the new event.
Demo
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();
Console output
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
Files created
log-2022-06-13-14-36log
log-2022-06-13-14-37log
Files content
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"}