I'm attempting to use Winston and winston-daily-rotate-file to log all my console/log output from a node.js server to a single file that will (hopefully) get rotated daily at midnight.
The issue I'm encountering is that unhandled exceptions seem to generate a new log file rather than write to the existing one. See the example code below for the duplication behaviour. How do I get all output to be saved to a single logfile as well as output to the console? At present, the console side of things appears to be fine but feel free to point out anything obvious that I'm missing.
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const path = require('path');
var logger = new (winston.createLogger)({
transports: [
new (winston.transports.Console)({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.colorize({ all: true }),
winston.format.printf((info) => {
const {
timestamp, level, message
} = info;
return `${timestamp} - ${level}: ${message}`;
}),
),
handleExceptions: true
}),
new DailyRotateFile({
name: 'file',
datePattern: 'YYYY-MM-DDTHH-mm-ss',
handleExceptions: true,
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf((info) => {
const {
timestamp, level, message
} = info;
return `${timestamp} - ${level}: ${message}`;
}),
),
filename: path.join(__dirname, 'logs', '%DATE%.log')
}),
]
});
logger.info("This is an info message");
logger.error("This is an error message");
setTimeout(() => {throw new Error('oh dear!')}, 5000);
My issue was caused by the datePattern option. winston-daily-rotate-file uses this pattern to determine the frequency of file rotation. As I had included seconds in the pattern it was looking for a file with the current timestamp (to the nearest second) and creating it before writing to file.
To get daily files I just needed to change
datePattern: 'YYYY-MM-DDTHH-mm-ss'
to
datePattern: 'YYYY-MM-DD'