除第一天外,如何使用 Winston 每天轮换日志
How to daily rotate logs using Winston except the first day
除了当天的文件外,我需要每天轮换日志。
我正在使用 winston 和 winston-daily-rotate-file 库。
在下面的例子中,我第一次执行节点时生成了一个文件"info.log.2016-08-09"。
但是,我确实需要生成文件 "info.log",在这一天之后,应该重命名为 "info.log.2016-08-09",并为当天创建一个新的 "info.log"。
我知道这是其他应用程序中的正常行为。
var logger = new (winston.Logger)({
transports: [
new dailyRotateFile(
{
name: 'cronInfo',
filename: path.join(__dirname,"log", "info.log"),
level: 'info',
timestamp: function(){
return utils.formatDate(new Date(), "yyyy-mm-dd'T'HH:MM:ss.l'Z'")
},
formatter: function(options) {
return options.timestamp() +' ['+ options.level.toUpperCase() +'] '+ (undefined !== options.message ? options.message : '') +
(options.meta && Object.keys(options.meta).length ? '\n\t'+ JSON.stringify(options.meta) : '' );
},
json:false,
datePattern:".yyyy-MM-dd"
})
]
});
好吧,一种解决方法是再增加一次到 info.log
的交通工具
就像这样:
var logger = new (winston.Logger)({
transports: [
new dailyRotateFile(
{
//your definition of rotate file
}),
new (winston.transports.File)({ filename: 'info.log' })
]
});
然后设置一些 cron 以在午夜删除 info.log,即 node-schedule
但是,使用这种方法几乎不会出现不一致,如果某个东西是 运行 到午夜,它可以将几行记录到属于第二天的 info.log 中,然后将其删除,因此info.log可以不完整。
但是所有具有这种 info.log.2016-08-09
格式的日志仍然完整且不受影响。
所以要考虑是不是很小的几率一天不完整info.log是可以接受的。 (但是,您可以创建更高级的检查器,它不仅会删除文件,还会查看新一天的文件是否存在,如果存在,它会查看里面的内容,然后仅从 info.log 中删除前几天的日志,但不会一次全部删除)
另一种没有数据边界问题的方法就是使用:
var logger = new (winston.Logger)({
transports: [
new dailyRotateFile(
{
// your definition of rotate file
})
]
});
然后为 info.log 创建一个链接到当天文件的符号链接。最后你可以使用:
transport.on('rotate', function(oldFilename, newFilename) {
fs.symlinkSync(newFilename, 'info.log');
});
旋转时更新符号链接。
如果您的日志文件特别大,这也会节省一些磁盘空间 space。
对于那些可能仍在寻找正确方法的人,此功能已添加到 v.4.1.0。
只需使用 createSymlink
和 symlinkName
选项:
new DailyRotateFile({
...
createSymlink: true,
symlinkName: 'info.log',
});
除了当天的文件外,我需要每天轮换日志。 我正在使用 winston 和 winston-daily-rotate-file 库。
在下面的例子中,我第一次执行节点时生成了一个文件"info.log.2016-08-09"。
但是,我确实需要生成文件 "info.log",在这一天之后,应该重命名为 "info.log.2016-08-09",并为当天创建一个新的 "info.log"。 我知道这是其他应用程序中的正常行为。
var logger = new (winston.Logger)({
transports: [
new dailyRotateFile(
{
name: 'cronInfo',
filename: path.join(__dirname,"log", "info.log"),
level: 'info',
timestamp: function(){
return utils.formatDate(new Date(), "yyyy-mm-dd'T'HH:MM:ss.l'Z'")
},
formatter: function(options) {
return options.timestamp() +' ['+ options.level.toUpperCase() +'] '+ (undefined !== options.message ? options.message : '') +
(options.meta && Object.keys(options.meta).length ? '\n\t'+ JSON.stringify(options.meta) : '' );
},
json:false,
datePattern:".yyyy-MM-dd"
})
]
});
好吧,一种解决方法是再增加一次到 info.log
的交通工具就像这样:
var logger = new (winston.Logger)({
transports: [
new dailyRotateFile(
{
//your definition of rotate file
}),
new (winston.transports.File)({ filename: 'info.log' })
]
});
然后设置一些 cron 以在午夜删除 info.log,即 node-schedule
但是,使用这种方法几乎不会出现不一致,如果某个东西是 运行 到午夜,它可以将几行记录到属于第二天的 info.log 中,然后将其删除,因此info.log可以不完整。
但是所有具有这种 info.log.2016-08-09
格式的日志仍然完整且不受影响。
所以要考虑是不是很小的几率一天不完整info.log是可以接受的。 (但是,您可以创建更高级的检查器,它不仅会删除文件,还会查看新一天的文件是否存在,如果存在,它会查看里面的内容,然后仅从 info.log 中删除前几天的日志,但不会一次全部删除)
另一种没有数据边界问题的方法就是使用:
var logger = new (winston.Logger)({
transports: [
new dailyRotateFile(
{
// your definition of rotate file
})
]
});
然后为 info.log 创建一个链接到当天文件的符号链接。最后你可以使用:
transport.on('rotate', function(oldFilename, newFilename) {
fs.symlinkSync(newFilename, 'info.log');
});
旋转时更新符号链接。
如果您的日志文件特别大,这也会节省一些磁盘空间 space。
对于那些可能仍在寻找正确方法的人,此功能已添加到 v.4.1.0。
只需使用 createSymlink
和 symlinkName
选项:
new DailyRotateFile({
...
createSymlink: true,
symlinkName: 'info.log',
});